<機器學習實戰(zhàn)筆記>_k-近鄰算法

簡單的說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]為其他值來測試.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容