我來自Android開發(fā)人員,剛剛接觸的機械學習绒瘦,整理了k-近鄰算法的classify0函數(shù)的具體意義,以及一步一步的步驟講解惰帽,望對大家有用。由于初寫券册,如有紕漏或者錯誤垂涯,歡迎指出航邢。
如膳殷,您覺得文章有用,可以分享給小伙伴們一起進步成長赚窃。需 附加原文地址
鏈接 http://www.reibang.com/p/551fb62a2b94 收藏點贊勒极,是對作者最大的支持,核動力的發(fā)動機
先上運行圖
如果把 # 零 初始化的數(shù)據(jù)代入次函數(shù)键痛,結果應該是'A'
數(shù)據(jù)來自于匾七,自己編寫的,用于學習測試用丁频,準確度與文章的理解程度邑贴,望大家提出我會積極改進。
運算結果
近鄰算法的 計算公式精髓胁勺,下方會 一步一步 講解哦独旷!
import numpy as np
#用于分類的輸入向量是inX寥裂,輸入的訓練樣本集為dataSet案疲,
#標簽向量為 labels 褐啡,最后的參數(shù) k 表示用于選擇最近鄰居的數(shù)目,其中標簽向量的元素數(shù)目和矩
#陣 dataSet 的行數(shù)相同备畦。
def classify0(inX,dataSet,labels,k):
# 獲取 數(shù)組 形狀的 第一個 參數(shù) a=[[1,2],[1,2],[1,2]] a.shape = [3,2] a.shape[0] = 3
# 一懂盐、
dataSetSize = dataSet.shape[0]
# tile 代表了inX,復制為dataSetSize行拌喉,1列的數(shù)組
# 二俐银、
diffMat = np.tile(inX,(dataSetSize,1))-dataSet
# 平方
sqDiffMat = diffMat**2
# axis 等于 1 是將 矩陣的每一行 相加
sqDistances = sqDiffMat.sum(axis=1)
# 開方
distances = sqDistances**0.5
# 三、
# 從小到大 排列
sortedDistances = distances.argsort()
classCount = {}
# 四田藐、求出來 最低距離 的 labels結果售躁,存放在classCount 中
for i in range(k):
voteIlabel =labels[sortedDistances[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
# 零 初始化 clasify0 中所需的數(shù)據(jù)
inX = [2,3]
# 限度 2,2為中介,距離小于 為不喜歡A回窘,大于為喜歡B
dataSet = np.array([[1,2],
[3,5],
[1.5,2.5],
[2.5,3.5]])
labels = ['A','B','A','B']
k=3
# 一市袖、 求出 dataSet 訓練數(shù)據(jù)的 行向量
dataSetSize = dataSet.shape[0] = 4
1.1
二苍碟、 復制 輸入inX 行向量 與dataSet 的 行大小一致 ,由上方1.1圖可知舷丹,向量兩點的最短距離為 1.0= (inX 行向量 - dataSet 的行向量)
diffMat = np.tile(inX,(dataSetSize,1)) - dataSet=
[[2,3], - [1,2], = [1,1]
[2,3], - [3,5], = [-1,-2]
[2,3], - [1.5,2.5], = [0.5,0.5]
[2,3]] - [2.5,3.5]] = [-0.5,-0.5]
# 1.1 = 將 差集 平方 雖有 下一步 行向量相加
sqDiffMat = diffMat**2
# 1.2 = 行向量相加
sqDistances = sqDiffMat.sum(axis=1) (行向量相加)
[(1^2 + 1^2),
...]
# 1.3 = 所得和集 再 開方(**0.5 相當于開方)蜓肆, 即 求出來了最短距離是多少谋币、 即上方1.1 圖的 d
distances = sqDistances**0.5 =
[((2)**0.5) ≈ 1.41421
((5)**0.5) ≈ 2.23606
((0.5)**0.5) ≈ 0.707106
((0.5)**0.5) ≈ 0.707106
...]
# 三症概、
# argsort : 將distacnces中的元素從小到大排列彼城,提取其對應的index(索引),然后輸出到sortedDistances
# 即 sortedDistances[0] = distacnces[2] = 0.707106
sortedDistances = distacnces.argsort() =
[2,3,0,1]
# 四
# 假設 k=3 i = 0 第一層循環(huán) 的結果為
voteIlabel =labels[sortedDistances[i]] = 'A'
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1 = 1 (classCount索引為'A')
# 將遍歷存儲的 classCount = [('A', 1)] 排序调炬,按照
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
# 返回第一個 最相近的 值司抱,作為結果, 即最相近的近鄰算法
return sortedClassCount[0][0]
PS:上方算法內容來自于 機器學習實站 一書,對于一些難理解或者一些知識點的記錄照棋,并附加上自己的見解,注釋解釋等溶锭。如符隙,更想快速的學習,可以直接閱讀本書