統計學習方法 第三章習題解答

3.1

題目:參照圖3.1,在二維空間中給出實例點,畫出k爲1和2時的k近鄰法構成的空間劃分,並對其進行比較,體會k值選擇與模型複雜度及預測準確率的關係。

答:本題的意思我理解蠻久(汗-_-||),簡單來講,將一整塊的空間分割成各個區域,每個區域有其標籤類別。書中的圖(如下)給出的是最近鄰也就是k=1的特徵空間劃分。
最近鄰的特徵空間劃分
接下來我詳細地解釋一下如何劃分(小學數學):
爲了方便說明,只用兩種類別,分別用○和×代表。
假設空間上只有兩個點,要把整個空間一分爲二,分成兩個區域,我們知道要取兩點的線段的中垂線來劃分整個區域。同理多個點也是一樣的。
K=1
K=1劃分
解釋:每條線的標籤表示哪兩個點之間中垂線,整個空間由6條中垂線劃分爲5個區域
K=2
在這裏插入圖片描述
單單從結果圖看可能有點抽象了,區域12的意思表示該區域最近的兩個點是1和2。建議自己畫一下點之間的中垂線,找一找感覺。(上圖還有點小問題,應該還有區域23,比較小)
以區域13爲例,要保證這個區域最近的兩個點爲1和3,那麼從2點開始考慮,2靠1更近,要在該區域選擇3而不是2,作出23的中垂線;同時要在該區域選擇1而不是5,作15的中垂線。簡言之作某個區域的時候,對剩餘的點進行遍歷,作該點與區域中距離該點較遠的點之間的中垂線。

3.2

題目:利用例題3.2構造的kd樹求點x=(3,4.5)Tx = (3,4.5)^T的最近鄰點。
距離用歐式距離來衡量,即d2=(xa(1)xb(1))2+(xa(2)xb(2))2d^2 = (x^{(1)}_{a}-x^{(1)}_{b})^2+(x^{(2)}_{a}-x^{(2)}_{b})^2

答:例題3.2的特徵空間劃分和構造出的kd樹如圖所示:
"特徵空間劃分"
"kd樹"
第一步:在kd樹中找到包含目標點x的葉節點
從根節點(7,2)(7,2)開始,x=(3,4.5)Tx = (3,4.5)^Tx(1)<7x^{(1)} < 7,進入左節點(5,4)(5,4),而x(2)>4x^{(2)} > 4進入右節點(4,7)(4,7),目標節點xx在葉節點(4,7)(4,7)對應的區域中,這一點也可以觀察圖1特徵空間的劃分得出來,xx在左上角的矩形區域中。
第二步:遞歸向上退,更新“當前最近點”
比較
dd(當前節點,目標節點)與dd(當前最近點,目標節點)
dmind_{min}(當前節點的兄弟節點,目標節點)與dd(當前最近點,目標節點)

迭代次數 當前節點 兄弟節點中最近的節點 當前最近點 是否更新
0 (4,7)(4,7) - (4,7)(4,7) -
1 (4,7)(4,7) (2,3)(2,3) (4,7)(4,7) Yes
2 (5,4)(5,4) (5,4)(5,4) (2,3)(2,3) No
3 (7,2)(7,2) - (2,3)(2,3) -

第三步:退回到根節點時,“當前最近點”即爲最近鄰點
最終(2,3)(2,3)爲要求的最近鄰點。

3.3

題目:參照算法3.3,寫出輸出爲x的k近鄰的算法。

算法3.3——用kd樹求最近鄰
輸入:已構造的kd樹;目標點x;
輸出:x的最近鄰.
(1)在kd樹中找出包含目標點x的葉結點:從根結點出發,遞歸地向下訪問
kd樹.若目標點x當前維的座標小於切分點的座標,則移動到左子結點,否則移動到右子結點.直到子結點爲葉結點爲止.
(2)以此葉結點爲“當前最近點”。
(3)遞歸地向上回退,在每個結點進行以下操作:
(a)如果該結點保存的實例點比當前最近點距離目標點更近,則以該實例點爲“當前最近點”。
(b)當前最近點一定存在於該結點一個子結點對應的區域.檢查該子結點的父結點的另一子結點對應的區域是否有更近的點.具體地,檢查另一子結點對應的區域是否與以目標點爲球心、以目標點與“當前最近點”間的距離爲半徑的超球體相交.
如果相交,可能在另一個子結點對應的區域內存在距目標點更近的點,移動到另一個子結點.接着,遞歸地進行最近鄰搜索;
如果不相交,向上回退.
(4)當回退到根結點時,搜索結束.最後的“當前最近點”即爲x的最近鄰點

思路:設置一個prior_queue,排序標準爲與輸入點x的距離,每次更新“當前最近點”的時候,在隊列長度不足k的時候,直接壓入該節點,長度超過k且新點到x的距離比隊列最後一個點到x的距離短的時候,則彈出末尾節點,壓入新節點。但是這種思路可能導致最終隊列不足k個,此時則需要回溯訪問另一半樹中的節點.

參考

kd樹的算法實現原理及開源代碼
k近鄰詳解
kd樹從最近鄰到k近鄰(C++實現)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章