代碼中【1】【2】參照後面博客
import numpy as np
from operator import itemgetter
def creat_dataset():
group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
def classify(inx, dataset, labels, k):
"""
:param inx: 待分類的輸入向量
:param dataset: 數據集
:param labels: 標籤
:param k: k參數
:return: 輸入向量的預測類別
"""
size = dataset.shape[0]
# 計算歐氏距離
diffMat = np.tile(inx, (size, 1)) - dataset
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort() # 距離從小到大的索引值
classCount = {}
# 選擇距離最小的K個點
for i in range(k):
voteLabel = labels[sortedDistIndicies[i]]
# 【1】找到字典中voteLabel對應的值,如果不存在則初始化爲0,然後+1;如果存在直接加1。
classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
# 【2】距離最小的k個點排序, 根據字典值從大到小排序
sortedClassCount = sorted(classCount.items(), key=itemgetter(1), reverse=True)
return sortedClassCount[0][0]
if __name__ == '__main__':
group, labels = creat_dataset()
# 測試[0, 0]用KNN算法屬於哪個類別
ans = classify([0, 0], group, labels, 3)
print(ans)
編程參考博客:
【1】【Python】get()函數作用
【2】python3字典的排序