1. 程式人生 > >統計學習方法——K近鄰模型

統計學習方法——K近鄰模型

0. 寫在前面

在這一講的討論班中,我們將要討論一下K近鄰模型。可能有人會說,K近鄰模型有什麼好寫的,那分明就是一個最簡單的機器學習模型,哦,不,連機器學習也算不上的演算法吧。但是這裡,我想提醒的是,我們要討論的,不僅僅是簡單的K近鄰模型,而是和它相關的一些有困惑的話題。

1. K近鄰定義

k近鄰演算法,也成為KNN演算法,是一種基本分類與迴歸演算法。它在基本實現上,使用的是多數表決的惰性學習過程。也就是它實際上是基於記憶的學習方法。它並沒有學出一個什麼判別模型,其實也沒有像貝葉斯那樣算出一個新東西,而是簡單的統計距離目標點最近的K個節點裡數目最多的標籤賦予目標點。就是這麼一個簡單的演算法。我們這裡給出一個最樸素的K近鄰演算法:
K近鄰演算法


輸入:訓練資料集T=(x1,y1),(x2,y2),...(xN,yN)
輸出:例項x所屬的類y
演算法步驟:
(1)根據給定的距離度量,在訓練集T中找出與x最近鄰的k個點,涵蓋這k個點的x的鄰域記作Nk(x)
(2)在Nk(x)中根據分類決策規則,如多數表決決定x的類別y。

1.k近鄰模型

k近鄰模型的核心就是使用一種距離度量,獲得距離目標點最近的k個點,根據分類決策規則,決定目標點的分類。

就是這麼三句話,決定了k近鄰模型的三個基本要素——距離度量、k值的選擇、分類決策規則。

2. 距離度量

一個點和一個點之間的距離,無論是什麼計算方式,基本上離不開Lp距離。我們熟知的歐式距離,則是L

2正規化,也就是p=2的情況,而另一個很熟悉的距離曼哈頓距離,則是L1正規化。Lp距離的定義如下:

Lp(xi,xj)=(l=1n|x(l)ix(l)j|p)1p
當然,如果p→∞的時候,就叫做切比雪夫距離了。
除了這個閔可夫斯基距離集合外,還有另外的距離評估體系,例如馬氏距離、巴氏距離、漢明距離,這些都是和概率論中的統計學度量標準相關。而像夾角餘弦、傑卡德相似係數、皮爾遜係數等都是和相似度有關的。

因此,簡單說來,各種“距離”的應用場景簡單概括為,空間:歐氏距離,路徑:曼哈頓距離,國際象棋國王:切比雪夫距離,以上三種的統一形式:閔可夫斯基距離,加權:標準化歐氏距離,排除量綱和依存:馬氏距離,向量差距:夾角餘弦,編碼差別:漢明距離,集合近似度:傑卡德類似係數與距離,相關:相關係數與相關距離。

這其實只是個度量標準而已,應當根據資料特徵選擇相應的度量標準。

3. k值的選擇

k值的選擇也很有必要,因為k的選擇小了,則近似誤差會減小,但估計誤差會增大;相反k的選擇大了,則近似誤差會增大,估計誤差會減小。這一點,我們會在近似誤差與估計誤差那一部分進一步講解。

4. 分類決策規則

k近鄰的分類決策規則是最為常見的簡單多數規則,也就是在最近的K個點中,哪個標籤數目最多,就把目標點的標籤歸於哪一類。

實際上,也是可行的,也是唯一可行的分類決策規則。無論是全體一致規則(一票否決制)還是絕對多數規則,都不能在任何時候對目標點做出確切的預測,更不用提少數原則這種不靠譜的決策規則了。

當然,這也是有理論依據的:
如果分類的損失函式為0-1損失函式,則誤分類的概率是:

P(Yf(X))=1P(Y=f(X))
也就是說誤分類率為:
1kI(yicj)=11kI(yi=cj)
要使得誤分類率最小,也就是經驗風險最小,就要使得1kI(yi=cj)最大,所以多數表決規則等價於經驗最小化。

其實,還可以使用權重加權的多數表決,對於K個最近點,根據其距離的遠近來進行加權統計,從而獲得一個折中的效果。本方法為個人所想,不知有沒有實踐來論證。

2. 估計誤差與近似誤差

1.估計誤差

