1. 程式人生 > >k-近鄰演算法-機器學習實戰例子說明

k-近鄰演算法-機器學習實戰例子說明

演算法概述

優點
精度高、對異常值不敏感、無資料輸入假定。
缺點
計算複雜度高、空間複雜度高。
試用資料範圍
數值型和標稱型

工作原理:將新資料的每個特徵與樣本集中資料對應特徵進行比較,計算之間的距離值,選取樣本資料集中前k個最相似的資料。

虛擬碼

    計算已知類別資料集中的點與當前點之間的距離
    按照距離遞增次序排序
    選取與當前點距離最小的k個點
    確定前k個點所在類別的出現頻率
    返回前k個點出現頻率最高的類別作為當前點的預測分類

程式碼如下圖所示:

這裡寫圖片描述

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 ###上面createDataSet函式建立學習資料

def classify0(inX, data, labels, k):
dataSetSize = data.shape[0] ###dataSetSize=4,為group的行數
diffMat = tile(inX,(dataSetSize,1))-data #tile表示將[0,0]資料複製成4行,即,tile(inX,(dataSetSize,1))=([[0, 0],[0, 0], [0, 0],[0, 0]]),在與data做減法
sqDiffMat=diffMat**2 ###計算上述程式碼求差後的每個值的平方和
distances = sum(sqDiffMat,axis=1) ###sqDiffMat為四行兩列的資料,按照行求和,得到每行的和
sortedDistIndicies = distances.argsort()
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
sortedClassCount=sorted(classCount.items(),
key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]

group,labels=createDataSet()
t=classify0([0,0],group,labels,3)
print(t)

上述程式的執行過程資料如下所示:
輸入資料及第17行程式碼的執行結果如下:
這裡寫圖片描述
python tile函式的作用是將資料按照一定的規則進行復制
用法可參考:https://www.cnblogs.com/zibu1234/p/4210521.html
這裡寫圖片描述
18,19行程式碼輸出如下:
這裡寫圖片描述
20,21行程式碼輸出如下:
argsort()函式按照列表索引排序,從小到大的排序,distances中第3個之最小,索引值為2,最大的值索引為0
具體用法可以參考:

https://www.cnblogs.com/yyxf1413/p/6253995.html
這裡寫圖片描述
23-25行的for迴圈是為了統計前k個sortedDistIndicies中每個labels出現的次數,如本程式中k=3,即統計前3個sortedDistIndicies索引對應的labes出現的次數。
程式中使用了字典的get()函式,該函式的作用是返回指定鍵的值,沒有返回預設值,用法可以參考:
http://www.runoob.com/python/att-dictionary-get.html

統計結果如下:
這裡寫圖片描述
程式中26,27行程式碼執行的作用是將字典變成列表,然後按照運算子模組itemgetter方法,按照第二個元素的次序對元組進行排序,此處為逆序,即按照從最大到最小次序排序,最後返回發生頻率最高的元素標籤。
sorted()函式方法參考:
http://blog.csdn.net/ljh0302/article/details/54881930
注意此處使用items()方法。

本人在學習機器學習過程中對程式的一點記錄,由於剛接觸Python會有很多的不懂,如有錯誤,請指正,謝謝!