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'分配的權重與距查詢點的距離成反比。
參考文檔: