日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

knn算法python代码_K-最近邻分类算法(KNN)及python实现

發(fā)布時間:2023/12/3 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 knn算法python代码_K-最近邻分类算法(KNN)及python实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、引入

問題:確定綠色圓是屬于紅色三角形、還是藍色正方形?

KNN的思想:

從上圖中我們可以看到,圖中的數(shù)據(jù)集是良好的數(shù)據(jù),即都打好了label,一類是藍色的正方形,一類是紅色的三角形,那個綠色的圓形是我們待分類的數(shù)據(jù)。

如果K=3,那么離綠色點最近的有2個紅色三角形和1個藍色的正方形,這3個點投票,于是綠色的這個待分類點屬于紅色的三角形

如果K=5,那么離綠色點最近的有2個紅色三角形和3個藍色的正方形,這5個點投票,于是綠色的這個待分類點屬于藍色的正方形

即如果一個樣本在特征空間中的k個最相鄰的樣本中,大多數(shù)屬于某一個類別,則該樣本也屬于這個類別。我們可以看到,KNN本質(zhì)是基于一種數(shù)據(jù)統(tǒng)計的方法!其實很多機器學(xué)習(xí)算法也是基于數(shù)據(jù)統(tǒng)計的。

二、KNN算法

1.介紹

KNN即K-Nearest Neighbor,是一種memory-based learning,也叫instance-based learning,屬于lazy learning。即它沒有明顯的前期訓(xùn)練過程,而是程序開始運行時,把數(shù)據(jù)集加載到內(nèi)存后,不需要進行訓(xùn)練,就可以開始分類了。

KNN也是一種監(jiān)督學(xué)習(xí)算法,通過計算新數(shù)據(jù)與訓(xùn)練數(shù)據(jù)特征值之間的距離,然后選取K(K>=1)個距離最近的鄰居進行分類判(投票法)或者回歸。若K=1,新數(shù)據(jù)被簡單分配給其近鄰的類。

2.步驟

1)計算測試數(shù)據(jù)與各個訓(xùn)練數(shù)據(jù)之間的距離;

(計算距離的方式前文講k-means時說過,不清楚的可以去查看以下?傳送門)

2)按照距離的遞增關(guān)系進行排序;

3)選取距離最小的K個點;

K值是由自己來確定的

4)確定前K個點所在類別的出現(xiàn)頻率;

5)返回前K個點中出現(xiàn)頻率最高的類別作為測試數(shù)據(jù)的預(yù)測分類。

說明:對于步驟5的預(yù)測分類有以下兩種方法

  • 多數(shù)表決法:多數(shù)表決法類似于投票的過程,也就是在 K 個鄰居中選擇類別最多的種類作為測試樣本的類別。
  • 加權(quán)表決法:根據(jù)距離的遠近,對近鄰的投票進行加權(quán),距離越近則權(quán)重越大,通過權(quán)重計算結(jié)果最大值的類為測試樣本的類別。

特點

非參數(shù)統(tǒng)計方法:不需要引入?yún)?shù)

K的選擇:

K = 1時,將待分類樣本劃入與其最接近的樣本的類。

K = |X|時,僅根據(jù)訓(xùn)練樣本進行頻率統(tǒng)計,將待分類樣本劃入最多的類。

K需要合理選擇,太小容易受干擾,太大增加計算復(fù)雜性。

算法的復(fù)雜度:維度災(zāi)難,當維數(shù)增加時,所需的訓(xùn)練樣本數(shù)急劇增加,一般采用降維處理。

三、算法優(yōu)缺點

優(yōu)點

  • 簡單、有效。
  • 重新訓(xùn)練的代價較低(類別體系的變化和訓(xùn)練集的變化,在Web環(huán)境和電子商務(wù)應(yīng)用中是很常見的)。
  • 計算時間和空間線性于訓(xùn)練集的規(guī)模(在一些場合不算太大)。
  • 由于KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對于類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
  • 該算法比較適用于樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域采用這種算法比較容易產(chǎn)生誤分。
  • 缺點

  • KNN算法是懶散學(xué)習(xí)方法(lazy learning),而一些積極學(xué)習(xí)的算法要快很多。
  • 需要存儲全部的訓(xùn)練樣本
  • 輸出的可解釋性不強,例如決策樹的可解釋性較強。
  • 該算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導(dǎo)致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本占多數(shù)。該算法只計算最近的鄰居樣本,某一類的樣本數(shù)量很大,那么或者這類樣本并不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數(shù)量并不能影響運行結(jié)果。可以采用權(quán)值的方法(和該樣本距離小的鄰居權(quán)值大)來改進。
  • 計算量較大。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。
  • 四、KNN與K-means的區(qū)別

    廢話不多說,咱直接上圖:

    相似點:

    雖然兩者有很大且別,但兩者也有共同之處。都包含了一個過程:給定一個點,在數(shù)據(jù)集找離它最近的點,即都用到了NN(Nearest Neighbor)算法。

    五、python實例實現(xiàn)

    下面引入一個實例,通過python代碼具體看下KNN算法的流程。

    from numpy import *import operatordataSet = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])labels = ['A','A','B','B']def classify0(inX,dataSet,labels,k): #求出樣本集的行數(shù),也就是labels標簽的數(shù)目 dataSetSize = dataSet.shape[0] #構(gòu)造輸入值和樣本集的差值矩陣 diffMat = tile(inX,(dataSetSize,1)) - dataSet #計算歐式距離 sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1) distances = sqDistances**0.5 #求距離從小到大排序的序號 sortedDistIndicies = distances.argsort() #對距離最小的k個點統(tǒng)計對應(yīng)的樣本標簽 classCount = {} for i in range(k): #取第i+1鄰近的樣本對應(yīng)的類別標簽 voteIlabel = labels[sortedDistIndicies[i]] #以標簽為key,標簽出現(xiàn)的次數(shù)為value將統(tǒng)計到的標簽及出現(xiàn)次數(shù)寫進字典 classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #對字典按value從大到小排序 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #返回排序后字典中最大value對應(yīng)的key return sortedClassCount[0][0]if __name__ == '__main__': print(classify0([1.1,0],dataSet,labels,3))

    私信我:“學(xué)習(xí)”,可免費領(lǐng)取更多相關(guān)學(xué)習(xí)資料 (免費的哦)。

    總結(jié)

    以上是生活随笔為你收集整理的knn算法python代码_K-最近邻分类算法(KNN)及python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。