估計誤差我們應該在初中或者高中物理的時候就已經學過了,也許只是忘記了而已。估計誤差主要包含四個部分:系統誤差、隨機誤差、過失誤差、精密度和精確度。

就我們K近鄰來講,如果K值比較小,那麼例如像噪點,錯誤的資料,不恰當的度量標準以及資料本身的缺陷等,都會很大程度上影響最終的結果,而如果K值比較大,那麼以上缺陷就會盡可能的平均,從而減小對最終結果的影響。

2.近似誤差

近似誤差與估計誤差的描述物件不同,估計誤差度量的是預測結果與最優結果的相近程度,而近似誤差是度量與最優誤差之間的相似程度。就K近鄰演算法來講,K值越小,那麼與目標點相近的點的標籤對於其目標點的影響也就越大,其標籤的一致性就越高,這樣近似誤差就會變小。

3.兩者區別與聯絡

總而言之,近似誤差指的是目標點對於其原樣本點的可信度,誤差越小,對於原樣本點的信任度越高,也就是說,目標點可能只需要對最近的點確認一次就可以標註自己的標籤,而無需去詢問其他目標點。而估計誤差則是原模型本身的真實性,也就是說,該模型所表現出的分類特性,是不是就是真實的分類特性,比如有噪點影響,有錯誤資料記錄,或者本身資料分佈就不是很好,都會是影響估計誤差的因素,而詢問的點越多,那麼這些壞點對於目標點的標籤影響就越小。

這就像是你向別人徵求意見,你對於別人意見的採納率越高,則別人意見的近似誤差越小。而別人意見越符合實際情況,則估計誤差越小。這麼說應該有個大致的理解了吧。

3. K近鄰的實現kd樹

我們通過上述描述,應該清楚了一個K近鄰演算法的基本運作思想,由於沒有訓練過程,沒有預測模型,使得K近鄰演算法的計算量十分巨大,因為它需要把所有的樣本點都和目標點進行一次距離度量,很難適應大規模的資料樣本。那麼kd樹就應運而生了。

1. kd樹定義

kd樹,指的是k-dimensional tree,是一種分割K維資料空間的資料結構,主要用於多維空間關鍵資料的搜尋。kd樹是二進位制空間分割樹的特殊情況。

索引結構中相似性查詢有兩種基本的方式:一種是範圍查詢,另一種是K近鄰查詢。範圍查詢就是給定查詢點和查詢距離的閾值,從資料集中找出所有與查詢點距離小於閾值的資料;K近鄰查詢是給定查詢點及正整數K,從資料集中找到距離查詢點最近的K個數據,當K=1時,就是最近鄰查詢。

而對於這類問題,解決辦法有兩類:一類是線性掃描法,即將資料集中的點與查詢點逐一進行距離比較,也就是窮舉,缺點很明顯,就是沒有利用資料集本身蘊含的任何結構資訊,搜尋效率較低,第二類是建立資料索引,然後再進行快速匹配。因為實際資料一般都會呈現出簇狀的聚類形態,通過設計有效的索引結構可以大大加快檢索的速度。索引樹屬於第二類,其基本思想就是對搜尋空間進行層次劃分。根據劃分的空間是否有混疊可以分為Clipping和Overlapping兩種。前者劃分空間沒有重疊,其代表就是k-d樹;後者劃分空間相互有交疊,其代表為R樹。

但是要說明的是kd樹的樸素用法,只能解決最近鄰演算法,對於K近鄰演算法還需要改進後才能夠使用,這裡我們放到最後再講。

2. kd樹的構造演算法

構造kd樹的方法根據不同的決策規則分為很多種,但最終都是平衡二叉樹。具體方法如下:
1. 構造根節點,使根節點對應用於K維空間中包含所有例項點的超矩形區域。
2. 通過下面的遞迴方法,不斷切分K維空間,生成子節點:
1) 在超矩形區域上選擇一個座標軸和該座標上的一個切分點,確定一個超平面。
2)以經過該點且垂直於該座標軸做一個超平面,該超平面將當前的超矩形區域切分成左右兩個子區域,例項被分到兩個子區域。
3.該過程直到子區域內無例項時終止(終止時的節點為子節點)。
在此過程中將例項集合儲存在相應的節點上。

在這個方法中,有兩個部分時可以進行調節的,第一個部分就是選取的維度的順序,另一個部分就是選取分割點的度量標準。

