Python語(yǔ)言實(shí)現(xiàn)機(jī)器學(xué)習(xí)的K-近鄰算法
寫(xiě)在前面
額、、、最近開(kāi)始學(xué)習(xí)機(jī)器學(xué)習(xí)嘛,網(wǎng)上找到一本關(guān)于機(jī)器學(xué)習(xí)的書(shū)籍,名字叫做《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》。很巧的是,這本書(shū)里的算法是用Python語(yǔ)言實(shí)現(xiàn)的,剛好之前我學(xué)過(guò)一些Python基礎(chǔ)知識(shí),所以這本書(shū)對(duì)于我來(lái)說(shuō),無(wú)疑是雪中送炭啊。接下來(lái),我還是給大家講講實(shí)際的東西吧。
什么是K-近鄰算法?
簡(jiǎn)單的說(shuō),K-近鄰算法就是采用測(cè)量不同特征值之間的距離方法來(lái)進(jìn)行分類(lèi)。它的工作原理是:存在一個(gè)樣本數(shù)據(jù)集合,也稱作訓(xùn)練樣本集,并且樣本集中每個(gè)數(shù)據(jù)都存在標(biāo)簽,即我們知道樣本集中每一數(shù)據(jù)與所屬分類(lèi)的對(duì)應(yīng)關(guān)系,輸入沒(méi)有標(biāo)簽的新數(shù)據(jù)之后,將新數(shù)據(jù)的每個(gè)特征與樣本集中數(shù)據(jù)對(duì)應(yīng)的特征進(jìn)行比較,然后算法提取出樣本集中特征最相似數(shù)據(jù)的分類(lèi)標(biāo)簽。一般來(lái)說(shuō),我們只選擇樣本數(shù)據(jù)集中前k個(gè)最相似的數(shù)據(jù),這就是K-近鄰算法名稱的由來(lái)。
提問(wèn):親,你造K-近鄰算法是屬于監(jiān)督學(xué)習(xí)還是無(wú)監(jiān)督學(xué)習(xí)呢?
使用Python導(dǎo)入數(shù)據(jù)
從K-近鄰算法的工作原理中我們可以看出,要想實(shí)施這個(gè)算法來(lái)進(jìn)行數(shù)據(jù)分類(lèi),我們手頭上得需要樣本數(shù)據(jù),沒(méi)有樣本數(shù)據(jù)怎么建立分類(lèi)函數(shù)呢。所以,我們第一步就是導(dǎo)入樣本數(shù)據(jù)集合。
建立名為kNN.py的模塊,寫(xiě)入代碼:
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)入Python的兩個(gè)模塊:科學(xué)計(jì)算包NumPy和運(yùn)算符模塊。NumPy函數(shù)庫(kù)是Python開(kāi)發(fā)環(huán)境的一個(gè)獨(dú)立模塊,大多數(shù)Python版本里沒(méi)有默認(rèn)安裝NumPy函數(shù)庫(kù),因此這里我們需要單獨(dú)安裝這個(gè)模塊。
下載地址:http://sourceforge.net/projects/numpy/files/
有很多的版本,這里我選擇的是numpy-1.7.0-win32-superpack-python2.7.exe。
實(shí)現(xiàn)K-近鄰算法
K-近鄰算法的具體思想如下:
(1)計(jì)算已知類(lèi)別數(shù)據(jù)集中的點(diǎn)與當(dāng)前點(diǎn)之間的距離
(2)按照距離遞增次序排序
(3)選取與當(dāng)前點(diǎn)距離最小的k個(gè)點(diǎn)
(4)確定前k個(gè)點(diǎn)所在類(lèi)別的出現(xiàn)頻率
(5)返回前k個(gè)點(diǎn)中出現(xiàn)頻率最高的類(lèi)別作為當(dāng)前點(diǎn)的預(yù)測(cè)分類(lèi)
Python語(yǔ)言實(shí)現(xiàn)K-近鄰算法的代碼如下:
# coding : utf-8 from numpy import * import operator import kNN group, labels = kNN.createDataSet() def classify(inX, dataSet, labels, k): dataSetSize = dataSet.shape[0] diffMat = tile(inX, (dataSetSize,1)) - dataSet sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1) distances = sqDistances**0.5 sortedDistances = distances.argsort() classCount = {} for i in range(k): numOflabel = labels[sortedDistances[i]] classCount[numOflabel] = classCount.get(numOflabel,0) + 1 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1),reverse=True) return sortedClassCount[0][0] my = classify([0,0], group, labels, 3) print my
運(yùn)算結(jié)果如下:
輸出結(jié)果是B:說(shuō)明我們新的數(shù)據(jù)([0,0])是屬于B類(lèi)。
代碼詳解
相信有很多朋友們對(duì)上面這個(gè)代碼有很多不理解的地方,接下來(lái),我重點(diǎn)講解幾個(gè)此函數(shù)的關(guān)鍵點(diǎn),以方便讀者們和我自己回顧一下這個(gè)算法代碼。
classify函數(shù)的參數(shù):
inX:用于分類(lèi)的輸入向量
dataSet:訓(xùn)練樣本集合
labels:標(biāo)簽向量
k:K-近鄰算法中的k
shape:是array的屬性,描述一個(gè)多維數(shù)組的維度
tile(inX, (dataSetSize,1)):把inX二維數(shù)組化,dataSetSize表示生成數(shù)組后的行數(shù),1表示列的倍數(shù)。整個(gè)這一行代碼表示前一個(gè)二維數(shù)組矩陣的每一個(gè)元素減去后一個(gè)數(shù)組對(duì)應(yīng)的元素值,這樣就實(shí)現(xiàn)了矩陣之間的減法,簡(jiǎn)單方便得不讓你佩服不行!
axis=1:參數(shù)等于1的時(shí)候,表示矩陣中行之間的數(shù)的求和,等于0的時(shí)候表示列之間數(shù)的求和。
argsort():對(duì)一個(gè)數(shù)組進(jìn)行非降序排序
classCount.get(numOflabel,0) + 1:這一行代碼不得不說(shuō)的確很精美啊。get():該方法是訪問(wèn)字典項(xiàng)的方法,即訪問(wèn)下標(biāo)鍵為numOflabel的項(xiàng),如果沒(méi)有這一項(xiàng),那么初始值為0。然后把這一項(xiàng)的值加1。所以Python中實(shí)現(xiàn)這樣的操作就只需要一行代碼,實(shí)在是很簡(jiǎn)潔高效。
后話
K-近鄰算法(KNN)原理以及代碼實(shí)現(xiàn)差不多就這樣了,接下來(lái)的任務(wù)就是更加熟悉它,爭(zhēng)取達(dá)到裸敲的地步。
以上所述上就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
- python k-近鄰算法實(shí)例分享
- 詳解opencv Python特征檢測(cè)及K-最近鄰匹配
- K-近鄰算法的python實(shí)現(xiàn)代碼分享
- Python機(jī)器學(xué)習(xí)k-近鄰算法(K Nearest Neighbor)實(shí)例詳解
- python K近鄰算法的kd樹(shù)實(shí)現(xiàn)
- python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之最近鄰kNN分類(lèi)器
- python實(shí)現(xiàn)K最近鄰算法
- python機(jī)器學(xué)習(xí)案例教程——K最近鄰算法的實(shí)現(xiàn)
- Python實(shí)現(xiàn)KNN(K-近鄰)算法的示例代碼
- Python利用Faiss庫(kù)實(shí)現(xiàn)ANN近鄰搜索的方法詳解
相關(guān)文章
把MySQL表結(jié)構(gòu)映射為Python中的對(duì)象的教程
這篇文章主要介紹了簡(jiǎn)單地把MySQL表結(jié)構(gòu)映射為Python中的對(duì)象的方法,用到了Python中的SQLAlchemy庫(kù),需要的朋友可以參考下2015-04-04Python+ChatGPT實(shí)戰(zhàn)之進(jìn)行游戲運(yùn)營(yíng)數(shù)據(jù)分析
最近ChatGPT蠻火的,今天試著讓ta用Python語(yǔ)言寫(xiě)了一篇數(shù)據(jù)分析實(shí)戰(zhàn)案例。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02使用Python的Twisted框架編寫(xiě)簡(jiǎn)單的網(wǎng)絡(luò)客戶端
這篇文章主要介紹了使用Python的Twisted框架編寫(xiě)簡(jiǎn)單的網(wǎng)絡(luò)客戶端,翻譯自Twisted文檔,包括一個(gè)簡(jiǎn)單的IRC客戶端的實(shí)現(xiàn),需要的朋友可以參考下2015-04-04python 實(shí)現(xiàn)二叉搜索樹(shù)的四種方法
本文主要介紹了python 實(shí)現(xiàn)二叉搜索樹(shù)的四種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04pytorch 常用函數(shù) max ,eq說(shuō)明
這篇文章主要介紹了pytorch 常用函數(shù) max eq說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06基于python list對(duì)象中嵌套元組使用sort時(shí)的排序方法
下面小編就為大家分享一篇基于python list對(duì)象中嵌套元組使用sort時(shí)的排序方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04如何給windows設(shè)置定時(shí)任務(wù)并運(yùn)行python腳本
這篇文章主要介紹了如何給windows設(shè)置定時(shí)任務(wù)并運(yùn)行python腳本,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08