02-18 scikit-learn庫之k近鄰算法

[TOC] 更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:<a target="_blank" href="https://www.cnblogs.com/nickchen121/p/11686958.html">http://www.javashuo.com/article/p-vozphyqp-cm.html</a>html

scikit-learn庫之k近鄰算法

因爲k近鄰能夠作迴歸又能夠作分類,因此最普通的k近鄰算法在scikit-learn庫中有兩種實現,即KNeighborsClassifier和KNeighborsRegressor;上次講到了k近鄰的兩個擴展限定半徑k近鄰,所以該方法在scikit-learn中也有兩種實現,即RadiusNeighborsClassifier和RadiusNeighborsRegressor;k近鄰還有一種擴展,即最近質心分類算法NearestCentroid。python

接下來將會討論這五者的區別,因爲是從官方文檔翻譯而來,翻譯會略有偏頗,有興趣的也能夠去scikit-learn官方文檔查看https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neighbors算法

1、KNeighborsClassifier

1.1 使用場景

KNeighborsClassfier模型就是最普通的k近鄰算法,能夠經過參數控制使用高斯距離、kd樹、球樹找到實例的$k$個近鄰。數據結構

1.2 代碼

from sklearn.neighbors import KNeighborsClassifier
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=3, p=2,
           weights='uniform')
print(neigh.predict([[1.1]]))
[0]
print(neigh.predict_proba([[0.9]]))
[[0.66666667 0.33333333]]

1.3 參數詳解

  • n_neighbors:$k$值選擇,int類型。通常選擇一個較小的$k$值,而後經過交叉驗證選擇一個較好的$k$值。默認爲5。
  • **weights:**近鄰權重,str類型。若是weights='uniform',則意味着全部近鄰的權重都同樣;若是weights='distance',則意味着權重和距離成反比,即距離目標點更近的點有更高的權重;能夠自定定義函數自定義權重,輸入是距離值,輸出是權重值。默認爲'uniform'。
  • **algorithm:**算法實現,str類型。若是algorithm='brute',即最原始的k近鄰算法,計算出全部點與點之間的距離;若是algorithm='kd_tree',即kd樹實現;若是algorithm='ball_tree',即球樹實現;若是algorithm='auto',則模型會選擇一個擬合最好的算法。若是樣本特徵少,使用'auto'便可;若是數據量大或者樣本特徵多,推薦使用kd樹以後再嘗試球樹,如此作能夠提升準確度;若是輸入的樣本特徵是稀疏的時候,scikit-learn始終會自行選擇'brute'實現。默認爲'auto'。
  • **leaf_size:**葉子節點閾值,int類型。只有當algorithm={'kd_tree','ball_tree'}時該參數才生效,這個值越小,則生成的kd樹或球樹層數越大,建樹時間越長,泛指層數越小,建樹時間短。若是樣本數量過大,則必須得增大該值,由於樹的層數越大,則樹越容易過擬合,推薦使用交叉驗證選擇一個較優值。默認爲30。
  • **p:**距離度量附屬參數,int類型。只有當metric='minkowski'時該參數才生效,p=1時爲曼哈頓距離,p=2時爲歐氏距離。默認爲2。
  • **metric:**距離度量類型,str類型。metric='euclidean'爲歐氏距離;metric='manhattan'爲曼哈頓距離;metric='chebyshev'爲切比雪夫距離;metric='minkowski'爲閔可夫斯基距離;metric='wminkowski'爲帶權重閔可夫斯基距離;metric='seuclidean'爲標準化歐氏距離;metric='mahalanobis'爲馬氏距離,一般狀況下默認的metric='minkowski'+p=2即歐式距離就能夠知足大多數業務的需求。默認爲'minkowski'。
  • **metric_params:**距離度量附屬參數,dict類型。如帶權重閔可夫斯基距離的參數,通常不會用到。
  • **n_jobs:**並行數,int類型。n_jobs=1使用1個cpu運行程序;n_jobs=2,使用2個cpu運行程序;n_jobs=-1,使用全部cpu運行程序。默認爲1。

1.4 方法

  • **fit(X,y):**把數據放入模型中訓練模型。
  • **get_params([deep]):**返回模型的參數,能夠用於Pipeline中。
  • **predict(X):**預測樣本X的分類類別。
  • **predict_proba(X):**返回樣本X在各個類別上對應的機率。
  • **score(X,y[,sample_weight]):**基於報告決定係數$R^2$評估模型。
  • **set_prams(**params):**建立模型參數。

1.4.1 kneighbors([X, n_neighbors, return_distance])

找到某個點的n_neighbors個近鄰。機器學習

# 爲方便測試接下來的方法測試咱們將經過最近鄰模型演示
samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(n_neighbors=1)
neigh.fit(samples)
NearestNeighbors(algorithm='auto', leaf_size=30, metric='minkowski',
         metric_params=None, n_jobs=None, n_neighbors=1, p=2, radius=1.0)
print(neigh.kneighbors([[1., 1., 1.]]))
(array([[0.5]]), array([[2]]))
X = [[0., 1., 0.], [1., 0., 1.]]
neigh.kneighbors(X, return_distance=False)
array([[1],
       [2]])

1.4.2 kneighbors_graph([X, n_neighbors, mode])

計算樣本X的n_neighbors個近鄰的權重,能夠返回距離或者矩陣關係圖。ide

X = [[0], [3], [1]]
from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(n_neighbors=2)
neigh.fit(X) 
A = neigh.kneighbors_graph(X)
A.toarray()
array([[1., 0., 1.],
       [0., 1., 1.],
       [1., 0., 1.]])

2、KNeighborsRegressor

KNeighborsRegressor模型相似於KNeighborsClassifier模型,不一樣的是兩個模型找到$k$個近鄰的時候KNeighborsClassifier模型使用了多數表決發選擇類別,而KNeighborsRegressor模型使用了對$k$近鄰去平均數或者中位數的方法獲得預測值。函數

3、RadiusNeighborsClassifier

RadiusNeighborsClassifier模型相似KNeighborsClassifier模型,不一樣之處在於RadiusNeighborsClassifier模型少了兩個參數n_neighborsn_jobs,多了兩個參數:學習

  • radius半徑大小,float類型。即選擇半徑大小的參數。默認爲1。
  • outlier_label,異常點類別,str類型。即假設限定半徑後,目標點半徑內沒有近鄰時該選擇哪一個類別做爲輸出。默認爲None,不建議使用默認值。

4、RadiusNeighborsRegressor

RadiusNeighborsRegressor模型相似於RadiusNeighborsRegressor模型,不一樣之處在於少了參數outlier_label,而且二者在獲得$k$個近鄰後處理的方式不一樣。測試

5、NearestCentroid

NearestCentroid模型是基於最近質心分類算法實現的,因爲只有metric距離度量參數和shrink_threshold特徵距離閾值兩個參數,很少贅述。網站

相關文章
相關標籤/搜索