李航-統計學習方法-筆記-3:KNN


KNN算法

基本模型:給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的k個實例。這k個實例的多數屬於某個類,就把輸入實例分為這個類。

KNN沒有顯式的學習過程。

KNN使用的模型實際上對應於特征空間的划分。特征空間中,對每個訓練實例點\(x_i\),距離該點比其它點更近的所有點組成一個區域,叫作單元(cell)。每個訓練實例擁有一個單元。所有的訓練實例點的單元構成對特征空間的一個划分。如下圖所示。

三要素:KNN模型由三個基本要素——距離度量,K值選擇,分類決策決定。當三要素和訓練集確定后,對任何一個新的輸入實例,它所屬的類唯一地確定。

KNN三要素之1——距離度量

由不同的距離度量所確定的最近鄰點是不同的。

KNN的特征空間一般是n維實數向量空間\(R^n\),使用的距離是歐氏距離。但也可以是其他距離,如更一般的\(L_p\)距離。設\(x_i\)為第\(i\)個樣本,\(n\)維向量,\(x_i = (x_i^{(1)}, x_i^{(2)}, ..., x_i^{(n)})^T\),則

\[L_p(x_i, x_j) = (\sum_{l=1}^{n} |\ x_i^{(l)} - x_j^{(l)}\ |^{\ p})^{\frac{1}{p}}, p \geqslant 1 \\ L_\infty(x_i, x_j) = \max_{l} |x_i^{(l)} - x_j^{(l)}|\]

\(p=2\)時稱為歐式距離,\(p=1\)稱為曼哈頓距離。下圖是二維空間中,與原點的\(L_p\)距離為1的圖形。

\(p=1\)時,\(|x| + |y| = 1\)
\(p=2\)時,\(x^2 + y^2 = 1\)
\(p=\infty\)時,\(\max(|x|, |y|) = 1\)

KNN三要素之2——K值選擇

K值的選擇會對KNN結果產生重大影響

選擇較小的K值
如果選擇較小的K值,相當於用較小的鄰域中的訓練實例進行預測,只有與輸入實例較近的訓練實例才會對預測結果起作用。“學習”的近似誤差會減小。

缺點是“學習”的估計誤差會增大,預測結果對近鄰的實例點非常敏感。如果鄰近的實例點恰巧是噪聲,預測就會出錯。

K值的減小意味着整體模型變得復雜,容易發生過擬合。

選擇較大的K值
如果選擇較大的K值,相當於用較大鄰域中的訓練實例進行預測。其優點是減小學習的估計誤差,缺點是近似誤差會增大。這時離輸入實例較遠的訓練實例起預測作用,使預測發生錯誤。

K值的增大意味着整體模型變得簡單。K=N時,無論輸入實例是什么,都將簡單地預測它屬於在訓練實例中最多的類,這時模型過於簡單,完全忽略訓練實例中的大量有用信息,是不可取的。

在應用中
K值一般取一個比較小的數值,通常采用交叉驗證法來選取最優的K值。

KNN三要素之3——分類決策規則

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

KNN的實現:kd樹

kd樹:KNN最簡單的實現方法是線性掃描。這時要計算輸入實例與每一個訓練實例的距離。當訓練集很大時,計算非常耗時,這種方法是不可行的。

為了提高KNN搜索的效率,可以考慮使用特殊的結構存儲訓練數據,以減少計算距離的次數。具體方法很多,下面介紹其中的kd樹方法。

構造kd樹:kd樹是一種對k維空間中的實例點進行存儲以便對其進行快速檢索的樹形數據結構。kd樹是二叉樹,表示對k維空間的一個划分。構造kd樹相當於不斷地用垂直於坐標軸的超平面將k維空間切分,構成一系列的k維超矩形區域。kd樹的每個結點對應於一個k維超矩形區域。

通常,依次選擇坐標軸對空間切分,選擇訓練實例點在選定坐標軸上的中位數為切分點,這樣得到的kd樹是平衡的。注意,平衡的kd樹搜索時的效率未必是最優的。

算法3.2 (構造平衡kd樹)

輸入:k維空間數據集\(T = \{x_1, x_2, ..., x_N\}\),其中\(x_i = (x_i^{(1)}, x_i^{(2)}, ..., x_i^{(k)})^T\)\(i = 1, 2, ..., N\)

輸出:kd樹

(1)開始:構造根結點,根結點對應於包含\(T\)的k維空間的超矩陣區域。

選擇\(x^{(1)}\)為坐標軸,以\(T\)中所有實例的\(x^{(1)}\)坐標的中位數為切分點,將根結點對應的超矩形區域切分為兩個子區域。切分由通過切分點並與坐標軸\(x^{(1)}\)垂直的超平面實現。

由根結點生成的深度為1的左右子結點:左結點對應坐標\(x^{(1)}\)小於切分點的子區域,右結點對應坐標\(x^{(1)}\)大於切分點的子區域。將落在切分超平面上的實例點保存在根結點。

(2)重復:對深度為\(j\)的結點,選擇\(x^{(j)}\)為切分的坐標軸,\(l = j(mod \ k) + 1\),以該結點的區域中所有實例的\(x^{(l)}\)坐標的中位數為切分點。

由該結點生成深度為\(j+1\)的左右子結點:左結點對應坐標\(x^{(l)}\)小於切分點的子區域,右結點對應坐標\(x^{(l)}\)大於切分點的子區域。將落在切分超平面上的實例點保存在該結點。

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

搜索kd樹:利用kd樹可以省去對大部分數據點的搜索,從而減少搜索的計算量。這里以最近鄰為例加以敘述。

算法3.3 (用kd樹的最近鄰搜索)

輸入:已構造的kd樹;目標點x;
輸出:x的最近鄰

(1)從根結點出發,遞歸地向下訪問kd樹。若目標點x當前維的坐標小於切分點的坐標,則左移,否則右移,直到子結點為葉結點。
(2)以此葉結點為“當前最近點”。
(3)遞歸向上回退,在每個結點進行以下操作:

(a)若該結點保存的實例點比“當前最近點”離目標點更近,則以該實例點為“當前最近點”。

(b)檢查另一子結點對應的區域是否與“以目標點為球心,以目標前與‘當前最近點’的距離為半徑的超球體”相交。

如果相交,可能在另一子結點對應的區域內存在距離目標點更近的點,移動到另一結點,遞歸搜索。

如果不相交,向上回退。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM