機器學習 KNN演算法原理
K近鄰(K-nearst neighbors,KNN)是一種基本的機器學習演算法,所謂k近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。比如:判斷一個人的人品,只需要觀察與他來往最密切的幾個人的人品好壞就可以得出,即“近朱者赤,近墨者黑”;KNN演算法既可以應用於分類應用中,也可以應用在迴歸應用中。
KNN在做迴歸和分類的主要區別在於最後做預測的時候的決策方式不同.KNN在分類預測時,一般採用多數表決法;而在做迴歸預測時,一般採用平均值法。
KNN演算法原理
1.從訓練集合中獲取K個離待預測樣本距離最近的樣本資料;
2.根據獲取得到的k個樣本資料來預測當前待預測樣本的目標屬性值.
KNN三要素
在KNN演算法中,非常重要的主要是三個因素:
K值的選擇:對於K值的選擇,一般根據樣本分佈選擇一個較小的值,然後通過交叉驗證來選擇一個比較合適的最終值;當選擇比較小的K值的時候,表示使用較小領域中的樣本進行預測,訓練誤差會減小,但是會導致模型變得複雜,容易過擬合;當選擇較大的K值的時候,表示使用較大領域中的樣本進行預測,訓練誤差會增大,同時會使模型變得簡單,容易導致欠擬合;
距離的度量:一般使用歐氏距離(歐幾里得距離);
決策規則:在分類模型中,主要使用多數表決法或者加權多數表決法;在迴歸模型中,主要使用平均值法或者加權平均值法。
KNN分類預測規則
在KNN分類應用中,一般採用多數表決法或者加權多數表決法。
多數表決法:每個鄰近樣本的權重是一樣的,也就是說最終預測的結果為出現類別最多的那個類.
加權多數表決法:每個鄰近樣本的權重是不一樣的,一般情況下采用權重和距離成反比的方式來計算,也就是說最終預測結果是出現權重最大的那個類別
在KNN迴歸應用中,一般採用平均值法或者加權平均值法。
平均值法:每個鄰近樣本的權重是一樣的,也就是說最終預測的結果為所有鄰近樣本的目標屬性值的均值;比如右圖中,藍色圓圈的最終預測值為:2.6
加權平均值法:每個鄰近樣本的權重是不一樣的,一般情況下采用權重和距離成反比的方式來計算,也就是說在計算均值的時候進行加權操作
KNN演算法實現方式
KNN演算法的重點在於找出K個最鄰近的點,主要方式有以下幾種:
蠻力實現(brute):計算預測樣本到所有訓練集樣本的距離,然後選擇最小的k個距離即可得到K個最鄰近點。缺點在於當特徵數比較多、樣本數比較多的時候,演算法的
執行效率比較低;
KD樹(kd_tree):KD樹演算法中,首先是對訓練資料進行建模,構建KD樹,然後再根據建好的模型來獲取鄰近樣本資料。
除此之外,還有一些從KD_Tree修改後的求解最鄰近點的演算法,比如:Ball Tree、BBF Tree、MVP Tree等
KD Tree
KD Tree是KNN演算法中用於計算最近鄰的快速、便捷構建方式。
當樣本資料量少的時候,我們可以使用brute這種暴力的方式進行求解最近鄰,即計算到所有樣本的距離。但是當樣本量比較大的時候,直接計算所有樣本的距離,工作量有點大,所以在這種情況下,我們可以使用kd tree來快速的計算。
KD Tree構建方式
KD樹採用從m個樣本的n維特徵中,分別計算n個特徵取值的方差,用方差最大的第k維特徵n k 作為根節點。對於這個特徵,選擇取值的中位數n kv 作為樣本的劃分點,對於小於該值的樣本劃分到左子樹,對於大於等於該值的樣本劃分到右子樹,對左右子樹採用同樣的方式找方差最大的特徵作為根節點,遞迴即可產生KD樹。
KD tree查詢最近鄰
當我們生成KD樹以後,就可以去預測測試集裡面的樣本目標點了。對於一個目標點,我們首先在KD樹裡面找到包含目標點的葉子節點。以目標點為圓心,以目標點到葉子節點樣本例項的距離為半徑,得到一個超球體,最近鄰的點一定在這個超球體內部。然後返回葉子節點的父節點,檢查另一個子節點包含的超矩形體是否和超球體相交,如果相交就到這個子節點尋找是否有更加近的近鄰,有的話就更新最近鄰。如果不相交那就簡單了,我們直接返回父節點的父節點,在另一個子樹繼續搜尋最近鄰。當回溯到根節點時,演算法結束,此時儲存的最近鄰節點就是最終的最近鄰。