這個算法主要工作是測量不同特征值之間的距離,有個這個距離,就可以進行分類了。簡稱kNN。
簡單說明
這個算法主要工作是測量不同特征值之間的距離,有個這個距離,就可以進行分類了。
簡稱kNN。
已知:訓練集,以及每個訓練集的標簽。
接下來:和訓練集中的數據對比,計算最相似的k個距離。選擇相似數據中最多的那個分類。作為新數據的分類。
python實例
代碼如下:
#-*-coding:cp936-*-
#win系統中應用cp936編碼,linux中最好還是utf-8比較好。
fromnumpyimport*#引入科學計算包
importoperator#經典python函數庫。運算符模塊。
#創建數據集
defcreateDataSet():
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['A','A','B','B']
returngroup,labels
#算法核心
#inX:用于分類的輸入向量。即將對其進行分類。
#dataSet:訓練樣本集
#labels:標簽向量
defclassfy0(inX,dataSet,labels,k):
#距離計算
dataSetSize=dataSet.shape[0]#得到數組的行數。即知道有幾個訓練數據
diffMat=tile(inX,(dataSetSize,1))-dataSet#tile:numpy中的函數。tile將原來的一個數組,擴充成了4個一樣的數組。diffMat得到了目標與訓練數值之間的差值。
sqDiffMat=diffMat**2#各個元素分別平方
sqDistances=sqDiffMat.sum(axis=1)#對應列相乘,即得到了每一個距離的平方
distances=sqDistances**0.5#開方,得到距離。
sortedDistIndicies=distances.argsort()#升序排列
#選擇距離最小的k個點。
classCount={}
foriinrange(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
#排序
sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
returnsortedClassCount[0][0]
意外收獲
把自己寫的模塊加入到python默認就有的搜索路徑:在python/lib/-packages目錄下建立一個xxx.pth的文件,寫入自己寫的模塊所在的路徑即可。
更多信息請查看IT技術專欄