由於本身想學着去寫機器學習的源碼,因此我最近在學習《機器學習實戰》這本書。算法
《機器學習實戰》是利用Python2完成的機器學習算法的源代碼,並利用機器學習方法來對實際問題進行分析與處理。機器學習
(《機器學習實戰》豆瓣讀書網址:https://book.douban.com/subject/24703171/)學習
如下內容是我經過學習《機器學習實戰》,以及我對k-近鄰(kNN)分類算法的理解,所總結整理出的內容,其中kNN分類算法的源碼爲Python3的代碼,但願你們多多批評指正。測試
kNN分類算法是一類有監督的學習算法,kNN分類算法首先計算出測試樣本點與已知樣本點之間的距離,選擇距離測試樣本點最近的k個已知樣本點,根據k個已知樣本點的類別,經過「投票法」獲得測試樣本點的最終分類。spa
kNN分類算法的優缺點:優勢:精度高、對異常值不敏感、無數據輸入假定;缺點:計算複雜度高、空間複雜度高;適用數據範圍:數值型和標稱型(標稱型數據:變量的結果只在有限目標集中取值)。--摘自《機器學習實戰》排序
kNN分類算法一般使用歐氏距離來計算測試樣本點與已知樣本點之間的距離。get
已知兩個點A=(x1, y1)、B=(x2, y2),則A和B的歐氏距離爲:源碼
Distance = sqrt( (x1-x2)^2 + (y1-y2)^2 )it
kNN分類算法的僞代碼以下:io
Step1:計算出測試樣本點與已知樣本點之間的距離;
Step2:將距離按照升序排序;
Step3:選擇距離測試樣本點最近的k個已知樣本點;
Step4:計算k個最近的已知樣本點所在類別出現的頻率;
Step5:k個最近的已知樣本點出現頻率最高的類別,即爲測試樣本點的最終分類。
kNN分類算法的源碼:
def classify(test, samples, labels, k):
import numpy as np
import operator
# 改變測試樣本的格式
samplesize = samples.shape[0]
testnew = np.tile(test, (samplesize, 1))
# 計算測試樣本與已知樣本之間的距離
distances2 = (testnew - samples) ** 2
distances = (distances2.sum(axis = 1)) ** 0.5
# 對距離進行升序排序,並返回距離的下標
sortdistances = distances.argsort()
#計算k個最近的已知樣本點所在類別出現的次數
classcount = {}
for i in range(k):
sortedlabels = labels[sortdistances[i]]
classcount[sortedlabels] = classcount.get(sortedlabels, 0) + 1
#將k個最近的已知樣本點所在類別出現的次數降序排列
sortedclasscount = sorted(classcount.items(), key = operator.itemgetter(1), reverse = True)
#返回k個最近的已知樣本點出現頻率最高的類別,即爲測試樣本點的最終分類
return sortedclasscount[0][0]
對 kNN分類算法的源碼進行測試:
import numpy as np
import operator
test = [0, 1]
samples = np.array([[1, 1], [1, 3], [0, 0], [0., .1]])
labels = ['A', 'A', 'B', 'B']
k = 3
print(classify(test, samples, labels, k))
測試代碼的輸出結果爲 'B',即測試樣本點[0, 1]的所屬類別爲:B。
以上是我對kNN分類算法的理解以及kNN分類算法的源代碼,歡迎你們多多批評指正。
後續若是有時間的話,我會增長 監督學習算法_k-近鄰(kNN)分類算法_實戰 這一部分的隨筆整理。
祝好
但願能夠和你們互相學習、共同進步
Violet HE
2019.1.18 00:35