分類演算法實例五:用KD Tree查找最近鄰

  • 2020 年 3 月 18 日
  • 筆記

1、KNN參數說明

參數

K Neighbors Classifier(KNN分類)和K Neighbors Regressor(KNN回歸)

weights

樣本權重,可選參數: uniform(等權重)、distance(權重和距離成反比,越近影響越強);默認為uniform

n_neighbors

鄰近數目,默認為5

algorithm

計算方式,默認為auto,可選參數: auto、ball_tree、kd_tree、brute;推薦選擇kd_tree

leaf_size

在使用KD_Tree的時候,葉子數量,默認為30

metric

樣本之間距離度量公式,默認為minkowski(閔可夫斯基);當參數p為2的時候,其實就是歐幾里得距離

p

給定minkowski距離中的p值

2、KD Tree介紹

(1)KD Tree的適用場景 KD Tree是密度聚類(DBSCAN)演算法中計算樣本和核心對象之間距離來獲取最近鄰以及KNN演算法中用於計算最近鄰的快速、便捷構建方式。 當樣本數據量少的時候,我們可以使用brute這種暴力的方式進行求解最近鄰,即計算到所有樣本的距離。但是當樣本量比較大的時候,直接計算所有樣本的距離,工作量有點大,所以在這種情況下,我們可以使用KD Tree來快速的計算。 (2)KD Tree的構建方式 KD樹採用從m個樣本的n維特徵中,分別計算n個特徵取值的方差,用方差最大的第k維特徵nkn_knk​作為根節點。對於這個特徵,選擇取值的中位數nkvn_{kv}nkv​作為樣本的劃分點,對於小於該值的樣本劃分到左子樹,對於大於等於該值的樣本劃分到右子樹,對左右子樹採用同樣的方式找方差最大的特徵作為根節點,遞歸即可產生KD樹。 (3)KD Tree示例 二維樣本:{(2,3), (5,4), (9,6), (4,7), (8,1), (7,2)}。

(4)KD Tree查找最近鄰 當我們生成KD樹以後,就可以去預測測試集裡面的樣本目標點了。對於一個目標點,我們首先在KD樹裡面找到包含目標點的葉子節點。以目標點為圓心,以目標點到葉子節點樣本實例的距離為半徑,得到一個超球體,最近鄰的點一定在這個超球體內部。然後返回葉子節點的父節點,檢查另一個子節點包含的超矩形體是否和超球體相交,如果相交就到這個子節點尋找是否有更加近的近鄰,有的話就更新最近鄰。如果不相交那就簡單了,我們直接返回父節點的父節點,在另一個子樹繼續搜索最近鄰。當回溯到根節點時,演算法結束,此時保存的最近鄰節點就是最終的最近鄰。

3、用KD Tree查找最近鄰實例

from sklearn.neighbors import KDTree  import numpy as np    np.random.seed(0)  X = np.random.random((10, 3))  X
tree = KDTree(X, leaf_size=2)  tree
dist, ind = tree.query([X[0]], k=3)  print(dist)  print(ind)