1. 程式人生 > >機器學習實戰--K近鄰演算法實現(一)

機器學習實戰--K近鄰演算法實現(一)

KNN演算法的工作原理為:

存在一個樣本資料的集合,也稱作訓練樣本集合,並且樣本集的每個資料都存在標籤。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似的分類標籤,一般只選擇樣本集中前K個最相似的資料,前K個相似資料中出現次數最多的分類作為新資料的分類。

建立knn.py的檔案,在pycharm的命令列視窗切換到該檔案所在的目錄,輸入Python指令後進入Python命令列,輸入下列命令來匯入模組

K近鄰演算法原始碼:

from numpy import *
import operator
from os import listdir
def classify0(intX,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]#得到訓練集的行數
    #tile的第一個引數表示要複製的陣列,第2引數表示複製後的矩陣規模,及行*要複製陣列列的倍數
    diffmat = tile(intX,(dataSetSize,1))-dataSet
    sqDiffMat = diffmat**2
    #對行求和,得到N*1的陣列也即列向量,axis=0是對行求和
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    #對陣列進行升序排序
    sortedDistIndicies = distances.argsort()
    classCount = {}
    #對前K個距離較小的元素進行遍歷
    for i in range(k):
        #對前k個值的label進行計數
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
    #根據計數值的大小降序排列
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    #返回計數值最多的label值
    return sortedClassCount[0][0]

對未知類別屬性的資料集中的每個點依次執行下列操作:

  1. 計算已知類別資料集中的點與當前點之間的距離;
  2. 按照距離遞增次序排列
  3. 選取與當前點距離最小的k個點
  4. 確定前k個點所在類別出現的頻率
  5. 返回前k個點出現頻率最高的類別作為當前點的預測分類

待預測的輸入向量:intX,訓練樣本集:dataSet,標籤向量:labels,最近鄰居的數目:K

上面的程式清單中使用了歐氏距離來計算兩個向量點xA和xB之間的距離:

{\color{Red} d=\sqrt{\left ( \left ( xA0-xB0 \right ) ^{2}+(xA1-xB1)^{2}\right )}}

程式碼解析:

shape[0]方法用於獲取樣本集的個數

tile函式用行復制的方式將輸入資料擴充套件為相應規模的矩陣。第二個引數為規模元組,元組的第一項表示行數,第二項表示列數相對於第一個引數擴充套件的倍數。如輸入的引數為(0,0),擴充套件後的矩陣如下:

\begin{bmatrix} 0 &0 \\ 0& 0\\ 0& 0\\ 0&0 \end{bmatrix}

然後將該矩陣與訓練集矩陣相減和平方後仍是4*2矩陣,利用sum函式,將axis引數設定成1,進行矩陣的行相加得到4*1的列向量,在開根號得到歐氏距離,再將距離進行升序排序。

classCount字典是用於統計前k個距離最近的鄰居的標籤及對應的個數。利用sorted函式根據item的資料項值進行降序排列,最後返回次數最多的項所對應的標籤,作為預測結果。