在第一部分,我們可以使用順序取樣,即從第1維,第2維,第n維一直到分割完畢為止。也可以使用最大方差所在的維度,也可以使用維度主次優先順序為順序,以此等等。

在第二部分,我們可以使用的是所在維度的中位數作為切分點,也可以使用中值作為切分點,以此等等。

這裡,我們使用的是最樸素的方法,維度採用順序取樣,切分點選取中位數作為切分點,來描述一下kd樹構造演算法。

kd樹構造演算法
輸入:k維空間資料集T = x1,x2,,xN,其中,xi=(x(1)i,x(2)i,,x(k)i)i=1,2,,N
輸出:kd樹
開始:

  1. 構造根節點(根節點對應於包含T的K維空間的超矩形區域)
    選擇x(1)為座標軸,以T中所有例項的x(1)座標的中位數為切分點,這樣,經過該切分點且垂直與x(1)的超平面就將超矩形區域切分成2個子區域。儲存這個切分點為根節點。

  2. 重複如下步驟:
    對深度為j的節點選擇x(l)為切分的座標軸,l=j(modk)+1 ,以該節點區域中所有例項的x(l)座標的中位數為切分點,將該節點對應的超平面切分成兩個子區域。切分由通過切分點並與座標軸x(l)垂直的超平面實現。儲存這個切分點為一般節點。

  3. 直到兩個子區域沒有例項存在時停止。

    具體的例子大家可以看一下書,我們的重點不在於此。對於書上的例子,一句話概括為:偶數層以第一維為二分檢索樹,奇數層以第二維為二分檢索樹。對於n個例項的k維資料來說,建立kd-tree的時間複雜度為O(k×n×logn)。

    而對於kd樹的插入刪除等不在我們這堂課的討論範圍內,大家可以課後自己查閱資料,因為這方面比較複雜。

    對於kd樹的插入來說,就相當於一個隨時改變比較維度的二叉檢索樹:在偶數層比較x座標值,而在奇數層比較y座標值。當我們到達了樹的底部,(也就是當一個空指標出現),我們也就找到了結點將要插入的位置。

    這一部分感興趣的同學可以更深入的研究一下。

3. kd樹的檢索演算法

既然已經建成了kd樹了,那麼kd樹的檢索演算法就被提上議程,這次,我們使用的就是針對上面的kd樹構建演算法而寫出的kd樹檢索演算法:

kd樹最近鄰搜尋演算法
輸入:已構造的kd樹:目標點x;
輸出:x的最近鄰。

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

這樣,其實只要把握住了這麼個幾個部分,首先,是當前最近點的初始值的確定,第二,如何回溯比較,第三,如何搜尋可能存在的解。

總而言之,若例項點隨機分佈,則KD樹搜尋的時間複雜度為O(logN),N為訓練例項數。就具體而言,KD樹更適用於訓練例項數遠大於空間維度的K近鄰搜尋。一般是20維以下的,效果比較好。

4. 關於K近鄰演算法的若干其他問題

關於K近鄰演算法還有很多更加深入的問題,我們在下面進行簡要的討論,在以後有時間時,我們會針對某些具體的問題,做出專題講解。

1. K近鄰演算法與K-means聚類演算法的區別

K近鄰演算法和K均值聚類演算法看起來十分相似,不過還是有一些區別的,我們這裡給出一張表:

KNN K-Means
KNN是分類演算法 K-Means是聚類演算法
KNN是監督學習 K-Means非監督學習
沒有明顯的前期訓練過程 有明顯的前期訓練過程
K的含義指的是判斷依據來源個數 K的含義是集合的分類數目

而這兩者都用到了NN演算法,一般使用kd樹來實現。

2. 如何使用kd樹來進行K近鄰查詢

這道題是課後習題第三題,網上說通過維護一個包含 k 個最近鄰結點的佇列來實現,就我個人想法而言,實際上,主要是看這些佇列裡的值從何而來。我認為,這些較近的點是來源於那些最近鄰點可能存在的點的集合中,也就是最近鄰點的父節點以及跨越了超球面的那些區域內的點及他們的父節點。

也就是說,只需要改動這麼幾個步驟,就是在與最近鄰點相比較的所有節點都可以存入到k近鄰佇列中,然後佇列未滿時,其最短距離為∞,佇列已滿時,其最短距離為佇列中最長的結點的距離。一旦新來的結點小於這個最長距離,則刪除最長結點,插入新來的結點,並且更新佇列的最短距離。

一般來講,如果k比較小,那麼常規kd樹檢索已經足夠查到K個近鄰點。但是如果發生了沒有找全k個最小的,可以在另一半的樹中查詢剩下的近鄰點。

3. 課後習題3.1

課後題目3.1描述如下:

參照圖3.1,在二維空間中給出例項點,畫出k為1和2時的k近鄰法構成的空間劃分,並對其進行比較,體會k值選擇與模型複雜度及預測準確率的關係。

我們不去考慮k為1的情況,因為k為1的情況我們可以很容易從原圖中獲取,我們來考慮k=2時候的空間劃分。

我們都知道,在2維空間中,我們通常使用的是一條線來進行2分類,這也是最優的分類方式(每次減小樣本空間一半),那麼在這個題目中,如果k=2的時候,我們考慮最近的3個點開始,其實無論是多少都沒關係的,只不過時間複雜度比較大,但是我們通常不會選取過多的候選點.

現在,這條線就是2個點的連線的垂直平分線,如下圖所示:

相關推薦

統計學習方法——K近鄰模型

0. 寫在前面 在這一講的討論班中,我們將要討論一下K近鄰模型。可能有人會說,K近鄰模型有什麼好寫的,那分明就是一個最簡單的機器學習模型,哦,不,連機器學習也算不上的演算法吧。但是這裡,我想提醒的是,我們要討論的,不僅僅是簡單的K近鄰模型,而是和它相關的一些有

統計學習方法 k 近鄰演算法(附簡單模型程式碼)

1. k 近鄰演算法 k近鄰法(k-nearest neighbor, k-NN) 是一種基本分類與迴歸方法。  k近鄰法的輸入為例項的特徵向量, 對應於特徵空間的點; 輸出為例項的類別, 可以取多類。 k近鄰法假設給定一個訓練資料集, 其中的例項類別已定。 分類時, 對新的例項, 根

統計學習筆記——k近鄰法與kd樹

在使用k近鄰法進行分類時,對新的例項,根據其k個最近鄰的訓練例項的類別,通過多數表決的方式進行預測。由於k近鄰模型的特徵空間一般是n維實數向量,所以距離的計算通常採用的是歐式距離。關鍵的是k值的選取,如果k值太小就意味著整體模型變得複雜,容易發生過擬合,即如果鄰近的例項點

統計學習方法(2)——K近鄰模型

本部落格只記錄實現李航老師《統計學習方法》中討論的演算法,具體的演算法流程和推導,請看書中相關章節 這篇部落格用最簡單的方法實現了K近鄰模型。 之後會利用KD樹實現K-近鄰演算法。 #!/usr/bin

統計學習方法》筆記三 k近鄰

學習 屬於 基本 mage 容易 向量 規則 統計學 圖片 k近鄰是一種基本分類與回歸方法,書中只討論分類情況。輸入為實例的特征向量,輸出為實例的類別。k值的選擇、距離度量及分類決策規則是k近鄰法的三個基本要素。 k近鄰算法 給定一個訓練數據集,對新的輸入實例,在訓練數

統計學習方法-李航-筆記總結】三、k近鄰

本文是李航老師《統計學習方法》第三章的筆記,歡迎大佬巨佬們交流。 主要參考部落格:https://blog.csdn.net/u013358387/article/details/53327110 主要包括以下幾部分: 1. k近鄰演算法 2. k近鄰模型 3. kd樹 1.

