(轉載請註明出處:http://blog.csdn.net/buptgshengod)
1.背景 今後博主會每周定時更新機器學習演算法及其python的簡單實現。今天學習的演算法是KNN近鄰演算法。KNN演算法是一個監督學習分類器類別的演算法。 什麼是監督學習,什麼又是無監督學習呢。監督學習就是我們知道目標向量的情況下所使用的演算法,無監督學習就是當我們不知道具體的目標變數的情況下所使用的。而監督學習又根據目標變數的類別(離散或連續)分為分類器演算法和迴歸演算法。 k-Nearest Neighbor。k是演算法中的一個約束變數,整個演算法的總體思想是比較簡單的,就是將資料集的特徵值看作是一個個向量。我們給程式一組特徵值,假設有三組特徵值,就可以看做是(x1,x2,x3)。系統原有的特徵值就可以看做是一組組的(y1,y2,y3)向量。通過求兩向量間的距離,我們找出前k個距離最短的y的特徵值對。這些y值所對應的目標變數就是這個x特徵值的分類。公式:
2.python基礎之numpy numpy是python的一個數學計算庫,主要是針對一些矩陣運算,這裡我們會大量用到它。 介紹一下本章代碼中用到的一些功能。
arry:是numpy內建的數組表示,比如本例中的4行2列數字可以這樣輸入
group=array([[9,400],[200,5],[100,77],[40,300]])
shape:顯示(行,列)例:shape(group)=(4,2)
zeros:列出一個相同格式的空矩陣,例:zeros(group)=([[0,0],[0,0],[0,0],[0,0]])
tile函數位於python模組 numpy.lib.shape_base中,他的功能是重複某個數組。比如tile(A,n),功能是將數組A重複n次,構成一個新的數組
sum(axis=1)矩陣每一行向量相加
3.資料集
4.代碼 代碼分三個函數,分別是
建立資料集:
createDataset
from __future__ import divisionfrom numpy import *import operatordef createDataset(): group=array([[9,400],[200,5],[100,77],[40,300]]) labels=['1','2','3','1'] return group,labels
資料歸一化:
autoNorm
def autoNorm(dataSet): minVals = dataSet.min(0) maxVals = dataSet.max(0) ranges = maxVals - minVals normDataSet = zeros(shape(dataSet)) m = dataSet.shape[0] normDataSet = dataSet - tile(minVals, (m,1)) #print normDataSet normDataSet = normDataSet/tile(ranges, (m,1)) #element wise divide # print normDataSet return normDataSet, ranges, minVals
分類函數:
classify
def classify(inX, dataSet, labels, k): dataSetSize = dataSet.shape[0] diffMat = tile(inX, (dataSetSize,1)) - dataSet sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1) distances = sqDistances**0.5 sortedDistIndicies = distances.argsort() classCount={} for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0]
5.顯示結果
6.代碼下載