機器學習入門筆記(三):K近鄰算法

一.K近鄰算法的基本概念

k近鄰算法簡單、直觀:給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例 最鄰近的k個實例,這k個實例的多數屬於某個類,就把該輸入實例分爲這個類. 下面先敘述k近鄰算法,然後再討論其細節.

1.1 K近鄰算法實現

輸入:
(1) 訓練樣本集 D = {(xi, yi), i = 1, 2, …, N}
     其中 xi 爲第i個訓練樣本的特徵向量, yi ∈ Y = {c1, c2, …, ck} 爲實例的類別標號

(2) 觀測樣本x

輸出: 測樣本 x 所屬的類別 y.

STEP0. 訓練集 D 的輸入部分預處理,並記錄預處理的使用參數
STEP1. 指定 距離度量,並 選擇K值
STEP2. 訓練集D內找到預處理的樣本 x 的 前K個近鄰 ,記爲 Nk(x)

                                                  Nk(x) = Nk,1(x) ∪…∪Nk,c(x)
                                                  Nk,i(x)-------x的前K個近鄰中,屬於第i類的部分

STEP3. 結合指定的 分類規則, 對 x 的類別y 進行預測:
                                                 在這裏插入圖片描述

二.K近鄰分類三要素

k近鄰法使用的模型實際上對應於對特徵空間的劃分.模型由三個基本要素—— 距離度量、k值的選擇和分類決策規則 決定,

2.1 距離度量

特徵空間中兩個實例點的距離是兩個實例點相似程度的反映. k近鄰模型的特徵空間一般是n維實數向量空間Rn .使用的距離是 歐氏距離,但也可以是其他距離,如更一般的 Lp距離(Ip distance)Minkowski距離(Minkowski distance).

設特徵空間 X 是n維實數向量空間Rn,xi,xj∈ X,xi = (xi1, xi2, …, xin),xj = (xj1, xj2, …, xjn),xi,xj的 Lp距離定義爲:
                                                 在這裏插入圖片描述

這裏p ≥ 1. 當p = 2時,稱爲 歐氏距離(Euclidean distance),
                                                  在這裏插入圖片描述

當p=1時,稱爲 曼哈頓距離(Mahattan distance),即
                                                 在這裏插入圖片描述
當p = ∞時,它是 各個座標距離的最大值,即
                                                  在這裏插入圖片描述

下圖給出了二維空間中 p 取不同值時,與原點的Lp距離爲1 (Lp = 1) 的點的圖形.
                                                 在這裏插入圖片描述
下面的例子說明,由不同的距離度量所確定的最近鄰點是不同的.
例3.1 已知二維空間的3個點x1 = (1, 1) ,x2 = (5, 1), x3 = (4, 4),試求在p取不同值時,Lp 距離下 x1 的最近鄰點.

解: 因爲 x1 和 x2 只有第二維上值不同,所以p爲任何值時,Lp(x1, x2) = 4. 而
       L1(x1, x3) = 6,L2(x1, x3) = 4.24, L3(x1, x3) = 3.78, L4(x, x) = 3.57
於是得到: p等於1或2時,x2是 x1 的最近鄰點: p大於等於3時,x3 是 x1 的最近鄰點.

2.2 K值的選擇

k值的選擇會對k近鄰法的結果產生重大影響.

如果選擇 較小的k值,就相當於用較小的鄰域中的訓練實例進行預測,“學習”的近似誤差(approximation error)會減小,只有與輸入實例較近的(相似的)訓練實例纔會對預測結果起作用.但 缺點是“學習”的估計誤差(estimation error)會增大,預測結果會對近鄰的實例點非常敏感.如果鄰近的實例點恰巧是噪聲,預測就會出錯.換句話說,k值的減小就意味着整體模型變得複雜,容易發生過擬合.

如果選擇 較大的k值,就相當於用較大鄰域中的訓練實例進行預測. 其優點是可以減少學習的估計誤差.但缺點是學習的近似誤差會增大.這時與輸入實例較遠的(不相似的)訓練實例也會對預測起作用,使預測發生錯誤. k 值的增大就意味着整體的模型變得簡單.

如果k=N,那麼無論輸入實例是什麼,都將簡單地預測它屬於在訓練實例中最多的類.這時,模型過於簡單,完全忽略訓練實例中的大量有用信息,是不可取的.

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

2.2.1 基於m-fold cross validation的 K值選擇

以單輪 m-fold cross validation爲例:

STEP1. 訓練集隨機打亂,均分成 m 等份,每一份的訓練樣本數目 N/m.

STEP2. 對於每個備選 K值.
1). for i =1, …, m do
     拿出第 i 份作爲 驗證集,其餘m - 1份構成 估計集
     利用 估計集,對 驗證集的每個樣本進行類別預測,得 預測錯誤率 Erri(K)

2). 估計對應於該備選K值的:
在這裏插入圖片描述

