k近鄰法: k-nearest neighbor
KNN
k近鄰演算法既可以作為分類方法(離散的標籤)也可以作為迴歸方法(連續標籤)。考慮作為分類的時候,演算法的輸入為特徵空間,輸出為例項的類別。
基本思想:給定一個訓練集,然後尋找其中與新輸入的例項最近的個例項,將新例項標記為個例項中所屬類別最多的一類。
其中的距離度量可以是任意的度量標準,K是一個使用者自己定義的超引數。
近鄰模型
近鄰演算法實際就是劃分特徵空間。該模型的基本要素:距離的度量、K值的選擇,分類決策規則。
距離度量
常見的距離度量有:歐氏距離、曼哈頓距離、閔可夫斯基距離、契比雪夫距離。不同的距離度量計算出來的最近鄰點是不相同的。
具體的內容可以參考:
k值選擇
K值的較小意味著模型的複雜度上升,容易過擬合;k值的增大意味著模型區域簡單,容易欠擬合。實際應用中通常使用交叉驗證法來選取最優的K值。
分類決策規則
k近鄰的分類決策規則往往是少數服從多數,即k個近鄰例項中哪個類別的例項多就將新例項標記為哪類。
假設分類的損失函式為0-1損失函式,分類函式為:
那麼誤分類的概率為:
定義的損失函式為:
根據最小化經驗風險的原則,k近鄰的多數表決規則等價於經驗風險最小化。
實現
暴力計算
最基本的近鄰搜尋就是通過暴力計算各個點對之間的距離:從個維的樣本,這種演算法的複雜度是。當樣本點不算太多時,可以使用暴力計算;一旦樣本點數目太多,則就不太適合使用暴力計算。
K-D樹
為了解決暴力計算對資料集樣本點數目太多而不適用的問題,提出了許多基於樹的資料結構來嘗試解決這個問題。通常,這些結構都試圖來減少距離計算的次數。例如:樣本點A距離樣本點B很遠,而B距離樣本點C又很近,因此可以得出結論樣本點C距離樣本點A很遠,最關鍵的這之間不同計算它們之間距離的具體數值。
一個早期的利用這種資訊聚合的方法是KD樹(k-dimension tree), KD樹是沿著資料集各個維度來劃分引數空間,將其劃分為多個正交區域的二叉樹。KD樹的構造生產所需的計算量並不大,計算非常快,因為它並不需要計算D維的距離。一旦KD樹構建完成,樣本點的最近鄰點的計算複雜度只有。當樣本點的維度不大於20的時候,KD樹用於實現最近鄰搜尋的速度還算不錯。但當維度繼續增大的時候再一次變的不適用。
球樹(ball tree)
為了應對高維的問題,提出了球樹的結構。KD樹的劃分資料是沿著笛卡爾座標系,球樹是在一系列的超球體裡面劃分資料。雖然這會提高構建球樹時的計算量,但對於高維資料的使用確實非常有用的。
一個球樹通過迭代地通過給出的中心和半徑,因此每個樣本點(樹中的節點)都會落在一個有引數超球體中。最近鄰候選點數目可以通過三角不等式來進行削減。
Reference:
[1]《統計學習方法》,李航.
[2]常用的相似性度量