統計學習方法筆記(一):K近鄰法的實現:kd樹

  實現k近鄰演算法時,首要考慮的問題是如何對訓練資料進行快速的k近鄰搜尋。這點在特徵空間的維數大於訓練資料容量時尤為重要。 構造kd樹   kd 樹是一種對k為空間中的例項點進行儲存的一邊對其進行快速檢索的樹形資料結構。kd樹是二叉樹,表示對k維空間的一個劃分(parti

統計學習方法c++實現之二 k近鄰

統計學習方法c++實現之二 k近鄰演算法 前言 k近鄰演算法可以說概念上很簡單,即:“給定一個訓練資料集,對新的輸入例項,在訓練資料集中找到與這個例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入分為這個類。”其中我認為距離度量最關鍵,但是距離度量的方法也很簡單,最長用的就是歐氏距離,其他的距離

統計學習方法(李航)》k近鄰 學習筆記

作者:jliang https://blog.csdn.net/jliang3   1.重點歸納 1)k近鄰是一種基本分類與迴歸方法,不具有顯式的學習過程。 2)模型由三個基本要素決定:距離度量、k值選擇和分類決策規則。 3)k近鄰法最簡單的實現方法是線性掃描,當

統計學習方法k近鄰 kd樹的python實現

前言 程式碼可在Github上下載:程式碼下載 k近鄰可以算是機器學習中易於理解、實現的一個演算法了,《機器學習實戰》的第一章便是以它作為介紹來入門。而k近鄰的演算法可以簡述為通過遍歷資料集的每個樣本進行距離測量,並找出距離最小的k個點。但是這樣一來一旦樣本數目龐大的時候

統計學習方法筆記(三)K近鄰演算法

K近鄰法(KNN)是一種基本的分類和迴歸的方法,KNN的基本思想是給出一定數量帶有標籤的訓練樣本,使用這些訓練樣本將特徵空間劃分成許多的子空間,當一個新的測試樣本進來以後,這個測試樣本一定會落在一個超矩形區域內部,然後找到距離這個測試樣本最近的K個訓練樣本,用這些訓練樣本的

《李航:統計學習方法》--- K近鄰演算法(KNN)原理與簡單實現

k近鄰演算法簡單,直觀:給定一個訓練資料集,對新的輸入例項,在訓練集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類。 如上圖所示,藍色正方形表示一個類別,紅色三角形表示另一個類別,綠色圓圈表示待分類的樣本。按照KNN演

統計學習方法學習筆記(三)——K近鄰

  K近鄰法對於已標記類別,在新的例項樣本進行分類時,根據離其最近的K個訓練樣本例項,統計每類的相應的個數,通過多數表決等方式進行預測。舉個最簡單的例子,就是當K=1時,就是我們所熟悉的最近鄰方法(NN)。   首先,我們需要判斷離新的例項樣本最近的K個訓

統計學習方法[6]——邏輯回歸模型

算法 ima 題解 問題 回歸 統計學習 同步 轉換 步長 統計學習方法由三個要素組成:方法=模型+策略+算法 模型是針對具體的問題做的假設空間,是學習算法要求解的參數空間。例如模型可以是線性函數等。 策略是學習算法學習的目標,不同的問題可以有不同的學習目標,例如經驗風險最

統計學習方法-李航-筆記總結】十、隱馬爾可夫模型

本文是李航老師《統計學習方法》第十章的筆記,歡迎大佬巨佬們交流。 主要參考部落格: https://www.cnblogs.com/YongSun/p/4767667.html https://www.cnblogs.com/naonaoling/p/5701634.html htt

統計學習方法-李航-筆記總結】六、邏輯斯諦迴歸和最大熵模型

本文是李航老師《統計學習方法》第六章的筆記,歡迎大佬巨佬們交流。 主要參考部落格: http://www.cnblogs.com/YongSun/p/4767100.html https://blog.csdn.net/tina_ttl/article/details/53519391

[Python-程式碼實現]統計學習方法之感知機模型

內容簡介 感知機模型 - 手寫 Coding 使用手寫模型進行鳶尾花分類 使用 sklearn 中的感知機進行鳶尾花分類 感知機模型 - 手寫 Coding class Model: """感知機模型""" def __init__(s

統計學習方法_隱馬爾可夫模型HMM實現

這裡用到的資料集是三角波,使用長度20的序列訓練100次,生成長度為100的序列。HMM的初始化非常重要,這裡採用隨機初始化。 #!/usr/bin/env python3 # -*- coding: utf-8 -*- import csv import random

統計學習方法(李航)》邏輯斯蒂迴歸與最大熵模型學習筆記

作者:jliang https://blog.csdn.net/jliang3   1.重點歸納 1)線性迴歸 (1)是確定兩種或以上變數間相互依賴的定量關係的一種統計分析方法。 (2)模型:y=wx+b (3)誤差函式: (4)常見求解方法 最小

統計學習方法——模型與問題分類

0. 寫在前面 在這一講中,我們主要介紹一下模型的類別以及問題的類別,並對課後習題進行相應的分析。 1. 模型的型別 我們知道,統計學習主要包括監督學習、非監督學習、半監督學習和強化學習。那麼在統計學習方法一書中主要涉及的是監督學習。而監督學習主要分為