分類算法——k最近鄰算法(Python實現)(文末附工程源代碼)


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))

工程源代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM