一、knn介紹
1. K最近鄰(k-Nearest ?Neighbor,KNN)分類算法,屬于有監(jiān)督學習中的分類算法,是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。該方法的思路是:如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個類別,則該樣本也屬于這個類別。
2. KNN算法中,所選擇的鄰居都是已經(jīng)正確分類的對象。該方法在定類決策上只依據(jù)最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 ?KNN方法雖然從原理上也依賴于極限定理,但在類別決策時,只與極少量的相鄰樣本有關(guān)。由于KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對于類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
3.?KNN算法不僅可以用于分類,還可以用于回歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產(chǎn)生的影響給予不同的權(quán)值(weight),如權(quán)值與距離成正比。?
二、算法分類過程
KNN的原理就是當預測一個新的值x的時候,根據(jù)它距離最近的K個點是什么類別來判斷x屬于哪個類別。
1 首先我們事先定下k值(就是指k近鄰方法的k的大小,代表對于一個待分類的數(shù)據(jù)點,我們要尋找?guī)讉€它的鄰居)。這邊為了說明問題,我們?nèi)蓚€k值,分別為3和9;
2 根據(jù)事先確定的距離度量公式(如:歐氏距離),得出待分類數(shù)據(jù)點和所有已知類別的樣本點中,距離最近的k個樣本。
3 統(tǒng)計這k個樣本點中,各個類別的數(shù)量。根據(jù)k個樣本中,數(shù)量最多的樣本是什么類別,我們就把這個數(shù)據(jù)點定為什么類別。
訓練樣本是多維特征空間向量,其中每個訓練樣本帶有一個類別標簽。算法的訓練階段只包含存儲的特征向量和訓練樣本的標簽。 在分類階段,k是一個用戶定義的常數(shù)。一個沒有類別標簽的向量 (查詢或測試點)將被歸類為最接近該點的K個樣本點中最頻繁使用的一類。
一般情況下,將歐氏距離作為距離度量,但是這是只適用于連續(xù)變量。在文本分類這種非連續(xù)變量情況下,另一個度量——重疊度量(或海明距離)可以用來作為度量。
通常情況下,如果運用一些特殊的算法來計算度量的話,K近鄰分類精度可顯著提高,如運用大邊緣最近鄰法或者近鄰成分分析法。
“多數(shù)表決”分類的一個缺點是出現(xiàn)頻率較多的樣本將會主導測試點的預測結(jié)果,那是因為他們比較大可能出現(xiàn)在測試點的K鄰域而測試點的屬性又是通過K領(lǐng)域內(nèi)的樣本計算出來的。解決這個缺點的方法之一是在進行分類時將樣本到測試點的距離考慮進去。
K值的選擇:
如何選擇一個最佳的K值取決于數(shù)據(jù)。一般情況下,在分類時較大的K值能夠減小噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值能通過各種啟發(fā)式技術(shù)來獲取,比如,交叉驗證。
噪聲和非相關(guān)性特征向量的存在會使K近鄰算法的準確性減小。對于選擇特征向量進行分類已經(jīng)作了很多研究。一個普遍的做法是利用進化算法優(yōu)化功能擴展,還有一種較普遍的方法是利用訓練樣本的互信息進行選擇特征。
K近鄰算法也適用于連續(xù)變量估計,比如適用反距離加權(quán)平均多個K近鄰點確定測試點的值。該算法的功能有:
1、從目標區(qū)域抽樣計算歐式或馬氏距離;
2、在交叉驗證后的RMSE基礎(chǔ)上選擇啟發(fā)式最優(yōu)的K鄰域;
3、計算多元k-最近鄰居的距離倒數(shù)加權(quán)平均。
三、KNN特點
KNN是一種非參的,惰性的算法模型。什么是非參,什么是惰性呢?
非參的意思并不是說這個算法不需要參數(shù),而是意味著這個模型不會對數(shù)據(jù)做出任何的假設(shè),與之相對的是線性回歸(我們總會假設(shè)線性回歸是一條直線)。也就是說KNN建立的模型結(jié)構(gòu)是根據(jù)數(shù)據(jù)來決定的,這也比較符合現(xiàn)實的情況,畢竟在現(xiàn)實中的情況往往與理論上的假設(shè)是不相符的。
惰性又是什么意思呢?想想看,同樣是分類算法,邏輯回歸需要先對數(shù)據(jù)進行大量訓練(tranning),最后才會得到一個算法模型。而KNN算法卻不需要,它沒有明確的訓練數(shù)據(jù)的過程,或者說這個過程很快。
四、KNN算法的優(yōu)缺點
KNN算法優(yōu)點:
1. 簡單易用,相比其他算法,KNN算是比較簡潔明了的算法。即使沒有很高的數(shù)學基礎(chǔ)也能搞清楚它的原理。
2. 模型訓練時間快,上面說到KNN算法是惰性的,這里也就不再過多講述。
3. 預測效果好。
4. 對異常值不敏感
KNN算法缺點:
1. 對內(nèi)存要求較高,因為該算法存儲了所有訓練數(shù)據(jù)
2. 預測階段可能很慢
3. 對不相關(guān)的功能和數(shù)據(jù)規(guī)模敏感
什么時候應(yīng)該選擇使用knn算法?
當需要使用分類算法,且數(shù)據(jù)比較大的時候就可以嘗試使用KNN算法進行分類了。
五、KNN方法
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5, weights=’uniform’,
algorithm=’auto’, leaf_size=30,
p=2, metric=’minkowski’,
metric_params=None,
n_jobs=None, **kwargs)
參數(shù)說明:https://blog.csdn.net/tefuirnever/article/details/99818078
參考: