機器學習-11-k近鄰演算法

pyorz發表於2020-10-29

給定一個資料集,對新的輸入樣本,在資料集中找到與新的輸入樣本距離最近的k個樣本,將這k個樣本中最多數屬於某個類的那個類別當作新的輸入樣本的類別。
在這裡插入圖片描述

距離度量

  • 歐式距離: D = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 D=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2} D=(x2x1)2+(y2y1)2
  • 曼哈頓距離: D = ∣ x 2 − x 1 ∣ + ∣ y 2 − y 1 ∣ D=|x_2-x_1|+|y_2-y_1| D=x2x1+y2y1
  • 餘弦值

實現

K近鄰最簡單的實現就是直接遍歷整個資料集,叫線性掃描(linear scan),但是這樣的話,需要將輸入的樣本和資料集中每個樣本進行度量距離,如果資料集很大的話,計算是非常耗時的。所以比較常見的是KD樹。

程式碼

np.tile

from numpy import tile
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    #距離計算
    diffMat = tile(inX, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2      #平方
    sqDistances = sqDiffMat.sum(axis=1)     #根號下平方相加
    distances = sqDistances**0.5    #根號
    sortedDistIndicies = distances.argsort()    #排序
    classCount={}
    #選擇距離最小的k個點
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
        #排序,將classCount字典分解為元祖列表,匯入itemgeeter方法,按照第二個元素的次序對元祖進行排序
        #此處排序為逆序,即從大到小排序,最後返回發生頻率最高的元素標籤。
        sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
        return sortedClassCount[0][0]
    # 為預測資料所在分類:kNN.classify0([0,0], group, labels, 3)

相關文章