kNN算法原理
k最近鄰(k-Nearest Neighbor)算法是比較簡單的機器學習算法。它采用測量不同特征值之間的距離方法進行分類,思想很簡單:如果一個樣本在特征空間中的k個最近鄰(最相似)的樣本中大多數屬於某一個類別,則該樣本也屬於這個類別。
kNN算法的步驟
第一階段:確定k值(指最近的鄰居的個數),一般是一個奇數
第二階段:確定距離度量公式。文本分類一般使用夾角余弦,得出待分類數據點和所有已知類別的樣本點,從中選擇距離最近的k個樣本:
第三階段:統計這k個樣本點鍾各個類別的數量
kNN算法的Python實現
第一階段:可以利用NBayes中的初始化Nbayes_lib.py,點擊這里查看
第二階段:實現夾角余弦的距離公式
from numpy import *
import operator
from Nbayes_pre import *
k=3
#夾角余弦距離公式
def cosdist(vector1,vector2):
return dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2))
第三階段:kNN實現分類器
#kNN分類器
#測試集 testdata,訓練集 trainSet,類別標簽 listClasses,k k個鄰居數
def classify(testdata,trainSet,listClasses,k):
dataSetSize=trainSet.shape[0]#返回樣本集的行數
distances=array(zeros(dataSetSize))
for indx in xrange(dataSetSize):
distances[indx]=cosdist(testdata,trainSet[indx])
#根據生成的夾角余弦從大到小排序,結果為索引號
sortedDistIndicies=argsort(-distances)
classCount={}
#獲取角度最小的前k項作為參考項
for i in range(k):
votelIlabel=listClasses[sortedDistIndicies[i]]#按排序順序返回樣本集對應的類別標簽
classCount[votelIlabel]=classCount.get(votelIlabel,0)+1#為字典classCount按value重新排序
#對分類字典classCount按value重新排序
#sorted(data.iteritems(),key=operator.itemgetter(1),reverse=True)
#該句是按字典值排序的固定用法
#classCount.iteritems():字典迭代器
#key:排序參數;operator.itemgetter(1):多級排序
sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reversed=True)
return sortedClassCount[0][0]#返回序最高的一項
#評估分類結果
dataSet,listClasses=loadDataSet()
nb=NBayes()
nb.train_set(dataSet,listClasses)
#使用之前貝葉斯分類階段的數據集及生成的TF向量進行分類
print (classify(nb.tf[3],nb.tf,listClasses,k))
工程源代碼
