# 实现KNN最近邻算法
# 2019-6-11
# by llllzy
import os
os.getcwd()
os.chdir('E:\\python')
# 加载包
import numpy as np
import math
import operator
# 读取数据集
import kNN # 放在同一目录,注意大小写
group,labels = kNN.createDataSet()
# K-近邻算法(对一个向量进行分类的函数)
def kNNClassifier(inX, data, labels, k):
# 获取数据集行数
dataSize = data.shape[0]
dist = np.empty(dataSize)
classCount = {} # 初始字典格式
# 计算已知类别数据集中的每个点和当前点之间的距离
for i in range(dataSize):
dist[i] = np.sqrt(np.sum(np.square(inX-data[i]))) # 等价于np.linalg.norm(inX-data[i]) 此处用的是欧氏距离
# 将距离从小到大排序,标出排序的索引
SortedIndexs = dist.argsort()
# 选取与当前点距离最小的k个点
for j in range(k):
labels_topk = labels[SortedIndexs[j]] # 获取前k个距离最小的点的labels
classCount[labels_topk] = classCount.get(labels_topk, 0) + 1 # .get(labels_topk, 0) 若labels_topk 不存在,则在字典中生成该元素,并使其对应数字为0
# 确定前k个点所在类别的出现频率
Sorted_classCount = sorted(classCount, reverse=True) # 对标签按频次从大到小排序
result = Sorted_classCount[0][0] # 获取字典中排在第一的值
return result
kNNClassifier([0,0], group, labels, 3) # test