統計學習方法——KD樹K近鄰搜索


  李航老師書上的的算法說明沒怎么看懂,看了網上的博客,悟出一套循環(建立好KD樹以后的K近鄰搜索),我想應該是這樣的(例子是李航《統計學習算法》第三章56頁;例3.3):

  步驟 結點查詢標記 棧內元素(本次循環結束后) 最近點 最近距離 說明
A B C D E F G
初始化 0 0 0 0 0 0 0 0 ABD M=空 Mdis = ∞ 初始化:先將S所在的區域找到,將經過的各個結點依次加入棧中,將查詢標記初始化為0
循環 1 0 0 0 1 0 0 0 AB M=D Mdis = dis(S,D) 取出棧頂元素D,D被查詢,更新D的標記為1,計算S與D的距離,比當前最小值小,更新M=D,Mdis = dis(S,D),計算S到D的超平面的距離是否小於Mdis(這里二維就是以S為圓心,Mdis為半徑的圓是否與D那維的直線相交,在這里是相交的),小於,將D兩側的子結點加入棧,但是D兩側沒有子結點,不加
2 0 1 0 1 0 0 0 A M=D Mdis = dis(S,D) 取出棧頂元素B,B被查詢,更新B的標記為1,計算S與B的距離,不比當前最小值小,不更新,計算S到B的超平面的距離是否小於Mdis,大於,那就只加入B的S那一側的子結點D,子結點D已經被標記為1,已被查詢,不加入
3 1 1 0 1 0 0 0 C M=D Mdis = dis(S,D) 取出棧頂元素A,A被查詢,更新A的標記為1,計算S與A的距離,不比當前最小值小,不更新,計算S到A的超平面的距離是否小於Mdis,小於,將A兩側的子結點加入,子結點B已經被標記為1,被查詢,不加入,子結點C標記為0,加入棧
4 1 1 1 1 0 0 0 E M=D Mdis = dis(S,D) 取出棧頂元素C,C被查詢,更新C的標記為1,計算S與C的距離,不比當前最小值小,不更新,計算S到C的超平面的距離是否小於Mdis,大於,只加入C的S那側的子結點E,子結點E標記為0,沒被查詢,加入棧
5 1 1 1 1 1 0 0   M=E Mdis = dis(S,E) 取出棧頂元素E,E被查詢,更新E的標記為1,計算S與E的距離,比當前最小值小,更新M=E,Mdis = dis(S,D),計算S到E的超平面的距離是否小於Mdis,小於,將E兩側的子結點加入棧,但是E兩側沒有子結點,不加
6 1 1 1 1 1 0 0   M=E Mdis = dis(S,E) 棧空,循環結束

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


免責聲明!

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



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