前言
K最近鄰(k-Nearest Neighbor,KNN)分類算法,是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。該方法的思路是:在特徵空間中,如果一個樣本附近的k個最近(即特徵空間中最鄰近)樣本的大多數屬於某一個類別,則該樣本也屬於這個類別。。
一、KNN的基本思路
所謂K近鄰算法,即是給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的K個實例, 這K個實例的多數屬於某個類,就把該輸入實例分類到這個類中。並不是很複雜,十分易於理解。主要的算法思路也就分為3步。
從測試集中選擇一個樣本,分別計算該樣本和訓練集中各樣本的距離(本文選擇歐氏距離)。
對選取的測試集樣本與各訓練集樣本的距離記錄排序,找到距離最小的k個距離。以距離平方的倒數為權重,對這k個樣本的標籤進行加權投票,得到該測試集樣本的標籤。
循環對測試集樣本進行上述兩步操作。
二、代碼實現
程序部分主要有5個部分:
read_xslx(xslx_path) #讀取excel文件
standardization(v,mu,sigma) #對一個數據規範化
standardize(data) #對數據集規範化
calDistance(testingrow, trainingrow) #計算樣本間距離
KNN(trainingData, testingData, k) #KNN算法部分
分類結果
需要注意,KNN算法中K的選擇對算法的分類效果有著明顯影響。
選擇K=4時,生成的混淆矩陣:
[[46 0 17]
[ 1 30 2]
[22 1 81]]
可視化結果如下:
如果改變K的取值,混淆矩陣會明顯改變,如下所示:
k=3:
k=5:
k=6:
k=8:
k=9:
總結
本文利用KNN算法所得分類結果並不是很佳,無法很準確地分辨「0」類和「2」類,如果選擇其他的度量方式來獲取樣本間距離,或是採用其他對數據的標準化方法可能可以有所改善。但KNN算法本身是一個比較簡單粗暴的方法,還是能起到初步的分類效果的。