sklearn.neighbors.KNeighborsClassifier的k-近鄰算法使用介紹


class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, 
p=2, metric=’minkowski’,
metric_params=None, n_jobs=None, **kwargs)

Source code:https://github.com/scikit-learn/scikit-learn/blob/1495f6924/sklearn/neighbors/classification.py#L23

1,KNeighborsClassifier參數介紹

n_neighbors: int,默認值為5

  表示k-nn算法中選取離測試數據最近的k個點,

weight: str or callable,默認值為uniform

  表示k近鄰點都分類結果的影響,一般的情況下是選取k近鄰點中類別數目最多的作為分類結果,這種情況下默認k個點的權重相等,但在很多情況下,

  k近鄰點權重並不相等,可能近的點權重大,對分類結果影響大。

  默認值為uniform,還可以是distance和自定義函數

  • 'uniform':表示所有點的權重相等
  • 'distance':表示權重是距離的倒數,意味着k個點中距離近的點對分類結果的影響大於距離遠的點
  • [callable]:用戶自定義函數,接受一個距離數組,返回一個同維度的權重數

algorithm:{'ball_tree','kd_tree','brute','auto'}

  計算找出k近鄰點的算法

  • 'ball_tree':使用BallTree維數大於20時建議使用
  • 'kd_tree':使用KDTree,原理是數據結構的二叉樹,以中值為划分,每個節點是一個超矩形,在維數小於20是效率高
  • 'brute':暴力算法,線性掃描
  • 'auto':自動選取最合適的算法

  note:在稀疏的輸入數據上擬合,將使用'brute'覆蓋此參數

leaf_size:int,默認值為30

  用於構造BallTree和KDTree

  leaf_size參數設置會影響樹構造的樹構造和詢問的速度,同樣也會影響樹存儲需要的內存,這個值的設定取決於問題本身

p:int,默認值為2

  • 1:使用曼哈頓距離進行度量
  • 2:使用歐式距離進行度量

metric string or callable, 默認使用'minkowski'(閔可夫斯基距離),度量函數

 

  其中p是一個變參數,也就是上一個介紹的參數p

  當p=1時,就是曼哈頓距離

  當p=2時,就是歐氏距離

  當p→∞時,就是切比學夫距離

metric_params dict, 默認為None

  度量函數的其他關鍵參數,一般不用設置

n_jobs int or None, 默認None

  用於搜索k近鄰點並行任務數量,-1表示任務數量設置為CPU的核心數,即CPU的所有core都並行工作,不會影響fit(擬合)函數

 

注意:關於如何選擇algorithm 和 leaf_size參數,請查看Nearest Neighborsi的在線文檔。

警告:根據Nearest Neighbors算法,如果找到兩個鄰居,例如鄰居k+1和k,他們有着一樣的距離但是不一樣的標簽,最后的結果會根據訓練數據的順序來決定。

https://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm

fit(self, X, y) 使用X作為訓練集作為便簽集,來擬合模型
get_params(self[, deep]) 獲得估計器的參數
kneighbors(self[, X, n_neighbors, …]) 查找X數組X數組中所有點的K鄰居點
kneighbors_graph(self[, X, n_neighbors, mode]) 計算X中每個點的K鄰居權重圖
predict(self, X) 預測X數據集中每個點對應的標簽
predict_proba(self, X) 返回X數據集中對應每個標簽的概率估計值
score(self, X, y[, sample_weight]) 返回給定數據集和標簽的平均准確率 
set_params(**params)  設置估計器的參數

 

 

  

  

 

 

 

 

 

__init__(self, n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=None, **kwargs)

[source]

 

fit(selfXy)

使用X作為訓練集,y作為標簽集,擬合模型

參數

X:{類似數組,稀疏矩陣,BallTree,KDTree}

  訓練集:如果是數組或者矩陣,形狀為[n_samples, n_features],如果參數metric='precomputed',形狀為[n_samples, n_samples]

y:{類似數組,稀疏矩陣}

  標簽集:形狀為[n_samples]或者[n_samples, n_outputs]

 

get_params(selfdeep=True)

獲取估計器的參數

參數

deep:boolean,可選

  如果為True,返回估計器的參數,以及包含子估計器

 

返回值

Returns:mapping of string to any

  返回Map變量,內容為[參數值:值, 參數值:值, ...] 

 

kneighbors(X=None,n_neighbors=None,return_distance=True)

查詢X數組中的K鄰居點,返回每個點的下標和查詢點和鄰居點之間的距離

參數:

X:類型數組,形狀為 (n_query, n_features),如果參數metric == ‘precomputed’形狀為(n_query, n_indexed) 

  在沒有提供查詢點的情況下,則返回有下標點的鄰居們,這種情況下,沒有考慮查詢點的鄰居們

n_neighbors:int

  返回的鄰居點的個數(默認使用改造器是設定的n_neighbors值

return_distance:boolean,可選。 默認為True 

  如果為False,距離值就不會返回

 

返回值:

Returns:

  dist:數組

    當return_distance=True是,返回到每個近鄰點的距離

  ind:數組

    返回近鄰點的下標

 例子

在下面例子中,我們從給定數據集中構建一個NeighborsClassifier類,並詢問哪個點最接近[1, 1, 1]

from sklearn.neighbors import NearestNeighbors
samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
neigh = NearestNeighbors(n_neighbors=1)
neigh.fit(samples)
print(neigh.get_params())
print(neigh.kneighbors([[1., 1., 1.]]))

{'algorithm': 'auto', 'leaf_size': 30, 'metric': 'minkowski', 'metric_params': None, 'n_jobs': None, 'n_neighbors': 1, 'p': 2, 'radius': 1.0}
(array([[0.5]]), array([[2]], dtype=int64))

 

因為n_neighbors=1,所有只返回一個點的數據[[0.5]]意味着近鄰點與查詢點的距離為0.5,而[[2]]意味着這個近鄰點的下標,同樣你也可以查詢多個點

X = [[0., 1., 0.], [1., 0., 1.]]
print(neigh.kneighbors(X, return_distance=False))

[[1],[2]]

 [[1],[2]]表示,第一個查詢點的近鄰點下標為1,同樣第二個查詢點的近鄰點下標為2

 

kneighbors(selfX=Nonen_neighbors=Nonereturn_distance=True)

計算X數組中每個點的k鄰居權重圖

參數:

  X:類似數組,形狀為 (n_query, n_features),如果參數metric == ‘precomputed’,形狀為 (n_query, n_indexed)

    一個或者多個查詢點,如果沒有提供,則返回每個有下標的鄰居們

  n_neighbors int

    每個查詢的鄰居數量(默認使用擬合時設置的n_neighbors)
  mode {‘connectivity’, ‘distance’}, 可選

    返回矩陣類型:'connectivity',返回0和1組成的矩陣,'distance',返回點與點之間的歐幾里得距離

返回值:

  A:CSR格式的稀疏矩陣,形狀為[n_samples, n_samples_fit]

    n_samples是擬合過程中樣例的數量,A[i, j]是i到j的權重

 關聯:kneighbors_graph

 

from sklearn.neighbors import NearestNeighbors
X = [[0], [3], [1]]
neigh = NearestNeighbors(radius=1.5)
neigh.fit(X)
A = neigh.radius_neighbors_graph(X)
print(A.toarray())

[[1. 0. 1.]
[0. 1. 0.]
[1. 0. 1.]]

 

predict(selfX)

預測提供的數據對應的類別標簽

參數:

  X:類似數組,形狀為(n_query, n_features),如果參數metric == 'precomputed',形狀為(n_query, n_indexed) 

    待測試數據

返回值:

  y:形狀為[n_samples]或者為[n_samples, n_outputs]

    每個待測試樣例的類別標簽

predict_proba(selfX)

預測X中每個測試樣例對應每個類別的概率估計值

參數:

  X:類似數組,形狀為(n_query, n_features),如果參數metric == 'precomputed',形狀為(n_query, n_indexed) 

    帶測試樣例

返回值:

  p:形狀為[n_samples, n_classes],或者n_outputs列表

    輸出每個樣例對於每個類別的概率估計值,類別按照字典順序排序

from sklearn.neighbors import KNeighborsClassifier
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y)
print(neigh.predict([[1.1]]))
print(neigh.predict_proba([[1.1]]))

[0]
[[0.66666667 0.33333333]]

 

解釋:[0]表示預測[1.1]屬於類型0,而[[0.66666667 0.33333333]]表示[1,1]屬於類型0的概率為0.66666667,屬於類型1的概率為0.33333333

 

score(selfXysample_weight=None)

返回給定測試集和標簽的平均准確度。在多標簽分類中,返回各個子集的准確度

參數:

  X:類似數組,形狀為 (n_samples, n_features)

    測試數據
  y:類似數組,形狀為(n_samples)或者(n_samples, n_outputs)

    X對應的正確標簽

  sample_weight : 類似數組,形狀為[n_samples], 可選    

    樣例的權重

返回值:

  score float

    self.predict(X)關於y的平均准確率

from sklearn.neighbors import KNeighborsClassifier
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y)
print(neigh.predict([[1.1], [2.1], [3.1]]))
print(neigh.score([[1.1], [2.1], [3.1]], [0, 1, 0]))

[0 1 1]
0.6666666666666666

 

 可以看出3個測試數據,預測類別有2個正確,1個錯誤,所有准確率為0.6666666666666666

 

set_params(self**params)

設置估計器的參數

這個方法不僅對於單個估計器,而且對於嵌套對象(類如管道)都有效,而嵌套對象有着<component>__<parameter>形式的參數,所以可以更新嵌套對象的每個參數

返回值:

  self

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM