代码中【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字典的排序