# 1.6. 最近鄰
校驗者:
[@Veyron C](https://github.com/caopeirui)
[@舞空](https://github.com/pan8664716)
翻譯者:
[@那伊抹微笑](https://github.com/wangyangting)
[`sklearn.neighbors`](classes.html#module-sklearn.neighbors "sklearn.neighbors") 提供了 neighbors-based (基于鄰居的) 無監督學習以及監督學習方法的功能。 無監督的最近鄰是許多其它學習方法的基礎,尤其是 manifold learning (流行學習) 和 spectral clustering (譜聚類)。 受監督的 neighbors-based (基于鄰居的) 學習分為兩種: [classification](#classification) (分類)針對的是具有離散標簽的數據,[regression](#regression) (回歸)針對的是具有連續標簽的數據。
最近鄰方法的原理是從訓練樣本中找到與新點在距離上最近的預定數量的幾個點,并從這些點中預測標簽。 這些點的數量可以是用戶自定義的常量(K-最近鄰學習), 頁可以根據不同的點的局部密度(基于半徑的最近鄰學習)。距離通常可以通過任何方式來度量: standard Euclidean distance(標準歐式距離)是最常見的選擇。Neighbors-based(基于鄰居的)方法被稱為 *非泛化* 機器學習方法, 因為它們只是簡單地”記住”了其所有的訓練數據(可能轉換為一個快速索引結構,如 [Ball Tree](#ball-tree) 或 [KD Tree](#kd-tree))。
盡管它很簡單,但最近鄰算法已經成功地適用于很多的分類和回歸問題,例如手寫數字或衛星圖像的場景。 作為一個 non-parametric(非參數化)方法,它經常成功地應用于決策邊界非常不規則的情景下。
[`sklearn.neighbors`](classes.html#module-sklearn.neighbors "sklearn.neighbors") 可以處理 Numpy 數組或 scipy.sparse 矩陣作為其輸入。 對于密集矩陣,大多數可能距離的矩陣都是支持的。對于稀疏矩陣,支持搜索任意的 Minkowski 度量。
許多學習方法都是依賴最近鄰作為核心。 一個例子是 [核密度估計](density.html#kernel-density) , 在 [密度估計](density.html#density-estimation) 章節中有更深入的討論。
## 1.6.1. 無監督最近鄰
[`NearestNeighbors`](generated/sklearn.neighbors.NearestNeighbors.html#sklearn.neighbors.NearestNeighbors "sklearn.neighbors.NearestNeighbors") (最近鄰)實現了 unsupervised nearest neighbors learning(無監督的最近鄰學習)。 它為三種不同的最近鄰算法提供統一的接口:[`BallTree`](generated/sklearn.neighbors.BallTree.html#sklearn.neighbors.BallTree "sklearn.neighbors.BallTree"), [`KDTree`](generated/sklearn.neighbors.KDTree.html#sklearn.neighbors.KDTree "sklearn.neighbors.KDTree"), 還有基于 [`sklearn.metrics.pairwise`](classes.html#module-sklearn.metrics.pairwise "sklearn.metrics.pairwise")的 brute-force 算法。選擇算法時可通過關鍵字 `'algorithm'` 來控制, 并必須是 `['auto', 'ball_tree', 'kd_tree', 'brute']` 其中的一個。當默認值設置為 `'auto'`時,算法會嘗試從訓練數據中確定最佳方法。有關上述每個選項的優缺點,參見 [`Nearest Neighbor Algorithms`\_](#id13) 。
> Warning
>
> 關于最近鄰算法,如果鄰居  和鄰居  具有相同的距離,但具有不同的標簽, 結果將取決于訓練數據的順序。
### 1.6.1.1. 找到最近鄰
為了完成找到兩組數據集中最近鄰點的簡單任務, 可以使用 [`sklearn.neighbors`](classes.html#module-sklearn.neighbors "sklearn.neighbors") 中的無監督算法:
```
>>> 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)
>>> indices
array([[0, 1],
[1, 0],
[2, 1],
[3, 4],
[4, 3],
[5, 4]]...)
>>> distances
array([[ 0. , 1. ],
[ 0. , 1. ],
[ 0. , 1.41421356],
[ 0. , 1. ],
[ 0. , 1. ],
[ 0. , 1.41421356]])
```
因為查詢集匹配訓練集,每個點的最近鄰點是其自身,距離為0。
還可以有效地生成一個稀疏圖來標識相連點之間的連接情況:
```
>>> nbrs.kneighbors_graph(X).toarray()
array([[ 1., 1., 0., 0., 0., 0.],
[ 1., 1., 0., 0., 0., 0.],
[ 0., 1., 1., 0., 0., 0.],
[ 0., 0., 0., 1., 1., 0.],
[ 0., 0., 0., 1., 1., 0.],
[ 0., 0., 0., 0., 1., 1.]])
```
我們的數據集是結構化的,因此附近索引順序的點就在參數空間附近,從而生成了近似 K-nearest neighbors(K-近鄰)的塊對角矩陣。 這種稀疏圖在各種情況下都很有用,它利用點之間的空間關系進行無監督學習:特別地可參見 [`sklearn.manifold.Isomap`](generated/sklearn.manifold.Isomap.html#sklearn.manifold.Isomap "sklearn.manifold.Isomap"), [`sklearn.manifold.LocallyLinearEmbedding`](generated/sklearn.manifold.LocallyLinearEmbedding.html#sklearn.manifold.LocallyLinearEmbedding "sklearn.manifold.LocallyLinearEmbedding"), 和 [`sklearn.cluster.SpectralClustering`](generated/sklearn.cluster.SpectralClustering.html#sklearn.cluster.SpectralClustering "sklearn.cluster.SpectralClustering")。
### 1.6.1.2. KDTree 和 BallTree 類
我們可以使用 [`KDTree`](generated/sklearn.neighbors.KDTree.html#sklearn.neighbors.KDTree "sklearn.neighbors.KDTree") 或 [`BallTree`](generated/sklearn.neighbors.BallTree.html#sklearn.neighbors.BallTree "sklearn.neighbors.BallTree") 其中一個類來找最近鄰。 這是上文使用過的 [`NearestNeighbors`](generated/sklearn.neighbors.NearestNeighbors.html#sklearn.neighbors.NearestNeighbors "sklearn.neighbors.NearestNeighbors") 類所包含的功能。 [`KDTree`](generated/sklearn.neighbors.KDTree.html#sklearn.neighbors.KDTree "sklearn.neighbors.KDTree") 和 [`BallTree`](generated/sklearn.neighbors.BallTree.html#sklearn.neighbors.BallTree "sklearn.neighbors.BallTree") 具有相同的接口; 我們將在這里展示使用 [`KDTree`](generated/sklearn.neighbors.KDTree.html#sklearn.neighbors.KDTree "sklearn.neighbors.KDTree") 的例子:
```
>>> from sklearn.neighbors import KDTree
>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> kdt = KDTree(X, leaf_size=30, metric='euclidean')
>>> kdt.query(X, k=2, return_distance=False)
array([[0, 1],
[1, 0],
[2, 1],
[3, 4],
[4, 3],
[5, 4]]...)
```
對于近鄰搜索中選項的更多信息,包括各種度量距離的查詢策略的說明等,請參閱 [`KDTree`](generated/sklearn.neighbors.KDTree.html#sklearn.neighbors.KDTree "sklearn.neighbors.KDTree") 和 [`BallTree`](generated/sklearn.neighbors.BallTree.html#sklearn.neighbors.BallTree "sklearn.neighbors.BallTree") 類文檔。 關于可用度量距離的列表,請參閱 [`DistanceMetric`](generated/sklearn.neighbors.DistanceMetric.html#sklearn.neighbors.DistanceMetric "sklearn.neighbors.DistanceMetric") 類。
## 1.6.2. 最近鄰分類
最近鄰分類屬于基于實例的學習或非泛化學習:它不會去構造一個泛化的內部模型,而是簡單地存儲訓練數據的實例。 分類是由每個點的最近鄰的簡單多數投票中計算得到的:一個查詢點的數據類型是由它最近鄰點中最具代表性的數據類型來決定的。
scikit-learn 實現了兩種不同的最近鄰分類器:[`KNeighborsClassifier`](generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier "sklearn.neighbors.KNeighborsClassifier") 基于每個查詢點的  個最近鄰實現,其中  是用戶指定的整數值。[`RadiusNeighborsClassifier`](generated/sklearn.neighbors.RadiusNeighborsClassifier.html#sklearn.neighbors.RadiusNeighborsClassifier "sklearn.neighbors.RadiusNeighborsClassifier") 基于每個查詢點的固定半徑  內的鄰居數量實現, 其中  是用戶指定的浮點數值。 -鄰居分類是 [`KNeighborsClassifier`](generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier "sklearn.neighbors.KNeighborsClassifier") 下的兩種技術中比較常用的一種。 值的最佳選擇是高度數據依賴的:通常較大的  是會抑制噪聲的影響,但是使得分類界限不明顯。
如果數據是不均勻采樣的,那么 [`RadiusNeighborsClassifier`](generated/sklearn.neighbors.RadiusNeighborsClassifier.html#sklearn.neighbors.RadiusNeighborsClassifier "sklearn.neighbors.RadiusNeighborsClassifier") 中的基于半徑的近鄰分類可能是更好的選擇。
用戶指定一個固定半徑 ,使得稀疏鄰居中的點使用較少的最近鄰來分類。對于高維參數空間,這個方法會由于所謂的 “維度災難” 而變得不那么有效。
基本的最近鄰分類使用統一的權重:分配給查詢點的值是從最近鄰的簡單多數投票中計算出來的。 在某些環境下,最好對鄰居進行加權,使得近鄰更有利于擬合。可以通過 `weights` 關鍵字來實現。
默認值 `weights = 'uniform'` 為每個近鄰分配統一的權重。而 `weights = 'distance'` 分配權重與查詢點的距離成反比。 或者,用戶可以自定義一個距離函數用來計算權重。
target:../auto\_examples/neighbors/plot\_classification.htmlscale:50target:../auto\_examples/neighbors/plot\_classification.htmlscale:50****
示例:
- [Nearest Neighbors Classification](../auto_examples/neighbors/plot_classification.html#sphx-glr-auto-examples-neighbors-plot-classification-py): 使用最近鄰進行分類的示例。
## 1.6.3. 最近鄰回歸
最近鄰回歸是用在數據標簽為連續變量,而不是離散變量的情況下。分配給查詢點的標簽是由它的最近鄰標簽的均值計算而來的。
scikit-learn 實現了兩種不同的最近鄰回歸:[`KNeighborsRegressor`](generated/sklearn.neighbors.KNeighborsRegressor.html#sklearn.neighbors.KNeighborsRegressor "sklearn.neighbors.KNeighborsRegressor") 基于每個查詢點的  個最近鄰實現, 其中  是用戶指定的整數值。[`RadiusNeighborsRegressor`](generated/sklearn.neighbors.RadiusNeighborsRegressor.html#sklearn.neighbors.RadiusNeighborsRegressor "sklearn.neighbors.RadiusNeighborsRegressor") 基于每個查詢點的固定半徑  內的鄰居數量實現, 其中  是用戶指定的浮點數值。
基本的最近鄰回歸使用統一的權重:即,本地領域內的每個鄰居點對查詢 點的分類貢獻相當。 在某些環境下,對節點加權可能是有利的,使得附近點對于回歸所作出的貢獻多于遠處點。 這可以通過 `weights` 關鍵字來實現。默認值 `weights = 'uniform'` 為所有點分配同等權重。 而 `weights = 'distance'` 分配的權重與查詢點距離呈反比。 或者,用戶可以自定義一個距離函數用來計算權重。

target:../auto\_examples/neighbors/plot\_regression.html :align: center
> scale:75
使用多輸出的最近鄰進行回歸分析 [Face completion with a multi-output estimators](../auto_examples/plot_multioutput_face_completion.html#sphx-glr-auto-examples-plot-multioutput-face-completion-py)。
在這個示例中,輸入 X 是臉上半部分像素,輸出 Y 是臉下半部分像素。
target:../auto\_examples/plot\_multioutput\_face\_completion.html :scale: 75
> align:center
示例:
- [Nearest Neighbors regression](../auto_examples/neighbors/plot_regression.html#sphx-glr-auto-examples-neighbors-plot-regression-py): 使用最近鄰進行回歸的示例。
- [Face completion with a multi-output estimators](../auto_examples/plot_multioutput_face_completion.html#sphx-glr-auto-examples-plot-multioutput-face-completion-py): 使用最近鄰進行多輸出回歸的示例。
## 1.6.4. 最近鄰算法
### 1.6.4.1. 暴力計算
最近鄰的快速計算是機器學習中一個活躍的研究領域。最簡單的近鄰搜索涉及數據集中所有成對點之間距離的暴力計算: 對于  維度中的  個樣本來說, 這個方法的復雜度是 ![O[D N^2]](https://box.kancloud.cn/91d07b3a0f5de92883c628d02f8f2e83_61x20.jpg)。 對于小數據樣本,高效的暴力近鄰搜索是非常有競爭力的。 然而,隨著樣本數  的增長,暴力方法很快變得不行了。在 [`sklearn.neighbors`](classes.html#module-sklearn.neighbors "sklearn.neighbors") 類中, 暴力近鄰搜索通過關鍵字 `algorithm = 'brute'` 來指定,并通過 [`sklearn.metrics.pairwise`](classes.html#module-sklearn.metrics.pairwise "sklearn.metrics.pairwise") 中的例程來進行計算。
### 1.6.4.2. K-D 樹
為了解決效率低下的暴力計算方法,已經發明了大量的基于樹的數據結構。總的來說, 這些結構試圖通過有效地編碼樣本的 aggregate distance (聚合距離) 信息來減少所需的距離計算量。 基本思想是,若  點距離  點非常遠, 點距離  點非常近, 可知  點與  點很遙遠,*不需要明確計算它們的距離*。 通過這樣的方式,近鄰搜索的計算成本可以降低為 ![O[D N \log(N)]](https://box.kancloud.cn/12d016565f1af83037eaa0718baeb5a2_110x19.jpg) 或更低。 這是對于暴力搜索在大樣本數  中表現的顯著改善。
利用這種聚合信息的早期方法是 *KD tree* 數據結構(\* K-dimensional tree\* 的簡寫), 它將二維 *Quad-trees* 和三維 [\*](#id8)Oct-trees 推廣到任意數量的維度. KD 樹是一個二叉樹結構,它沿著數據軸遞歸地劃分參數空間,將其劃分為嵌入數據點的嵌套的各向異性區域。 KD 樹的構造非常快:因為只能沿數據軸執行分區, 無需計算 -dimensional 距離。 一旦構建完成, 查詢點的最近鄰距離計算復雜度僅為 ![O[\log(N)]](https://box.kancloud.cn/2da6a66f26860ac7ef2ad6cb3a9af549_76x19.jpg) 。 雖然 KD 樹的方法對于低維度 () 近鄰搜索非常快, 當  增長到很大時, 效率變低: 這就是所謂的 “維度災難” 的一種體現。 在 scikit-learn 中, KD 樹近鄰搜索可以使用關鍵字 `algorithm = 'kd_tree'` 來指定, 并且使用類 [`KDTree`](generated/sklearn.neighbors.KDTree.html#sklearn.neighbors.KDTree "sklearn.neighbors.KDTree") 來計算。
References:
- [“Multidimensional binary search trees used for associative searching”](http://dl.acm.org/citation.cfm?doid=361002.361007), Bentley, J.L., Communications of the ACM (1975)
### 1.6.4.3. Ball 樹
為了解決 KD 樹在高維上效率低下的問題, 開發了 *ball 樹* 數據結構. 其中 KD 樹沿笛卡爾軸分割數據, ball 樹在沿著一系列的 hyper-spheres 來分割數據. 通過這種方法構建的樹要比 KD 樹消耗更多的時間, 但是這種數據結構對于高結構化的數據是非常有效的, 即使在高緯度上也是一樣.
ball 樹將數據遞歸地劃分為由質心  和半徑  定義的節點,使得節點中的每個點位于由  和  定義的 hyper-sphere 內. 通過使用 *triangle inequality(三角不等式)* 減少近鄰搜索的候選點數:
通過這種設置, 測試點和質心之間的單一距離計算足以確定距節點內所有點的距離的下限和上限. 由于 ball 樹節點的球形幾何, 它可以在高維度上執行 *KD-tree*, 盡管實際的性能高度依賴于訓練數據的結構. 在 scikit-learn 中, 基于 ball 樹的近鄰搜索可以使用關鍵字 `algorithm = 'ball_tree'` 來指定, 并且使用類 [`sklearn.neighbors.BallTree`](generated/sklearn.neighbors.BallTree.html#sklearn.neighbors.BallTree "sklearn.neighbors.BallTree") 來計算. 或者, 用戶可以直接使用 [`BallTree`](generated/sklearn.neighbors.BallTree.html#sklearn.neighbors.BallTree "sklearn.neighbors.BallTree") 類.
參考:
- [“Five balltree construction algorithms”](http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.91.8209), Omohundro, S.M., International Computer Science Institute Technical Report (1989)
### 1.6.4.4. 最近鄰算法的選擇
對于給定數據集的最優算法是一個復雜的選擇, 并且取決于多個因素:
- 樣本數量  (i.e. `n_samples`) 和維度  (例如. `n_features`).
- *Brute force* 查詢時間以 ![O[D N]](https://box.kancloud.cn/495a3ab14767b662b62b4e6e3c2b5485_54x18.jpg) 增長
- *Ball tree* 查詢時間大約以 ![O[D \log(N)]](https://box.kancloud.cn/5b66357653555f84319beacb1b34f96a_94x19.jpg) 增長
- *KD tree* 的查詢時間  的變化是很難精確描述的.對于較小的  (小于20) 的成本大約是 ![O[D\log(N)]](https://box.kancloud.cn/5b66357653555f84319beacb1b34f96a_94x19.jpg), 并且 KD 樹更加有效.
對于較大的  成本的增加接近 ![O[DN]](https://box.kancloud.cn/495a3ab14767b662b62b4e6e3c2b5485_54x18.jpg), 由于樹結構引起的開銷會導致查詢效率比暴力還要低.
對于小數據集 ( 小于30),  相當于 , 暴力算法比基于樹的算法更加有效.[`KDTree`](generated/sklearn.neighbors.KDTree.html#sklearn.neighbors.KDTree "sklearn.neighbors.KDTree") 和 [`BallTree`](generated/sklearn.neighbors.BallTree.html#sklearn.neighbors.BallTree "sklearn.neighbors.BallTree") 通過提供一個 *leaf size* 參數來解決這個問題:
這控制了查詢切換到暴力計算樣本數量. 使得兩種算法的效率都能接近于對較小的  的暴力計算的效率.
- 數據結構: 數據的 *intrinsic dimensionality* (本征維數) 和/或數據的 *sparsity* (稀疏度). 本征維數是指數據所在的流形的維數 , 在參數空間可以是線性或非線性的. 稀疏度指的是數據填充參數空間的程度(這與“稀疏”矩陣中使用的概念不同, 數據矩陣可能沒有零項, 但是從這個意義上來講,它的 **structure** 仍然是 “稀疏” 的)。
- *Brute force* (暴力查詢)時間不受數據結構的影響。
- *Ball tree* 和 *KD tree* 的數據結構對查詢時間影響很大. 一般地, 小維度的 sparser (稀疏) 數據會使查詢更快. 因為 KD 樹的內部表現形式是與參數軸對齊的, 對于任意的結構化數據它通常不會表現的像 ball tree 那樣好.
在機器學習中往往使用的數據集是非常結構化的, 而且非常適合基于樹結構的查詢。
- 請求 query point(查詢點)的近鄰數  。
> - *Brute force* 查詢時間幾乎不受  值的影響.
> - *Ball tree* 和 *KD tree* 的查詢時間會隨著  的增加而變慢. 這是由于兩個影響: 首先,  的值越大在參數空間中搜索的部分就越大. 其次, 使用  進行樹的遍歷時, 需要對內部結果進行排序.
當  與  相比變大時, 在基于樹的查詢中修剪樹枝的能力是減弱的. 在這種情況下, 暴力查詢會更加有效.
> - query points(查詢點)數. ball tree 和 KD Tree 都需要一個構建階段. 在許多查詢中分攤時,這種結構的成本可以忽略不計。 如果只執行少量的查詢, 可是構建成本卻占總成本的很大一部分. 如果僅需查詢很少的點, 暴力方法會比基于樹的方法更好.
>
> 一般地, `algorithm = 'auto'` 選擇 `'kd_tree'` 如果 
并且 `'effective_metric_'` 在 `'kd_tree'` 的列表 `'VALID_METRICS'` 中. 它選擇 `'ball_tree'` 如果  并且 `'effective_metric_'` 在 `'ball_tree'` 的列表 `'VALID_METRICS'` 中. 它選擇 `'brute'` 如果  并且 `'effective_metric_'` 不在 `'kd_tree'` 或 `'ball_tree'` 的列表 `'VALID_METRICS'` 中. 它選擇 `'brute'` 如果 .
這種選擇基于以下假設: 查詢點的數量與訓練點的數量至少相同, 并且 `leaf_size` 接近其默認值 `30`.
### 1.6.4.5. `leaf_size` 的影響
如上所述, 對于小樣本暴力搜索是比基于數的搜索更有效的方法. 這一事實在 ball 樹和 KD 樹中被解釋為在葉節點內部切換到蠻力搜索. 該開關的級別可以使用參數 `leaf_size` 來指定. 這個參數選擇有很多的效果:
**構造時間**更大的 `leaf_size` 會導致更快的樹構建時間, 因為需要創建更少的節點.**查詢時間**一個大或小的 `leaf_size` 可能會導致次優查詢成本. 當 `leaf_size` 接近 1 時, 遍歷節點所涉及的開銷大大減慢了查詢時間. 當 `leaf_size`, 接近訓練集的大小,查詢變得本質上是暴力的. 這些之間的一個很好的妥協是 `leaf_size = 30`, 這是該參數的默認值.**內存**隨著leaf\_size的增加,存儲樹結構所需的內存減少。 對于存儲每個節點的D維質心的ball tree,這點至關重要。 針對 [`BallTree`](generated/sklearn.neighbors.BallTree.html#sklearn.neighbors.BallTree "sklearn.neighbors.BallTree") 所需的存儲空間近似于 `1 / leaf_size` 乘以訓練集的大小.
`leaf_size` 不被 brute force queries(暴力查詢)所引用.
## 1.6.5. 最近質心分類
該 [`NearestCentroid`](generated/sklearn.neighbors.NearestCentroid.html#sklearn.neighbors.NearestCentroid "sklearn.neighbors.NearestCentroid") 分類器是一個簡單的算法, 通過其成員的質心來表示每個類。 實際上, 這使得它類似于 `sklearn.KMeans` 算法的標簽更新階段. 它也沒有參數選擇, 使其成為良好的基準分類器. 然而,它確實受到非凸類的影響,而且當類有顯著不同的方差時,假設所有維度的方差都是相等的。 對于沒有做出這個假設的更復雜的方法, 請參閱線性判別分析 ([`sklearn.discriminant_analysis.LinearDiscriminantAnalysis`](generated/sklearn.discriminant_analysis.LinearDiscriminantAnalysis.html#sklearn.discriminant_analysis.LinearDiscriminantAnalysis "sklearn.discriminant_analysis.LinearDiscriminantAnalysis")) 和二次判別分析 ([`sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis`](generated/sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis.html#sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis "sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis")). 默認的 [`NearestCentroid`](generated/sklearn.neighbors.NearestCentroid.html#sklearn.neighbors.NearestCentroid "sklearn.neighbors.NearestCentroid") 用法示例如下:
```
>>> from sklearn.neighbors.nearest_centroid import NearestCentroid
>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> y = np.array([1, 1, 1, 2, 2, 2])
>>> clf = NearestCentroid()
>>> clf.fit(X, y)
NearestCentroid(metric='euclidean', shrink_threshold=None)
>>> print(clf.predict([[-0.8, -1]]))
[1]
```
### 1.6.5.1. 最近縮小質心
該 [`NearestCentroid`](generated/sklearn.neighbors.NearestCentroid.html#sklearn.neighbors.NearestCentroid "sklearn.neighbors.NearestCentroid") 分類器有一個 `shrink_threshold` 參數, 它實現了 nearest shrunken centroid 分類器. 實際上, 每個質心的每個特征的值除以該特征的類中的方差. 然后通過 `shrink_threshold` 來減小特征值. 最值得注意的是, 如果特定特征值過0, 則將其設置為0. 實際上,每個質心的特征值,通過該特征類除以方差,再減去shrink\_threshold得到。 這很有用, 例如, 去除噪聲特征.
在以下例子中, 使用一個較小的 shrink 閥值將模型的準確度從 0.81 提高到 0.82.
target:../auto\_examples/neighbors/plot\_nearest\_centroid.htmlscale:50target:../auto\_examples/neighbors/plot\_nearest\_centroid.htmlscale:50****
例子:
- [Nearest Centroid Classification](../auto_examples/neighbors/plot_nearest_centroid.html#sphx-glr-auto-examples-neighbors-plot-nearest-centroid-py): 一個分類的例子, 它使用了不同 shrink 閥值的最近質心.
- scikit-learn 0.19 中文文檔
- 用戶指南
- 1. 監督學習
- 1.1. 廣義線性模型
- 1.2. 線性和二次判別分析
- 1.3. 內核嶺回歸
- 1.4. 支持向量機
- 1.5. 隨機梯度下降
- 1.6. 最近鄰
- 1.7. 高斯過程
- 1.8. 交叉分解
- 1.9. 樸素貝葉斯
- 1.10. 決策樹
- 1.11. 集成方法
- 1.12. 多類和多標簽算法
- 1.13. 特征選擇
- 1.14. 半監督學習
- 1.15. 等式回歸
- 1.16. 概率校準
- 1.17. 神經網絡模型(有監督)
- 2. 無監督學習
- 2.1. 高斯混合模型
- 2.2. 流形學習
- 2.3. 聚類
- 2.4. 雙聚類
- 2.5. 分解成分中的信號(矩陣分解問題)
- 2.6. 協方差估計
- 2.7. 經驗協方差
- 2.8. 收斂協方差
- 2.9. 稀疏逆協方差
- 2.10. Robust 協方差估計
- 2.11. 新奇和異常值檢測
- 2.12. 密度估計
- 2.13. 神經網絡模型(無監督)
- 3. 模型選擇和評估
- 3.1. 交叉驗證:評估估算器的表現
- 3.2. 調整估計器的超參數
- 3.3. 模型評估: 量化預測的質量
- 3.4. 模型持久化
- 3.5. 驗證曲線: 繪制分數以評估模型
- 4. 數據集轉換
- 4.1. Pipeline(管道)和 FeatureUnion(特征聯合): 合并的評估器
- 4.2. 特征提取
- 4.3. 預處理數據
- 4.4. 無監督降維
- 4.5. 隨機投影
- 4.6. 內核近似
- 4.7. 成對的矩陣, 類別和核函數
- 4.8. 預測目標 (y) 的轉換
- 5. 數據集加載工具
- 6. 大規模計算的策略: 更大量的數據
- 7. 計算性能
- 教程
- 使用 scikit-learn 介紹機器學習
- 關于科學數據處理的統計學習教程
- 機器學習: scikit-learn 中的設置以及預估對象
- 監督學習:從高維觀察預測輸出變量
- 模型選擇:選擇估計量及其參數
- 無監督學習: 尋求數據表示
- 把它們放在一起
- 尋求幫助
- 處理文本數據
- 選擇正確的評估器(estimator)
- 外部資源,視頻和談話