1. 程式人生 > >機器學習實戰(Machine Learning in Action)學習筆記————02.k-鄰近演算法(KNN)

機器學習實戰(Machine Learning in Action)學習筆記————02.k-鄰近演算法(KNN)

機器學習實戰(Machine Learning in Action)學習筆記————02.k-鄰近演算法(KNN)

關鍵字:鄰近演算法(kNN: k Nearest Neighbors)、python、原始碼解析、測試
作者:米倉山下
時間:2018-10-21
機器學習實戰(Machine Learning in Action,@author: Peter Harrington)
原始碼下載地址:https://www.manning.com/books/machine-learning-in-action
[email protected]:pbharrin/machinelearninginaction.git

*************************************************************
一、鄰近演算法(KNN)

原理:存在一個樣本資料集合(訓練樣本),並且樣本集中每個資料都存在標籤(知道每個樣本所屬類別),輸入沒有標籤的新資料(測試資料),將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料(最鄰近)的分類標籤,一般只選擇k個最相似的資料,通常k不超過20的整數,最後選擇k個最相似資料中出現次數最多的分類,作為新資料的分類。

#KNN實現函式
Input:inX: 待分類資料向量(1xN); dataSet:已知分類的m條資料集(NxM);labels:資料類別標籤(1xM vector);k:KNN的最鄰近資料個數閾值
Output:最可能的類別標籤

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={} for i in range(k): #計算k個數據中,各類別出現的次數 voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 sortedClassCount
= sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)#排序 return sortedClassCount[0][0] #返回出現次數最多的類別

*************************************************************
二、kNN.py中其他方法

classify0----KNN實現函式
createDataSet----建立測試資料集,4×2,兩個特徵,四條資料;標籤為1×4,對應為類別
file2matrix----讀取資料建立為32×32的矩陣,用來處理手寫體數字識別的資料處理,將文字檔案中的資料處理成矩陣。
autoNorm----歸一化函式:(value-minValue)/(maxValue-minValue),將傳入的資料集進行歸一化處理,歸一化將所有特徵的取值壓縮到0-1之間(或-1到1之間),可以消除不同特徵取值在不同數量級所造成的不同特徵重要性不均等的情況。

#約會資料測試
datingClassTest----已完成分類的資料為datingTestSet2.txt中。
資料說明:前三列為特徵——每年獲得的飛行常客里程數,玩視訊遊戲所耗時間百分比,每週消費冰淇淋公升數;最後一類為類別——不喜歡的人,魅力一般的人,極具魅力的人。
通過hoRatio來控制訓練和測試資料比例,classifierResult為測試所得的類別,方法中還通過與真實類別比較,然後統計錯誤率和錯誤數
------------------------------------------------------------
#手寫體數字識別(0-9)
handwritingClassTest----手寫體識別數字示例,已知類別(0-9十個數字)資料,已經處理成32×32的0-1矩陣資料。
資料說明:訓練資料位於trainingDigits資料夾內,裡面的文字檔案命名規則為:"_"之前為該檔案實際對應的數字;每個檔案裡面為32×32的矩陣,通過0-1來表示對應的資料

img2vector----2×32的0-1矩陣資料檔案讀取後轉換為1×1024的向量

------------------------------------------------------------
測試:
import kNN
>>> kNN.datingClassTest()#約會資料測試
the classifier came back with: 3, the real answer is: 3
the classifier came back with: 2, the real answer is: 2
the classifier came back with: 1, the real answer is: 1
the classifier came back with: 1, the real answer is: 1
                        ……
the classifier came back with: 1, the real answer is: 1
the classifier came back with: 1, the real answer is: 1
the classifier came back with: 2, the real answer is: 2
the total error rate is: 0.064000
32.0

>>> kNN.handwritingClassTest()#手寫體數字識別(0-9)
the classifier came back with: 9, the real answer is: 9
the classifier came back with: 9, the real answer is: 9
                        ……
the classifier came back with: 9, the real answer is: 9
the classifier came back with: 9, the real answer is: 9

the total number of errors is: 11

the total error rate is: 0.011628

*************************************************************
三、利用matplotlib繪製散點圖

python createFirstPlot.py

(圖datingTestSet2)
python createDist2.py

(圖createDist2)
*************************************************************

總結:方法無法持久化,每次測試都要計算一遍