k近邻算法python_k-近邻算法的Python实现
本篇文章,想向各位介紹一個(gè)非常易于實(shí)現(xiàn)的機(jī)器學(xué)習(xí)算法:k-近鄰算法,眾所周知,k-近鄰算法是非常常用的分類算法,現(xiàn)在給出k-近鄰算法的官方解釋:在一個(gè)樣本數(shù)據(jù)集,也稱作訓(xùn)練樣本集,并且樣本中每個(gè)數(shù)據(jù)都存在標(biāo)簽,即我們知道樣本集中每一數(shù)據(jù)與所屬分類的對(duì)應(yīng)關(guān)系,輸入沒有標(biāo)簽的新數(shù)據(jù)后,將新數(shù)據(jù)的每個(gè)特征與樣本集中的數(shù)據(jù)對(duì)應(yīng)的特征進(jìn)行比較,然后算法提取樣本集中特征最相似的數(shù)據(jù)(最近鄰)的分類標(biāo)簽。一般來說,我們只選擇樣本集中前k個(gè)最相似的數(shù)據(jù),這就是k-近鄰算法中k的出處,通常k是不大于20的整數(shù),最后,選擇k個(gè)最相似的數(shù)據(jù)中出現(xiàn)次數(shù)最多的分類,作為新數(shù)據(jù)的分類。通過尋找近鄰來輔助分類可以提升分類的效率,簡(jiǎn)化分類的流程。
現(xiàn)在來介紹k-近鄰算法的一般流程:
(1)收集數(shù)據(jù):比如問卷法,觀察法等等。
(2)準(zhǔn)備數(shù)據(jù):距離計(jì)算所需的數(shù)值,最好是結(jié)構(gòu)化的數(shù)據(jù)格式。
(3)分析數(shù)據(jù):聚類分析、因子分析、相關(guān)分析、對(duì)應(yīng)分析、回歸分析、方差分析等。
(4)訓(xùn)練算法:在k-近鄰中一般不用。
(5)測(cè)試算法:計(jì)算錯(cuò)誤率。
(6)使用算法:首先需要輸入樣本數(shù)據(jù)和結(jié)構(gòu)化的輸出結(jié)果,然后運(yùn)行k-近鄰算法判定輸入數(shù)據(jù)分別屬于哪個(gè)分類,最后應(yīng)用對(duì)計(jì)算出的分類執(zhí)行后續(xù)的處理。
介紹完了流程,我們開始導(dǎo)入數(shù)據(jù),這次導(dǎo)入數(shù)據(jù)的代碼環(huán)境依然選擇python,首先我們需要有kNN.py的文件,關(guān)于kNN的源碼,推薦各位上CodeForge網(wǎng)站上下載,該網(wǎng)站有很多有用的源碼。
有了kNN的源碼之后,我們可能還要編寫一些基本的通用函數(shù),在源碼中增加下面的代碼:
from numpy import *
Import operator
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = [‘A’,’A’,’B’,’B’]
return group ,labels
在上面的代碼中,我們導(dǎo)入了兩個(gè)模塊:第一個(gè)是科學(xué)計(jì)算包Numpy;第二個(gè)是運(yùn)算符模塊,k-近鄰算法執(zhí)行排序操作時(shí)將使用這個(gè)模塊提供的函數(shù)。
現(xiàn)在我們來實(shí)施kNN算法,為每組數(shù)據(jù)分類,先給出其偽代碼如下:
對(duì)未知類別屬性的數(shù)據(jù)集中的每個(gè)點(diǎn)依次執(zhí)行以下操作:
(1)計(jì)算已知類別數(shù)據(jù)集中的每個(gè)點(diǎn)與當(dāng)前點(diǎn)之間的距離:
(2)按照距離遞增次序排序;
(3)選取與當(dāng)前距離最小的k個(gè)點(diǎn);
(4)確定前k個(gè)點(diǎn)所在類別的出現(xiàn)頻率;
(5)返回前k個(gè)點(diǎn)出現(xiàn)頻率最高的類別作為當(dāng)前點(diǎn)的預(yù)測(cè)分類。
K_近鄰算法的python實(shí)現(xiàn)如下:
def classify0(inX,dataSet,labels,k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX,(dataSetSize,1))-dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distance = sqDistance**0.5
sortedDistIndicies = distance.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems),key = operator.itemgetter(1),reverse = True)
return sortedClassCount[0][0]
以上代碼的目的主要是為了計(jì)算數(shù)據(jù)中的點(diǎn)與當(dāng)前點(diǎn)的距離,根據(jù)計(jì)算的的距離結(jié)果,選擇距離最小的k個(gè)點(diǎn),隨后對(duì)這k個(gè)點(diǎn)按照從大到小進(jìn)行排序。(距離計(jì)算主要是歐式距離)
為了預(yù)測(cè)數(shù)據(jù)所在分類,在python提示符中輸入下列命令:
kNN.classify0([0,0],group,labels,3)
以上是我們用python構(gòu)造的第一個(gè)分類器,這個(gè)分類器可以完成很多任務(wù),我們初步完成了構(gòu)造分類算法。之后的文章中,將會(huì)給給位介紹一下k近鄰算法的案例,敬請(qǐng)期待~
作者:徐永瑞 Python愛好者社區(qū)專欄作者,請(qǐng)勿轉(zhuǎn)載,謝謝。
出處:k-近鄰算法的Python實(shí)現(xiàn)
配套視頻教程:Python3爬蟲三大案例實(shí)戰(zhàn)分享:貓眼電影、今日頭條街拍美圖、淘寶美食 Python3爬蟲三大案例實(shí)戰(zhàn)分享
公眾號(hào):Python愛好者社區(qū)(微信ID:python_shequ),關(guān)注,查看更多連載內(nèi)容。
加小編個(gè)人微信:tsdatajob ,跟作者互動(dòng),一起探討。
總結(jié)
以上是生活随笔為你收集整理的k近邻算法python_k-近邻算法的Python实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ransomware的斗士——云备份系统
- 下一篇: 为了理想,因为爱情-开课第一天有感(鸡汤