簡單的說k-近鄰算法是通過測量不同特征值之間的距離進行分類.
優(yōu)點:精度高,對異常值不敏感 無數(shù)據(jù)輸入假定.
缺點:計算復雜度高,空間復雜度高.
適用數(shù)據(jù)范圍:數(shù)值型和標稱型.
它的工作原理:需要有一個樣本數(shù)據(jù)集,也成為訓練樣本集,并且樣本集中每個數(shù)據(jù)都有標簽(有明確的分類信息).輸入沒有標簽的新數(shù)據(jù)后,將新數(shù)據(jù)的每個特征和樣本集中每個數(shù)據(jù)對應的特征進行比較,然后算法提取樣本集中特征最相似數(shù)據(jù)(最近鄰)的分類標簽.一般來說我們只選取樣本數(shù)據(jù)集中前k個最相似的數(shù)據(jù),這就是k-近鄰算法中k的出處,通常k是不大于20的正整數(shù).最后,選擇k個最相似數(shù)據(jù)中出現(xiàn)最多的分類作為新數(shù)據(jù)的分類.
實施分類算法
fromnumpyimport*
importoperator
#《機器學習實戰(zhàn)》k—近鄰算法實現(xiàn)
# numpy是科學計算包,operator是運算符包
#創(chuàng)建數(shù)據(jù)集和標簽
defcreateDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
returngroup,labels
#實施kNN分類算法
# 1.計算已知類別數(shù)據(jù)集中的點與當前點之間的距離
# 2.按照距離遞增次序排序
# 3.選取與當前點距離最近的k個點
# 4.確定k個點所在類別的出現(xiàn)頻率
# 5.返回k個點中出現(xiàn)頻率最高的類別作為當前點的預測分類
defclassify0(inX,dataSet,labels,k):
#獲取訓練樣本集的行數(shù)
dataSetSize = dataSet.shape[0]
#距離計算? 使用歐式計算√(a0 - b0)^2 + (a1 - b1)^2
diffMat = tile(inX,(dataSetSize,1)) - dataSet
sqDiffMat = diffMat **2
sqDistances = sqDiffMat.sum(axis=1)
#選擇距離最小的k個點
distances = sqDistances **0.5
sortedDistIndicies = distances.argsort()
classCount = {}
foriinrange(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) +1
#排序
# Python3.5中:iteritems變?yōu)閕tems
sortedClassCount =sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
returnsortedClassCount[0][0]
這是用Python實現(xiàn)的k-近鄰算法 ,windows下在cmd命令窗下可以執(zhí)行.
把路徑切換到該.py文件路徑下,cmd中輸入python進入Python交互模式,然后輸入下面的命令導入編輯的程序模塊(kNN是上面模塊的文件名):
import kNN
然后創(chuàng)建訓練樣本集:
group,labels = kNN.createDataSet()
預測數(shù)據(jù)所在分類:
kNN.classify0([0,0], group, labels, 3)
輸出結(jié)果應該是'B',也可以改變輸入[0,0]為其他值來測試.