李航老師書上的的算法說明沒怎么看懂,看了網上的博客,悟出一套循環(建立好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) | 棧空,循環結束 |
如果有錯,還望大佬們能夠指正