from numpy import *
import operator
def createDataSet():
# 创建数据集
group = array([[1.0,1.1],[1.0,1.1],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group,labels
def classify0(inX,dataSet,labels,k):
# inX: 要测试的数据[0,0],[1,1]等
# dataSet:数据集
# labels:数据集的标签
# k:选取的前几个标签
# 距离计算
dataSetSize = dataSet.shape[0]
# print(dataSet.ndim) 数组维数 比如一维数组和二维数组
# dataSet.shape[0]:行数 dataSet.shape[1]:列数
# dataSet 是4行2列 dataSet.shape是元组 dataSet.shape = (4,2)
diffMat = tile(inX, (dataSetSize,1))- dataSet
# tile(A,reps) A指待输入数组 reps决定A重复的次数
# 用于重复数组A来构建新的数据
# reps的纬度为d 那么新数组的纬度为max(d,A.ndim)
# reps第一位决定行上的重复次数 第二位决定列上的重复次数 如果只有一位只在列上重复
# tile是numpy中的函数:tile将原来的一个数组扩充为4个一样的数组
# diffMat得到了一个目标与训练数值之间的差值
sqDiffMat = diffMat**2
# (x1-x2)^2 各个元素分别平方
sqDistances = sqDiffMat.sum(axis = 1)
# axis=1 表示列相加 即得到 (x1-x2)^2 + (y1-y2)^2
distances = sqDistances ** 0.5
# 对距离平方开根得到测试点到各个数据的距离
sortedDistIndicies = distances.argsort()
# 对distances元素从小到大排列 提取对应的index索引输出到sortedDistIndicies
# 本行输出 [2,3,0,1] 表示第三行(下标为2)距离测试最小 第四行(下标为3)距离测试点其次
classCount = {}
# clsaaCount 是个字典类型
for i in range(k):
# 排序从 0-k-1 不包含k
voteIlabel = labels[sortedDistIndicies[i]]
# 找到排好序的各个点的标签 存入voteIlabel中
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
# dict.get(key,default== None) 得到key标签的值 如果不存在该标签返回 default 实例中返回到0
sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True)
print(sortedClassCount)
# sorted(iterable[,cmp[,key[.reverse]]])
# iterable 可迭代对象 指定要排序的list 或者iterable
# cmp 比较函数 大于返回1 小于返回-1 等于返回0
# key 主要用于比较的元素 指定可迭代元素进行排序 operator.itemgetter(1)表示以第二个元素排序
# reverse 排序规则 reverse = True降序 reverse = false 升序 默认升序 默认是false
# sorted(students, key=lambda student : student[2]) 或者 sorted(students, key=operator.itemgetter(1,2)) 多级排序
return sortedClassCount[0][0]
group,labels = createDataSet()
print(classify0([0,0],group,labels,3))