表示爲 μErr(k) ± σErr(k)

STEP3. 取最小μErr(k)對應的K值 爲最終的選擇結果;
             若 同時有多個k值最小的μErr(k),則取 較小σErr(k)對應的K值

2.3 決策規則

2.3.1 多數表決規則( majority voting rule)

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

多數表決規則(majority voting rule) 有如下解釋: 如果分類的損失函數爲 0-1 損失函數,分類函數爲:
                                                  在這裏插入圖片描述

那麼誤分類的概率是
                                        在這裏插入圖片描述

對給定的實例x∈X, 其最近鄰的 k 個訓練實例點構成集合 Nk(x) 如果涵蓋 Nk(x) 的區域的類別是cj,那麼誤分類率是:
                                   在這裏插入圖片描述

所以多數表決規則等價於 經驗風險最小化.

2.3.2 基於距離的加權投票

觀測 x 的 K個近鄰: Nk(x) = Nk,1(x)∪…∪NK,C(x)
在這裏插入圖片描述
在這裏插入圖片描述

三.k近鄰算法的實現:kd樹

實現k近鄰法時,主要考慮的問題是如何對訓練數據進行 快速k近鄰搜索.這點在特徵空間的維數大及訓練數據容量大時尤其必要.

k近鄰法最簡單的實現方法是 線性掃描(linear scan).這時要計算輸入實例與每一個訓練實例的距離.當訓練集很大時,計算非常耗時,這種方法是不可行的.爲了提高k近鄰搜索的效率,可以考慮使用特殊的 結構存儲訓練數據,以減少計算距離的次數.具體方法很多,下面介紹其中的 kd樹(kd tree)方法”.

3.1 構造kd樹

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

構造kd樹的方法如下: 構造根結點,使根結點對應於 k 維空間中包含所有實例點的超矩形區域;通過下面的遞歸方法,不斷地對k維空間進行切分,生成子結點.在超矩形區域(結點),上選擇一個座標軸和在此座標軸上的一個切分點,確定一個超平面, 這個超平面通過選定的切分點並垂直於選定的座標軸,將當前超矩形區域 切分爲左右兩個子區域(子結點); 這時,實例被分到兩個子區域.這個過程 直到子區域內沒有實例時終止(終止時的結點爲葉結點).在此過程中,將實例保存在相應的結點上。

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

下面給出構造kd樹的算法:
在這裏插入圖片描述

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

         選擇 x 爲座標軸,以T中所有實例的 x 座標的中位數爲切分點,將根結點對應的超矩形區域切分爲兩個子區域.切分由通過切分點並與座標軸 x 垂直的超平面實現.

         由根結點生成深度爲1的左、右子結點: 左子結點對應座標 x 小於切分點的子區域,右子結點對應於座標 x 大於切分點的子區域.

         將落在切分超平面上的實例點保存在 根結點.

(2)重複:對深度爲 j 的結點,選擇 xL 爲切分的座標軸,L= j(modk)+1,以該結點的區域中所有實例的 x 座標的 中位數爲切分點,將該結點對應的超矩形區域切分爲兩個子區域。切分由通過切分點並與座標軸 xL 垂直的超平面實現.

         由該結點生成深度爲j+1的左、右子結點:左子結點對應座標x(小於切分點的子區域,右子結點對應座標x(I)大於切分點的子區域.

         將落在切分超平面上的實例點保存在該結點.
(3)直到兩個子區域沒有實例存在時停止,從而形成kd樹的區域劃分.

在這裏插入圖片描述
在這裏插入圖片描述

3.2 搜索kd樹

下面介紹如何利用 kd 樹進行 k近鄰搜索.可以看到,利用kd樹可以省去對大部分數據點的搜索,從而減少搜索的計算量.這裏以最近鄰爲例加以敘述,同樣的方法可以應用到k近鄰。給定一個目標點,搜索其最近鄰。首先找到包含目標點的葉結點;然後從該葉結點出發,依次回退到父結點;不斷查找與目標點最鄰近的結點,當確定不可能存在更近的結點時終止。 這樣搜索就被限制在空間的局部區域上,效率大爲提高.

包含目標點的葉結點對應包含目標點的最小超矩形區域。以此葉結點的實例點作爲當前最近點,目標點的最近鄰一定在以目標點爲中心並通過當前最近點的超球體的內部。然後返回當前結點的父結點,如果父結點的另一子結點的超矩形區域與超球體相交,那麼在相交的區域內尋找與目標點更近的實例點。如果存在這樣的點,將此點作爲新的當前最近點,算法轉到更上一級 的父結點,繼續上述過程。如果父結點的另一子結 點的超矩形區域與超球體不相交,或不存在比當前最近點更近的點,則停止搜索.

下面敘述用kd樹的最近鄰搜索算法:

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

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

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

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

下面通過一一個例題來說明搜索方法.
在這裏插入圖片描述

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