原始數據(訓練集)如下:
#導入模塊numpy並以np作爲別名
import numpy as np
#def定義函數,Python 使用def 開始函數定義,緊接着是函數名,括號內部爲函數的參數,
#內部爲函數的 具體功能實現代碼,如果想要函數有返回值,
#在 expressions 中的邏輯代碼中用return 返回。
def createDataSet():
#四組二維特徵
group = np.array([[1,101],[5,89],[108,5],[115,8]])
#四組特徵的標籤
labels = ['愛情片','愛情片','動作片','動作片']
return group, labels
#if __name__ == '__main__':表示組合前邊函數,if __name__=="__main__": 語句之前和之後的
#代碼都被執行兩個等號,兩個下劃線組成一個下劃線,_和__不一樣
if __name__ == '__main__':
#創建數據集
group, labels = createDataSet()
#打印數據集
print(group)
print(labels)
#導入operator模塊,下文的operator.itemgetter()要用到
import operator
def classify0(inX, dataSet, labels, k):
#numpy函數shape[0]返回dataSet的行數
dataSetSize = dataSet.shape[0]
#在列向量方向上重複inX共1次(橫向),行向量方向上重複inX共dataSetSize次(縱向)
#Numpy的 tile() 函數,就是將原矩陣橫向、縱向地複製。tile 是瓷磚的意思,
#顧名思義,這個函數就是把數組像瓷磚一樣鋪展開來。
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
#二維特徵相減後平方
sqDiffMat = diffMat**2
#sum()所有元素相加,sum(0)列相加,sum(1)行相加
sqDistances = sqDiffMat.sum(axis=1)
#開方,計算出距離
distances = sqDistances**0.5
#返回distances中元素從小到大排序後的索引值
sortedDistIndices = distances.argsort()
#定一個記錄類別次數的字典
classCount = {}
for i in range(k):
#取出前k個元素的類別
voteIlabel = labels[sortedDistIndices[i]]
#dict.get(key,default=None),字典的get()方法,返回指定鍵的值,如果值不在字典中返回默認值。
#計算類別次數
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
#python3中用items()替換python2中的iteritems()
#key=operator.itemgetter(1)根據字典的值進行排序
#key=operator.itemgetter(0)根據字典的鍵進行排序
#reverse降序排序字典
#sortedClassCount輸出結果是:“分類名稱,次數”
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
#返回次數最多的類別,即所要分類的類別
#sortedClassCount[0][0]表示返回第一個數組的第一個分類名稱
return sortedClassCount[0][0]
if __name__ == '__main__':
#創建數據集
group, labels = createDataSet()
#測試集
test = [101,20]
#kNN分類
test_class = classify0(test, group, labels, 3)
#打印分類結果
print(test_class)
代碼註釋:
①Numpy的 tile() 函數,就是將原矩陣橫向、縱向地複製。tile 是瓷磚的意思,顧名思義,這個函數就是把數組像瓷磚一樣鋪展開來。
橫向鋪展:
縱向鋪展:
②def 的使用
3.argsort()函數使用
先將[6,-1,7,2,8]按由小到大排序,分別爲[-1,2,6,7,8], -1在數組mat中的位置是1;2 在數組mat中的位置是3,依次得到0,2,4。
我們發現argsort()函數是將mat中的元素從小到大排列,提取其對應的index(索引),然後輸出到y
4 對於labels[sortedDistIndices[i]]這行代碼,解釋如下
sortedDistIndices等同於序號3中的‘y’, i從0開始取值...,sortedDistIndices[]會輸出如下:
labels[]會輸出如下:
5.詞典中get()函數使用
6.循環語句 for i in range(k)
7.Python 字典(Dictionary) items() 函數以列表返回可遍歷的(鍵, 值) 元組數組。
8. sorted()函數
9. sortedClassCount[0][0]的關於[0][0]解釋