from numpy import *
import operator
def createDataSet():
group=array([[1.0,2.0],[2.3,3.1],[3.1,4.1],[4.5,6.7],[1.9,3.1]])
label=[0,0,1,1,0]
return group,label
def knn_classifitor(x_new,x_ini,y_ini,k):
# 计算x_new与x_ini之间的距离
ini_num=x_ini.shape(0)
x_new_tile=tile(x_new,(ini_num,1))
# tile可以理解成一个复制函数,相当于垒砖,垒砖的尺寸就是后面括号里的参数,比如(2,1)就是2行1列。
minus=x_new_tile-x_ini
minus_quard=minus**2
sum_quard=minus_quard.sum(axis=1)
# .sum(axis=1)表示按照行求和,比如某个矩阵使用这个,那就是对每行求和,得到一列,这是直观解释,实际中返回的都是一行。
distance=sum_quard**0.5
distance_rank=sum_quard_sqrt.argsort()
# argsort()返回按照从小到大排序的话,最小的元素的index排在新生成的对象的最前面,以此类推。
# 比如[1,8,2,9,3].argsort
# =[最小的元素即1在原对象中的index即0,第二小即2的index即2,第三小3index4,第四小8index1,第五小9index3]
# =[0,2,4,1,3]
voteDict={} # 创建空dict,用于计数
for i in range(k):
voteLabel=labels[distance_rank[i]]
voteDict[voteLabel]=voteDict.get(voteLabel,0)+1
# voteDict返回的是:根据前k个邻居,算算他们都是什么类(字典index),各个类分别有多少人(字典的value)
# 字典后面的get方法是获取字典中index为括号中参数(voteLabel)的对应的value,如果value为空,则用括号中第二个参数补充
# 这里不使用中括号切片而是使用get,应该就是为了把空值补充成0吧。
NeighboursSorted=sorted(voteDict.iteritems(),key=operator.itemgetter(1),reverse=Ture)
# sorted就是个排序函数,返回的是排序后的结果
# 第一个参数:iteritems是把voteDict它迭代化,因为字典是无序的,排序的第一个参数必须是可迭代的,所以这里给迭代化一下
# 迭代化这个词,我的理解就是单纯从一个无序等价的东西,变成一个有队列前后次序的对象
# key这个参数是一个函数,这个函数作用在第一个参数指定的迭代器身上,根据得到的函数结果进行排序
# 这里这个句子的意思就是按照字典的第二个域(也就是value)进行排序。
# 实现的功能就是对这一类字典中的数值进行排序:类别名称:邻居数。
return NeighboursSorted[0][0]