【火爐煉AI】機器學習029-找到離你最近的鄰居
(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
最近鄰演算法的核心思想是:想要判斷你屬於哪一個類別,先找離你最近的K個鄰居,看看這些鄰居的大部分屬於哪個類別,那麼就可以認為你也屬於這個類別。
所以,根據這種核心思想,有三個重要的因素:距離度量,K的大小和分類規則。在KNN中,當訓練資料集和三要素確定後,相當於將特徵空間劃分為一些子空間。對於距離度量,有很多種方式,常用的是閔可夫斯基距離,其計算公式為:

其中P>=1, 當P=2時,是歐式距離,當p=1時,是曼哈頓距離。
對於K的大小選擇是一個重要的考慮因素,其選擇會對演算法的結果有重大影響。如果K太小,就相當於用較小領域中的訓練例項進行預測,這樣會被噪聲所影響,同時方差比較大,也就是模型的過擬合現象會比較嚴重。如果K太大,就相當於用很多的鄰居來判斷,此時會走向另一個極端,使得模型產生欠擬合現象。
在具體應用中,一般選擇較小K並且K是奇數,通常使用交叉驗證的方法來獲取最合適的K值。
分類規則一般常用多數表決,即大多數例項所屬的類別就認為是新樣本的類別。這個很容易理解。
1. 查詢最近的K個鄰居
下面我們自己用程式碼尋找一個新樣本的K個最近的鄰居,看看這些鄰居們都在哪兒。
# 1,尋找最近的K個鄰居 from sklearn.neighbors import NearestNeighbors # 自定義一些資料集 X = np.array([[1, 1], [1, 3], [2, 2], [2.5, 5], [3, 1], [4, 2], [2, 3.5], [3, 3], [3.5, 4]]) # 畫出這些資料集在平面圖上的分佈情況 plt.scatter(X[:,0],X[:,1],marker='o',color='k') # 一個新樣本 new_sample=np.array([[2.6,1.7]]) plt.scatter(new_sample[:,0],new_sample[:,1],marker='*',color='r') 複製程式碼

上面只是將原始資料集和新樣本的分佈繪製到二維平面上,但是沒有計算其最近的距離和鄰居。下面程式碼是計算過程。
# 構建KNN模型,計算最近的K個數據點 K=3 KNN=NearestNeighbors(n_neighbors=K,algorithm='ball_tree').fit(X) distances,indices=KNN.kneighbors(new_sample) # 列印最近的K個鄰居 for rank, (indices, distance) in \ enumerate(zip(indices[0][:K],distances[0][:K])): print('rank: {} --> {}, distance: {:.3f}'.format(rank, X[index],distance)) 複製程式碼
----------------------------輸---------出--------------------------------
rank: 0 --> [2. 2.], distance: 0.671 rank: 1 --> [3. 1.], distance: 0.806 rank: 2 --> [3. 3.], distance: 1.360
----------------------------------完-------------------------------------
可以看出距離新樣本最近的三個鄰居分別是【2,2】,【3,1】,【3,3】,而且各自的距離也打印出來了。實際上,KNN.kneighbors(new_sample)返回的indices陣列是一個已經排序的陣列,我們只需要從中獲取下標即可。
下面為了方便觀察,將最近的K個鄰居用別的顏色重點標註出來。

########################小**********結###############################
1,想要尋找新樣本最近的K個鄰居,需要首先構建一個KNN模型,然後用資料集訓練該模型。
2,然後使用函式KNN.kneighbors(new_sample)即可得到距離的排序,從這些排序中可以計算出最近的K個鄰居。
#################################################################
注:本部分程式碼已經全部上傳到( ofollow,noindex"> 我的github )上,歡迎下載。
參考資料:
1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