基於李航教授的《統計學習方法》,本博客爲個人學習筆記。
只記錄精華,不講廢話,讓看過或沒看過的你和我短時間重新領悟該方法。
k近鄰法(knn)與k-means的比較:
兩者共同點:
1、k的選擇類似
2、思路:根據最近的樣本來判斷某個樣本的屬性
兩者不同點:
1、應用場景:前者是分類或迴歸問題,後者是聚類問題
2、算法複雜度:前者是,後者是
一、模型
k近鄰法是一種基本分類與迴歸方法。
它不屬於判別模型,也不屬於生成模型。
k近鄰法實際上是對於輸入的數據,在原訓練集的空間上獲得k個與其距離度量最相近的數據,由這k個數據的標籤根據分類決策規則所決定該輸入數據的輸出標籤。
因此模型由三個基本要素決定:距離度量、k值的選擇、分類決策規則
1、距離度量
一般爲Lp距離:
L1爲曼哈頓距離
L2爲歐式距離
L∞爲切比雪夫距離
2、k值的選擇
k值其實是一個超參數,得根據實際任務進行調整。
在應用中,k值一般取一個比較小的數值。通常採用交叉驗證法來選取最優的k值。
3、分類決策規則
k近鄰法中的分類決策規則往往是多數表決,即由輸入實例的k個鄰近的訓練實例中的多數類決定輸入實例的類別。
二、策略
它不具備顯式的學習過程,實際上是利用數據集對特徵向量空間進行劃分。
因此它的模型是固定的,不需要損失函數優化參數。
三、算法
1、線性掃描
線性掃描是實現knn最簡單的方法。
簡單來說,對於一個輸入實例,我們首先要在訓練集(假設n個數據)裏找k個與其最接近的點,線性掃描,就要遍歷一遍訓練集,對於m個輸入,算法複雜度即爲。
所以訓練集很大時,計算非常耗時,這種方法是不行的。
2、kd樹
k-dimensional樹的簡稱
爲了提高k近鄰搜索的效率,我們使用特殊的結構去存取訓練數據,可以大大減少時間複雜度。
該特殊結構就是數據結構的最常見的二叉樹,使用遞歸算法去構造該樹。
構造kd樹
我們對二叉樹一個非常直觀的感受就是:自上而下,不斷分開。
其實kd樹也就對應於一個K維空間,每一個維度的劃分對應的是訓練實例的其中一個特徵的劃分,維度空間K的大小取決於訓練集的特徵取值有多少。
(構造平衡kd樹)算法實現:
輸入:k維空間數據集,
其中
輸出:kd樹。
(1)開始:構造根結點,根結點對應於包含T的k維空間的超矩形區域。 選擇爲座標軸,以T中所有實例的座標的中位數爲切分點,將根結點對應的超矩形區域切分爲兩個子區域。切分由通過切分點並與座標軸垂直的超平面實現。
由根結點生成深度爲1的左、右子結點:左子結點對應座標小於切分點的子區域,右子結點對應於座標大於切分點的子區域。
將落在切分超平面上的實例點保存在根結點。
(2)重複:對深度爲j的結點,選擇爲切分的座標軸,,以該結點的區域中所有實例的座標的中位數爲切分點,將該結點對應的超矩形區域切分爲兩個子區域。切分由通過切分點並與座標軸垂直的超平面實現。
由該結點生成深度爲的左、右子結點:左子結點對應座標小於切分點的子區域,右子結點對應座標大於切分點的子區域。
將落在切分超平面上的實例點保存在該結點。
這裏有兩個細節:
1、我認爲該重複步驟暗示了這裏默認根結點的深度爲0了。
2、選擇的劃分,是取mod獲得的,因此當時,會重新使用前面已經使用過的特徵對當前數據集進行劃分,這樣的劃分不會形成新的維度,仍然是k維空間。
(3)直到兩個子區域沒有實例存在時停止。從而形成kd樹的區域劃分。
搜索kd樹
(用kd樹的最近鄰搜索)算法實現:
輸入:已構造的kd樹;目標點x;
輸出:x的最近鄰。
(1)在kd樹中找出包含目標點x的葉結點:從根結點出發,遞歸地向下訪問kd樹。若目 標點x當前維的座標小於切分點的座標,則移動到左子結點,否則移動到右子結點。直到子 結點爲葉結點爲止。
(2)以此葉結點爲“當前最近點”。
(3)遞歸地向上回退,在每個結點進行以下操作:
- 如果該結點保存的實例點比當前最近點距離目標點更近,則以該實例點爲“當前最 近點”。
- 當前最近點一定存在於該結點一個子結點對應的區域。檢查該子結點的父結點的 另一子結點對應的區域是否有更近的點。具體地,檢查另一子結點對應的區域是否與以目標 點爲球心、以目標點與“當前最近點”間的距離爲半徑的超球體相交。 如果相交,可能在另一個子結點對應的區域內存在距目標點更近的點,移動到另一個子 結點。接着,遞歸地進行最近鄰搜索; 如果不相交,向上回退。
(4)當回退到根結點時,搜索結束。最後的“當前最近點”即爲x的最近鄰點。
總結該搜索算法:輸入實例,自上而下直到葉結點,該葉結點所在的空間區域也是輸入實例所分到的空間區域,但該區域內的結點不一定與輸入實例最接近。因此又要自下而上的去判斷是否有更接近的點。
如果實例點是隨機分佈的,kd樹搜索的平均計算複雜度是,這裏N是訓練實例 數。kd樹更適用於訓練實例數遠大於空間維數時的k近鄰搜索。當空間維數接近訓練實例數時,它的效率會迅速下降,幾乎接近線性掃描。
在大量訓練數據時,比較的次數大大減少,因爲從空間上去看,它與最接近的點形成的一個球體,在超空間上是微不足道的,我們通過二叉樹的存儲,對空間的劃分,能極大的優化我們找到最鄰近點的時間。