統計學習方法 KD樹最近鄰搜尋

2021-10-02 13:03:45 字數 1210 閱讀 7890

李航老師書上的的演算法說明沒怎麼看懂,看了網上的部落格,悟出一套迴圈(建立好kd樹以後的最近鄰搜尋),我想應該是這樣的(例子是李航《統計學習演算法》第三章56頁;例3.3):

步驟結點查詢標記

棧內元素(本次迴圈結束後)

最近點最近距離說明a

bcde

fg初始化000

0000

0abd

m=空mdis = ∞

初始化:先將s所在的區域找到,將經過的各個結點依次加入棧中,將查詢標記初始化為0迴圈1

0001

000ab

m=dmdis = dis(s,d)

取出棧頂元素d,d被查詢,更新d的標記為1,計算s與d的距離,比當前最小值小,更新m=d,mdis = dis(s,d),計算s到d的超平面的距離是否小於mdis(這裡二維就是以s為圓心,mdis為半徑的圓是否與d那維的直線相交,在這裡是相交的),小於,將d兩側的子結點加入棧,但是d兩側沒有子結點,不加20

1010

00am=d

mdis = dis(s,d)

取出棧頂元素b,b被查詢,更新b的標記為1,計算s與b的距離,不比當前最小值小,不更新,計算s到b的超平面的距離是否小於mdis,大於,那就只加入b的s那一側的子結點d,子結點d已經被標記為1,已被查詢,不加入31

1010

00cm=d

mdis = dis(s,d)

取出棧頂元素a,a被查詢,更新a的標記為1,計算s與a的距離,不比當前最小值小,不更新,計算s到a的超平面的距離是否小於mdis,小於,將a兩側的子結點加入,子結點b已經被標記為1,被查詢,不加入,子結點c標記為0,加入棧41

1110

00em=d

mdis = dis(s,d)

取出棧頂元素c,c被查詢,更新c的標記為1,計算s與c的距離,不比當前最小值小,不更新,計算s到c的超平面的距離是否小於mdis,大於,只加入c的s那側的子結點e,子結點e標記為0,沒被查詢,加入棧51

1111

00m=emdis = dis(s,e)

取出棧頂元素e,e被查詢,更新e的標記為1,計算s與e的距離,比當前最小值小,更新m=e,mdis = dis(s,d),計算s到e的超平面的距離是否小於mdis,小於,將e兩側的子結點加入棧,但是e兩側沒有子結點,不加61

1111

00m=emdis = dis(s,e)

棧空,迴圈結束

如果有錯,還望大佬們能夠指正

利用kd樹實現最近鄰搜尋

輸入 已經構造的kd樹,目標點x 輸出 x的最近鄰 1在kd樹中找出包含目標點x的葉節點 從根結點出發,遞迴地向下訪問kd樹。若目標點x當前維的座標小於切分點的座標,則移動到左葉子結點,否則移動到右葉子結點。直到子節點為葉節點為止。2以此葉節點為 當前最近點 3遞迴地向上回退,在每個結點進行以下操作...

統計學習方法 k近鄰法

k近鄰法 knn 是一種基本的分類與回歸方法 分類這種需求,滲透到我們生活的方方面面 分類演算法可以幫助我們完成這些繁瑣的操作,並根據我們的要求不斷修正分類結果。分類演算法其實蠻多的,這裡順著書本順序,詳細講解knn演算法,再與k means k means 演算法進行簡單對比。k近鄰法是這樣乙個過...

統計學習方法 K近鄰法

k近鄰演算法簡單 直觀給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類.下面先敘述k近鄰演算法,然後再討論其細節。近鄰法的特殊情況 k 1情形,稱為最近鄰演算法.對於輸入的例項點 特徵向量 x xx,最近鄰法將訓練資...