knn算法python代码_K-最近邻分类算法(KNN)及python实现
一、引入
問題:確定綠色圓是屬于紅色三角形、還是藍色正方形?
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)點
缺點
四、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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 张家港几线城市
- 下一篇: python斐波那契数列前20项_兔子繁