經典機器學習算法二:k近鄰法

基於李航教授的《統計學習方法》,本博客爲個人學習筆記。
只記錄精華,不講廢話,讓看過或沒看過的你和我短時間重新領悟該方法。

k近鄰法(knn)與k-means的比較:
兩者共同點:
1、k的選擇類似
2、思路:根據最近的樣本來判斷某個樣本的屬性
兩者不同點:
1、應用場景:前者是分類或迴歸問題,後者是聚類問題
2、算法複雜度:前者是O(n2)O(n^2),後者是O(kmn)O(kmn)

一、模型

k近鄰法是一種基本分類與迴歸方法。
它不屬於判別模型,也不屬於生成模型。

k近鄰法實際上是對於輸入的數據,在原訓練集的空間上獲得k個與其距離度量最相近的數據,由這k個數據的標籤根據分類決策規則所決定該輸入數據的輸出標籤。

因此模型由三個基本要素決定:距離度量、k值的選擇、分類決策規則

1、距離度量

一般爲Lp距離:
L1爲曼哈頓距離
L2爲歐式距離
L∞爲切比雪夫距離
在這裏插入圖片描述

2、k值的選擇

k值其實是一個超參數,得根據實際任務進行調整。
在應用中,k值一般取一個比較小的數值。通常採用交叉驗證法來選取最優的k值。

3、分類決策規則

k近鄰法中的分類決策規則往往是多數表決,即由輸入實例的k個鄰近的訓練實例中的多數類決定輸入實例的類別。

二、策略

它不具備顯式的學習過程,實際上是利用數據集對特徵向量空間進行劃分。
因此它的模型是固定的,不需要損失函數優化參數。

三、算法

1、線性掃描

線性掃描是實現knn最簡單的方法。
簡單來說,對於一個輸入實例,我們首先要在訓練集(假設n個數據)裏找k個與其最接近的點,線性掃描,就要遍歷一遍訓練集,對於m個輸入,算法複雜度即爲O(m×n)O(m\times n)
所以訓練集很大時,計算非常耗時,這種方法是不行的。

2、kd樹

k-dimensional樹的簡稱
爲了提高k近鄰搜索的效率,我們使用特殊的結構去存取訓練數據,可以大大減少時間複雜度。
該特殊結構就是數據結構的最常見的二叉樹,使用遞歸算法去構造該樹。

構造kd樹

我們對二叉樹一個非常直觀的感受就是:自上而下,不斷分開。
其實kd樹也就對應於一個K維空間,每一個維度的劃分對應的是訓練實例的其中一個特徵的劃分,維度空間K的大小取決於訓練集的特徵取值有多少。

(構造平衡kd樹)算法實現:
輸入:k維空間數據集T={x1,x2,,xN}T=\{x_1,x_2,…,x_N\}
其中xi=(xi1,xi2,,xik)T,i=1,2,...,N;x_i=(x_i^1,x_i^2,…,x_i^k)^T,i=1,2,...,N;
輸出:kd樹。
(1)開始:構造根結點,根結點對應於包含T的k維空間的超矩形區域。 選擇x1x^1爲座標軸,以T中所有實例的x1x^1座標的中位數爲切分點,將根結點對應的超矩形區域切分爲兩個子區域。切分由通過切分點並與座標軸x1x^1垂直的超平面實現。
由根結點生成深度爲1的左、右子結點:左子結點對應座標x1x^1小於切分點的子區域,右子結點對應於座標x1x^1大於切分點的子區域。
將落在切分超平面上的實例點保存在根結點。

(2)重複:對深度爲j的結點,選擇xlx^l爲切分的座標軸,l=j(modk)+1l=j(modk)+1,以該結點的區域中所有實例的xlx^l座標的中位數爲切分點,將該結點對應的超矩形區域切分爲兩個子區域。切分由通過切分點並與座標軸xlx^l垂直的超平面實現。
由該結點生成深度爲j+1j+1的左、右子結點:左子結點對應座標xlx^l小於切分點的子區域,右子結點對應座標xlx^l大於切分點的子區域。
將落在切分超平面上的實例點保存在該結點。

這裏有兩個細節:
1、我認爲該重複步驟暗示了這裏默認根結點的深度爲0了。
2、選擇的xlx^l劃分,ll是取mod獲得的,因此當j>=lj>=l時,會重新使用前面已經使用過的特徵對當前數據集進行劃分,這樣的劃分不會形成新的維度,仍然是k維空間。

(3)直到兩個子區域沒有實例存在時停止。從而形成kd樹的區域劃分。

搜索kd樹

(用kd樹的最近鄰搜索)算法實現:
輸入:已構造的kd樹;目標點x;
輸出:x的最近鄰。
(1)在kd樹中找出包含目標點x的葉結點:從根結點出發,遞歸地向下訪問kd樹。若目 標點x當前維的座標小於切分點的座標,則移動到左子結點,否則移動到右子結點。直到子 結點爲葉結點爲止。
(2)以此葉結點爲“當前最近點”。
(3)遞歸地向上回退,在每個結點進行以下操作:

  • 如果該結點保存的實例點比當前最近點距離目標點更近,則以該實例點爲“當前最 近點”。
  • 當前最近點一定存在於該結點一個子結點對應的區域。檢查該子結點的父結點的 另一子結點對應的區域是否有更近的點。具體地,檢查另一子結點對應的區域是否與以目標 點爲球心、以目標點與“當前最近點”間的距離爲半徑的超球體相交。 如果相交,可能在另一個子結點對應的區域內存在距目標點更近的點,移動到另一個子 結點。接着,遞歸地進行最近鄰搜索; 如果不相交,向上回退。

(4)當回退到根結點時,搜索結束。最後的“當前最近點”即爲x的最近鄰點。

總結該搜索算法:輸入實例,自上而下直到葉結點,該葉結點所在的空間區域也是輸入實例所分到的空間區域,但該區域內的結點不一定與輸入實例最接近。因此又要自下而上的去判斷是否有更接近的點。

如果實例點是隨機分佈的,kd樹搜索的平均計算複雜度是O(logN)O(logN),這裏N是訓練實例 數。kd樹更適用於訓練實例數遠大於空間維數時的k近鄰搜索。當空間維數接近訓練實例數時,它的效率會迅速下降,幾乎接近線性掃描。

在大量訓練數據時,比較的次數大大減少,因爲從空間上去看,它與最接近的點形成的一個球體,在超空間上是微不足道的,我們通過二叉樹的存儲,對空間的劃分,能極大的優化我們找到最鄰近點的時間。

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