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查詢最近鄰
機器學習 KNN演算法原理 Spark實現
不懂演算法的資料開發者不是乙個好的演算法工程師,還記得研究生時候,導師講過的一些資料探勘演算法,頗有興趣,但是無奈工作後接觸少了,資料工程師的鄙視鏈,模型 實時 脫機數倉 etl工程師 bi工程師 不喜勿噴哈 現在做的工作主要是脫機數倉,當然前期也做過一些etl的工作,為了職業的長遠發展,拓寬自己的...
機器學習 KNN演算法原理 Spark實現
不懂演算法的資料開發者不是乙個好的演算法工程師,還記得研究生時候,導師講過的一些資料探勘演算法,頗有興趣,但是無奈工作後接觸少了,資料工程師的鄙視鏈,模型 實時 脫機數倉 etl工程師 bi工程師 不喜勿噴哈 現在做的工作主要是脫機數倉,當然前期也做過一些etl的工作,為了職業的長遠發展,拓寬自己的...
機器學習 演算法 KNN
參考 我感覺knn是最簡單的乙個機器學習演算法,實現很簡單,效果也一般般 就是算個euclideam distance,還有一些可以優化的地方,比如可以加權,第二篇文章提到了 python 如下 coding utf 8 created on aug 30,2013 author blacklaw ...