機器學習實戰--K近鄰演算法實現(一)
阿新 • • 發佈:2018-12-14
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]
對未知類別屬性的資料集中的每個點依次執行下列操作:
- 計算已知類別資料集中的點與當前點之間的距離;
- 按照距離遞增次序排列
- 選取與當前點距離最小的k個點
- 確定前k個點所在類別出現的頻率
- 返回前k個點出現頻率最高的類別作為當前點的預測分類
待預測的輸入向量:intX,訓練樣本集:dataSet,標籤向量:labels,最近鄰居的數目:K
上面的程式清單中使用了歐氏距離來計算兩個向量點xA和xB之間的距離:
程式碼解析:
shape[0]方法用於獲取樣本集的個數
tile函式用行復制的方式將輸入資料擴充套件為相應規模的矩陣。第二個引數為規模元組,元組的第一項表示行數,第二項表示列數相對於第一個引數擴充套件的倍數。如輸入的引數為(0,0),擴充套件後的矩陣如下:
然後將該矩陣與訓練集矩陣相減和平方後仍是4*2矩陣,利用sum函式,將axis引數設定成1,進行矩陣的行相加得到4*1的列向量,在開根號得到歐氏距離,再將距離進行升序排序。
classCount字典是用於統計前k個距離最近的鄰居的標籤及對應的個數。利用sorted函式根據item的資料項值進行降序排列,最後返回次數最多的項所對應的標籤,作為預測結果。