from numpy import *#引入numpy
import operator#运算符模块,KNN进行排序时将用到
#创建一个数据集其中数据集只有四点
#取前面两点为A类,后两点为B类
def createDateSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
#输出数据以及类别
group, labels = createDateSet()
print(group, labels)
tile([0,0], (4, 1))
#定义一个函数classify0,有待分类点inX,数据集dataSet,类别labels,分类的个数k
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
#利用欧式距离计算待分类点到已知点两点间距离
diffMat = tile(inX, (dataSetSize, 1)) - dataSet#计算inX每个分量到dataSet每个点的分量对应距离
sqDiffMat = diffMat ** 2#diffMat每个元素平方
sqDistances = sqDiffMat.sum(axis=1)#对每一行求和
distances = sqDistances ** 0.5#开根号计算待分类点到已知点的两点间距离
# print(distances)
sortedDistIndicies = distances.argsort()#将distances中的元素从小到大排列,提取其对应的index(索引)
# print(sortedDistIndicies)
#选择距离最小的k个点
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
# print(voteIlabel)
# dict.get(key, default=None)返回指定键的值,如果值不在字典中返回默认值
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
# print(classCount)
#按照第二个元素的次序对元组进行排序
# iteritems()将dict分解为元组列表
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1), reverse=True)
# print(sortedClassCount)
return sortedClassCount[0][0]