因為自己想學着去寫機器學習的源碼,是以我最近在學習《機器學習實戰》這本書。
《機器學習實戰》是利用Python2完成的機器學習算法的源代碼,并利用機器學習方法來對實際問題進行分析與處理。
(《機器學習實戰》豆瓣讀書網址:https://book.douban.com/subject/24703171/)
以下内容是我通過學習《機器學習實戰》,以及我對k-近鄰(kNN)分類算法的了解,所總結整理出的内容,其中kNN分類算法的源碼為Python3的代碼,希望大家多多批評指正。
kNN分類算法是一類有監督的學習算法,kNN分類算法首先計算出測試樣本點與已知樣本點之間的距離,選擇距離測試樣本點最近的k個已知樣本點,根據k個已知樣本點的類别,通過“投票法”得到測試樣本點的最終分類。
kNN分類算法的優缺點:優點:精度高、對異常值不敏感、無資料輸入假定;缺點:計算複雜度高、空間複雜度高;适用資料範圍:數值型和标稱型(标稱型資料:變量的結果隻在有限目标集中取值)。--摘自《機器學習實戰》
kNN分類算法通常使用歐氏距離來計算測試樣本點與已知樣本點之間的距離。
已知兩個點A=(x1, y1)、B=(x2, y2),則A和B的歐氏距離為:
Distance = sqrt( (x1-x2)^2 + (y1-y2)^2 )
kNN分類算法的僞代碼如下:
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
轉載于:https://www.cnblogs.com/violethjq/p/10285462.html