天天看點

機器學習實戰筆記(一)------K-鄰近算法(KNN)

  1. KNN工作原理:存在這麼一個樣本資料集合,也稱訓練集,在這個資料集合中,我們具體知道每一個資料所屬的類别,也就是标簽。那麼輸入一組沒有标簽的資料後,将新資料的特征與訓練集對應的特征進行比較,然後算法提取訓練集中樣本特征最接近的标簽。一般隻選擇訓練集中最接近的前k個資料,一般k不大于20.
  2. KNN算法的一般流程:
    1. 計算已知類别資料集中的點與目前點的距離;
    2. 按照距離遞增次序排序;
    3. 選取與目前點距離最小的k個點;
    4. 确定前k個點所在類别的出現頻率;
    5. 傳回前k個點出現頻率最高的類别作為目前點的預測分類。
  3. 代碼實作:win10+python3.7
import numpy as np
import operator

# K-鄰近算法
def classify0(inX, dataSet, labels, k):
    # 距離計算
    dataSetSize = dataSet.shape[0]  # 檢視輸入數組的維數
    diffMat = np.tile(inX, (dataSetSize,1)) - dataSet  # 計算輸入與訓練集的差分
    sqDiffMat = diffMat**2  #  計算平方
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5  # 計算根方
    sortedDistIndicies = distances.argsort()  #  按行從小到大傳回下标
    # 選擇距離最小的k個點
    classCount={}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    # 排序
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]
# 建立訓練資料
def createDataSet():
    group = np.array([[1.0, 1.1],[1.0, 1.0],[0, 0],[0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

# 運作
if __name__ == '__main__':
    group, labels = createDataSet()
    result = classify0([1,1],group,labels,3)
    print(result)
           

補充:

(1)由于《機器學習實戰》這本書上的代碼是基于py2的,現在的環境基本都是py3,是以需要略作修改;

(2)shape函數:傳回輸入的矩陣數組的維數,切記一定是矩陣數組,如果是list類型的就不行,如果是list類型的輸入,要用np.array()轉換為矩陣數組後再用shape函數。

(3)tile函數:将輸入的數按照一定的形式輸出。如上面代碼中,輸入的是inX,輸出的形式是(dataSetSize,1)型的矩陣,裡面的元素全為inX。

(4)argsort函數:按行從到大傳回數的下标,如果axis=1,則是按列。