機器學習 第4篇:sklearn 最鄰近演算法概述

悅光陰發表於2020-11-03

sklearn.neighbors 提供了針對無監督和受監督的基於鄰居的學習方法的功能。監督的基於最鄰近的機器學習演算法是值:對帶標籤的資料的分類和對連續資料的預測(迴歸)。 無監督的最近演算法是許多其他學習方法的基礎,尤其是流形學習(manifold learning)和頻譜聚類(spectral clustering)。

最近鄰方法的原理是找到距離新資料點最近的特定數量的訓練樣本,並從中預測標籤。樣本數可以是使用者定義的常數(knn演算法),也可以基於點的區域性密度而變化(基於半徑的鄰居學習)。 距離通常可以是任何度量標準:標準歐幾里德距離是最常見的選擇,基於鄰居的方法被稱為非通用機器學習方法,因為它們僅“記住”其所有訓練資料(可能轉換為快速索引結構,例如Ball Tree或KD Tree)。

儘管最鄰近演算法十分簡單,但它已成功解決了許多分類和迴歸問題,包括手寫數字和衛星影像場景。作為非引數方法,它通常非常適用於在決策邊界非常不規則的分類情況下。

一,無監督的最鄰近演算法

無監督的最鄰近演算法,用於尋找最鄰近的資料點,是其他最鄰近演算法的基礎。

無監督的最鄰近演算法主要有:BallTree,KDTree和基於sklearn.metrics.pairwise中的例程的brute-force演算法,使用者可以通過關鍵字'algorithm'來制定尋找最鄰近的演算法,該關鍵字的值必須是['auto','ball_tree','kd_tree','brute']之一,當傳遞預設值“ auto”時,演算法會嘗試從訓練資料中確定最佳的方法。 

brute-force 是最原始的計算兩個資料點之間的距離的演算法,該演算法的思想是計算資料集中每兩個資料點之間的距離,找出距離最小的資料點。

K-D Tree:K維度樹(k-dimensional tree),基於樹來查詢距離最小的資料點

Ball Tree:球樹,KD 樹對於低維度 (D<20) 的近鄰搜尋非常快, 當 D 增長到很大時, 效率變低;這就是所謂的 “維度災難” 的一種體現;KD 樹只能處理歐式距離;為了解決 KD 樹在高維上效率低下的問題, ball 樹應運而生,同時 Ball tree 可處理一般的距離。

舉個例子,通過 NearestNeighbors()函式和algorithm來指定尋找最鄰近資料點的演算法:

>>> from sklearn.neighbors import NearestNeighbors
>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X)
>>> distances, indices = nbrs.kneighbors(X)

二,基於最鄰近演算法的分類

基於最鄰近演算法的分類是基於例項的學習,它不嘗試構建通用的內部模型,而只是儲存訓練資料的例項。分類的原理是根據資料點的最鄰近資料的型別的多數來預測該資料點的型別,類似於投票,如果一個資料點附近的資料點的型別大部分都是“A”,那麼模型預測該資料點的型別也是“A”。

scikit-learn實現兩個不同的最近鄰居分類器:

  • KNeighborsClassifier 基於每個查詢點的k個最近鄰居來實現預測,其中,k是指定的整數值。
  • RadiusNeighborsClassifier基於每個訓練點的固定半徑內的鄰居數來實現學習,其中,r是指定的浮點值。

分類器的定義如下,該定義只列出最重要的引數,詳細引數請參考sicikit-learn 官網:

sklearn.neighbors.RadiusNeighborsClassifier(radius=1.0, weights='uniform', algorithm='auto', metric='minkowski',...)
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', metric='minkowski',...)

引數註釋:

  • radius:尋找最鄰近資料點的半徑
  • n_neighbors:最鄰近的鄰居數量
  • algorithm:尋找最鄰近的資料點的演算法,有效值是['auto','ball_tree','kd_tree','brute']
  • metric:計算距離的度量,詳細資訊請檢視:DistanceMetric 
  • weights:權重,預設值weights ='uniform',為每個鄰居分配統一的權重。 weights ='distance'分配的權重與距查詢點的距離成反比。用於也可以提供定義函式來計算權重。在某些情況下,最好對鄰居加權,以使較近的鄰居對擬合的貢獻更大,這可以通過weights關鍵字完成。

三,基於最鄰近演算法的迴歸

基於最鄰近演算法的分類,本質上是對離散的資料標籤進行預測,實際上,最鄰近演算法也可以用於對連續的資料標籤進行預測,這種方法叫做基於最鄰近資料的迴歸,預測的值(即資料的標籤)是連續值,通過計算資料點最臨近資料點平均值而獲得預測值。

scikit-learn實現了兩個不同的最鄰近迴歸模型:

  • KNeighborsRegressor:根據每個查詢點的最鄰近的k個資料點的均值作為預測值,其中,k是使用者指定的整數。
  • RadiusNeighborsRegressor:基於查詢點的固定半徑內的資料點的均值作為預測值,其中r是使用者指定的浮點值。

迴歸模擬器的定義如下,該定義只列出最重要的引數,詳細引數請參考sicikit-learn 官網:

sklearn.neighbors.KNeighborsRegressor(n_neighbors=5, weights='uniform', algorithm='auto', metric='minkowski',...)
sklearn.neighbors.RadiusNeighborsRegressor(radius=1.0, weights='uniform', algorithm='auto', metric='minkowski',...)

最基本的最鄰近迴歸使用統一的權重,也就是說,在特定範圍中的每個資料點對查詢點的分類(迴歸)的作用是相同的。在某些情況下,對權重點進行加權可能會比較有利,以使鄰近的點比遠離的點對迴歸的貢獻更大,這可以通過weights關鍵字完成。預設值weights ='uniform',為所有點分配相等的權重。 weights ='distance'分配的權重與距查詢點的距離成反比。

 

參考文件:

1.6. Nearest Neighbors

K-D Tree

相關文章