K近鄰法(k-nearst neighbors,KNN)是一種很基本的機(jī)器學(xué)習(xí)方法了,在我們平常的生活中也會不自主的應(yīng)用。比如,我們判斷一個人的人品,只需要觀察他來往最密切的幾個人的人品好壞就可以得出了。這里就運(yùn)用了KNN的思想。KNN方法既可以做分類,也可以做回歸,這點和決策樹算法相同。

    KNN做回歸和分類的主要區(qū)別在于最后做預(yù)測時候的決策方式不同。KNN做分類預(yù)測時,一般是選擇多數(shù)表決法,即訓(xùn)練集里和預(yù)測的樣本特征最近的K個樣本,預(yù)測為里面有最多類別數(shù)的類別。而KNN做回歸時,一般是選擇平均法,即最近的K個樣本的樣本輸出的平均值作為回歸預(yù)測值。由于兩者區(qū)別不大,雖然本文主要是講解KNN的分類方法,但思想對KNN的回歸方法也適用。由于scikit-learn里只使用了蠻力實現(xiàn)(brute-force),KD樹實現(xiàn)(KDTree)和球樹(BallTree)實現(xiàn),本文只討論這幾種算法的實現(xiàn)原理。其余的實現(xiàn)方法比如BBF樹,MVP樹等,在這里不做討論。

1. KNN算法三要素

    KNN算法我們主要要考慮三個重要的要素,對于固定的訓(xùn)練集,只要這三點確定了,算法的預(yù)測方式也就決定了。這三個最終的要素是k值的選取,距離度量的方式和分類決策規(guī)則。

    對于分類決策規(guī)則,一般都是使用前面提到的多數(shù)表決法。所以我們重點是關(guān)注與k值的選擇和距離的度量方式。

 

    對于k值的選擇,沒有一個固定的經(jīng)驗,一般根據(jù)樣本的分布,選擇一個較小的值,可以通過交叉驗證選擇一個合適的k值。

    選擇較小的k值,就相當(dāng)于用較小的領(lǐng)域中的訓(xùn)練實例進(jìn)行預(yù)測,訓(xùn)練誤差會減小,只有與輸入實例較近或相似的訓(xùn)練實例才會對預(yù)測結(jié)果起作用,與此同時帶來的問題是泛化誤差會增大,換句話說,K值的減小就意味著整體模型變得復(fù)雜,容易發(fā)生過擬合;
    選擇較大的k值,就相當(dāng)于用較大領(lǐng)域中的訓(xùn)練實例進(jìn)行預(yù)測,其優(yōu)點是可以減少泛化誤差,但缺點是訓(xùn)練誤差會增大。這時候,與輸入實例較遠(yuǎn)(不相似的)訓(xùn)練實例也會對預(yù)測器作用,使預(yù)測發(fā)生錯誤,且K值的增大就意味著整體的模型變得簡單。
    一個極端是k等于樣本數(shù)m,則完全沒有分類,此時無論輸入實例是什么,都只是簡單的預(yù)測它屬于在訓(xùn)練實例中最多的類,模型過于簡單。

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式