Python語言實現(xiàn)機器學習的K-近鄰算法
寫在前面
額、、、最近開始學習機器學習嘛,網(wǎng)上找到一本關(guān)于機器學習的書籍,名字叫做《機器學習實戰(zhàn)》。很巧的是,這本書里的算法是用Python語言實現(xiàn)的,剛好之前我學過一些Python基礎(chǔ)知識,所以這本書對于我來說,無疑是雪中送炭啊。接下來,我還是給大家講講實際的東西吧。
什么是K-近鄰算法?
簡單的說,K-近鄰算法就是采用測量不同特征值之間的距離方法來進行分類。它的工作原理是:存在一個樣本數(shù)據(jù)集合,也稱作訓練樣本集,并且樣本集中每個數(shù)據(jù)都存在標簽,即我們知道樣本集中每一數(shù)據(jù)與所屬分類的對應關(guān)系,輸入沒有標簽的新數(shù)據(jù)之后,將新數(shù)據(jù)的每個特征與樣本集中數(shù)據(jù)對應的特征進行比較,然后算法提取出樣本集中特征最相似數(shù)據(jù)的分類標簽。一般來說,我們只選擇樣本數(shù)據(jù)集中前k個最相似的數(shù)據(jù),這就是K-近鄰算法名稱的由來。
提問:親,你造K-近鄰算法是屬于監(jiān)督學習還是無監(jiān)督學習呢?
使用Python導入數(shù)據(jù)
從K-近鄰算法的工作原理中我們可以看出,要想實施這個算法來進行數(shù)據(jù)分類,我們手頭上得需要樣本數(shù)據(jù),沒有樣本數(shù)據(jù)怎么建立分類函數(shù)呢。所以,我們第一步就是導入樣本數(shù)據(jù)集合。
建立名為kNN.py的模塊,寫入代碼:
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
代碼中,我們需要導入Python的兩個模塊:科學計算包NumPy和運算符模塊。NumPy函數(shù)庫是Python開發(fā)環(huán)境的一個獨立模塊,大多數(shù)Python版本里沒有默認安裝NumPy函數(shù)庫,因此這里我們需要單獨安裝這個模塊。
下載地址:http://sourceforge.net/projects/numpy/files/

有很多的版本,這里我選擇的是numpy-1.7.0-win32-superpack-python2.7.exe。
實現(xiàn)K-近鄰算法
K-近鄰算法的具體思想如下:
(1)計算已知類別數(shù)據(jù)集中的點與當前點之間的距離
(2)按照距離遞增次序排序
(3)選取與當前點距離最小的k個點
(4)確定前k個點所在類別的出現(xiàn)頻率
(5)返回前k個點中出現(xiàn)頻率最高的類別作為當前點的預測分類
Python語言實現(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
運算結(jié)果如下:

輸出結(jié)果是B:說明我們新的數(shù)據(jù)([0,0])是屬于B類。
代碼詳解
相信有很多朋友們對上面這個代碼有很多不理解的地方,接下來,我重點講解幾個此函數(shù)的關(guān)鍵點,以方便讀者們和我自己回顧一下這個算法代碼。
classify函數(shù)的參數(shù):
inX:用于分類的輸入向量
dataSet:訓練樣本集合
labels:標簽向量
k:K-近鄰算法中的k
shape:是array的屬性,描述一個多維數(shù)組的維度
tile(inX, (dataSetSize,1)):把inX二維數(shù)組化,dataSetSize表示生成數(shù)組后的行數(shù),1表示列的倍數(shù)。整個這一行代碼表示前一個二維數(shù)組矩陣的每一個元素減去后一個數(shù)組對應的元素值,這樣就實現(xiàn)了矩陣之間的減法,簡單方便得不讓你佩服不行!
axis=1:參數(shù)等于1的時候,表示矩陣中行之間的數(shù)的求和,等于0的時候表示列之間數(shù)的求和。
argsort():對一個數(shù)組進行非降序排序
classCount.get(numOflabel,0) + 1:這一行代碼不得不說的確很精美啊。get():該方法是訪問字典項的方法,即訪問下標鍵為numOflabel的項,如果沒有這一項,那么初始值為0。然后把這一項的值加1。所以Python中實現(xiàn)這樣的操作就只需要一行代碼,實在是很簡潔高效。
后話
K-近鄰算法(KNN)原理以及代碼實現(xiàn)差不多就這樣了,接下來的任務就是更加熟悉它,爭取達到裸敲的地步。
以上所述上就是本文的全部內(nèi)容了,希望大家能夠喜歡。
相關(guān)文章
把MySQL表結(jié)構(gòu)映射為Python中的對象的教程
這篇文章主要介紹了簡單地把MySQL表結(jié)構(gòu)映射為Python中的對象的方法,用到了Python中的SQLAlchemy庫,需要的朋友可以參考下2015-04-04
Python+ChatGPT實戰(zhàn)之進行游戲運營數(shù)據(jù)分析
最近ChatGPT蠻火的,今天試著讓ta用Python語言寫了一篇數(shù)據(jù)分析實戰(zhàn)案例。文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-02-02
使用Python的Twisted框架編寫簡單的網(wǎng)絡(luò)客戶端
這篇文章主要介紹了使用Python的Twisted框架編寫簡單的網(wǎng)絡(luò)客戶端,翻譯自Twisted文檔,包括一個簡單的IRC客戶端的實現(xiàn),需要的朋友可以參考下2015-04-04
基于python list對象中嵌套元組使用sort時的排序方法
下面小編就為大家分享一篇基于python list對象中嵌套元組使用sort時的排序方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
如何給windows設(shè)置定時任務并運行python腳本
這篇文章主要介紹了如何給windows設(shè)置定時任務并運行python腳本,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08

