k-近鄰算法介紹

jopen 9年前發布 | 18K 次閱讀 算法

  k-近鄰算法是一種簡單的算法,基本的算法思想是通過相似性的比較,最終得到最相似的k類中最為相似的。

  在k-近鄰算法中有幾個很重要的地方:第一是k的取值,其實k的取值就是模型的選擇,模型的選擇可以采用交叉驗證的方式或者通過正則化的方式,顯然這里是 采用交叉驗證的方式。第二點就是實例的距離度量。第三是分類決策規則的選取。kNN唯一的也可以說最致命的缺點就是判斷一篇新文檔的類別時,需要把它與現 存的所有訓練文檔全都比較一遍,這個計算代價并不是每個系統都能夠承受的 (比如我將要構建的一個文本分類系統,上萬個類,每個類即便只有20個訓練樣本,為了判斷一個新文檔的類別,也要做20萬次的向量比較!)。一些基于 kNN的改良方法比如Generalized Instance Set就在試圖解決這個問題。

    k-近鄰算法簡單、直觀:給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的k個實例,這k個實例的多數屬于某個類,就把該輸入實例分為這個類

  算法如下所示:


k-近鄰算法介紹    

    上文提到的k值的選取:k值如果選擇過小,就相當于用較小的鄰域實例進行預測,這樣會減小近似誤差,但是同時也會使得模型對鄰域實例變得異常敏感,如果鄰 域實例恰巧是噪聲,那該實例被分錯的可能性就會變得異常大(增大了估計誤差)。換句話說,較小的k值會使得模型變得復雜,容易發生過擬合現象。

    k值選取過大,離預測實例較遠的數據也會起作用,估計誤差會減少,但是這會增加結果的近似誤差,使 預測發生錯誤。k值的增大意味著模型會變得較為簡單。在實際應用中,K 值一般選擇一個較小的數值,通常采用交叉驗證的方法來選擇最有的 K 值。隨著訓練實例數目趨向于無窮和 K=1 時,誤差率不會超過貝葉斯誤差率的2倍,如果K也趨向于無窮,則誤差率趨向于貝葉斯誤差率。

   距離度量:特征空間中兩個實例點的距離是兩個實例點相似程度的反映,kNN模型的特征空間一般是n維實數向量空間Rn。距離計算方法:歐式距離、Lp距離或Minkowski距離等。

   分類決策規則:該算法中的分類決策規則往往是多數表決,即由輸入實例的 K 個最臨近的訓練實例中的多數類決定輸入實例的類別。

    k緊鄰算法的實現需要考慮如何快速搜索k個最近鄰點。kd樹是一種便于對k維空間的中的數據進行快速檢索的數據結構。kd樹是一種二叉樹,表示對k維空間 的一個劃分,其每個節點對應于k維空間劃分中的一個超矩形區域。利用kd樹可以省去對大部分數據點的搜索,從而減少搜索的計算量。

kd tree的構造:

    

k-近鄰算法介紹

k-近鄰算法介紹

kd tree的最近鄰搜索:

k-近鄰算法介紹

k-近鄰算法介紹

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!