knn k的选取_KNN - 初窥K近邻算法
1>算法概述
KNN: 全名K-NearestNeighbor,K近鄰算法,簡單講就是每個樣本都可以用最接近的k個鄰居表示,或者說共享同一個標(biāo)簽。KNN是一種分類(classification)算法,它輸入基于實(shí)例的學(xué)習(xí)(instance-based learning),屬于懶惰學(xué)習(xí)(lazy learning),也就是說沒有學(xué)習(xí)過程,而是事先就已經(jīng)準(zhǔn)備好分類和特征值,可以直接對新樣本進(jìn)行處理分類。
如圖所示,綠點(diǎn)為測試樣本,我們需要判斷它是屬于紅色標(biāo)簽還是藍(lán)色標(biāo)簽(r/b)。如果k=1,r:b = 2:1,測試樣本為紅色;如果k=2,r:b=2:3,測試樣本為藍(lán)色; 如果k=3,r:b=6:5,測試樣本為紅色。很顯然k的取值對樣本影響重大,下文將提及k值選取。
2>算法流程
1)計算測試數(shù)據(jù)與各個訓(xùn)練數(shù)據(jù)之間的距離;
2)按照距離的遞增關(guān)系進(jìn)行排序;
3)選取距離最小的K個點(diǎn);
4)確定前K個點(diǎn)所在類別的出現(xiàn)頻率;
5)返回前K個點(diǎn)中出現(xiàn)頻率最高的類別作為測試數(shù)據(jù)的預(yù)測分類
3>算法實(shí)現(xiàn)
3.1準(zhǔn)備數(shù)據(jù)
#scatter詳解鏈接如下:
CSDN-專業(yè)IT技術(shù)社區(qū)-登錄
數(shù)據(jù)可視化后生成的圖如上,其中橫軸是腫塊大小,縱軸是發(fā)現(xiàn)時間。每個點(diǎn)代表不同病人的腫瘤大小和發(fā)病時間,根據(jù)顏色判斷腫瘤是良性還是惡性。
現(xiàn)給出測試樣本,判斷點(diǎn)x = [8.90933607318, 3.365731514]屬于哪種情況。
3.2計算距離
距離可以采用歐氏距離或馬氏距離計算,此處采用歐幾里得距離計算。
√(∑_(i=1)^n?(x_i-y_i )^2 )
使用函數(shù)argsort對數(shù)組distances進(jìn)行排序,距離由近到遠(yuǎn),返回值為索引。
3.3選取k值
k值選取要適宜,k過大會導(dǎo)致模型簡化而失去意義,k值過小則會將模型復(fù)雜化并產(chǎn)生過擬合現(xiàn)象。且k最好為奇數(shù),以免出現(xiàn)結(jié)果相等的尷尬情況。
在實(shí)際應(yīng)用中,K值一般取一個比較小的數(shù)值,例如采用交叉驗證法(簡單來說,就是一部分樣本做訓(xùn)練集,一部分做測試集)來選擇最優(yōu)的K值。有點(diǎn)復(fù)雜,此處跳過。
暫且選擇k值為6,找出最近的6個點(diǎn),并記錄他們的標(biāo)簽值。
3.3決策
統(tǒng)計所選點(diǎn)的標(biāo)簽,得到多的一個標(biāo)簽值是多少,即為測試點(diǎn)x的標(biāo)簽。
輸出一個字典,“:”前面是數(shù)組中的值,后面是統(tǒng)計的數(shù)量;我們可以用most_common()方法找出預(yù)測值。
至此我們得到了測試點(diǎn)x的標(biāo)簽值為1。
4>自實(shí)現(xiàn)完整工程代碼
5>算法優(yōu)缺點(diǎn)
KNN的主要優(yōu)點(diǎn)有:
KNN的主要缺點(diǎn)有:
#參考鏈接:
機(jī)器學(xué)習(xí)的敲門磚:kNN算法(上)?mp.weixin.qq.com機(jī)器學(xué)習(xí)-KNN算法 - 數(shù)月亮 - 博客園?www.cnblogs.com總結(jié)
以上是生活随笔為你收集整理的knn k的选取_KNN - 初窥K近邻算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PostgreSQL数据库常用SQL语句
- 下一篇: 前端部分-JSON-对象转换为字符串