from numpy import *
import operator
def creatDataset():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
lables = ['A','A','B','B']
return group,lables
def classify0(inX,dataSet,lables,k):
#array的shape函数返回指定维度的大小,如dataset为n*m的矩阵,则dataset.shape[0]返回n,dataset.shape[1]返回m,dataset.shape返回n,m
dataSetSize = dataSet.shape[0]
#tile函数简单的理解,它的功能是重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组
#所以此处tile(inX,(dataSetSize,1))的作用是将inX重复复制dataSetSize次,以便与训练样本集的样本个数一致
#减去dataSet就是求出其差值,所以diffMat为一个差值矩阵
diffMat = tile(inX,(dataSetSize,1))- dataSet
#以下三行代码执行的是欧式距离的计算
sqDiffMat = diffMat**2
#平时用的sum应该是默认的axis=0,就是普通的相加,而当加入axis=1以后就是将一个矩阵的每一行向量相加,axis用于控制是行相加还是列相加
sqDistances = sqDiffMat.sum(axis=1)
distance = sqDistances**0.5
sortedDistance = distance.argsort()
#<span style="text-indent: 28px;">确定前K个点所在类别出现的频率</span>
classCount= {}
for i in range(k):
voteLable = lables[sortedDistance[i]]
#dict.get(key, default=None)key 为字典中要查找的键,default如果指定键的值不存在时,返回该默认值值。此句代码用于统计标签出现的次数
classCount[voteLable] = classCount.get(voteLable,0)+1
#sorted函数参数解释,sorted(iterable, cmp=None, key=None, reverse=False)
#iterable:是可迭代类型;
#cmp:用于比较的函数,比较什么由key决定;
#key:用列表元素的某个属性或函数进行作为关键字,有默认值,迭代集合中的一项;
#reverse:排序规则. reverse = True 降序 或者 reverse = False 升序,有默认值。
#返回值:是一个经过排序的可迭代类型,与iterable一样。
######
#operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号)
return sortedClassCount[0][0]
group,lables=creatDataset()
print classify0([0,0],group,lables,3) #测试[0,0]所属类别
import operator
def creatDataset():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
lables = ['A','A','B','B']
return group,lables
def classify0(inX,dataSet,lables,k):
#array的shape函数返回指定维度的大小,如dataset为n*m的矩阵,则dataset.shape[0]返回n,dataset.shape[1]返回m,dataset.shape返回n,m
dataSetSize = dataSet.shape[0]
#tile函数简单的理解,它的功能是重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组
#所以此处tile(inX,(dataSetSize,1))的作用是将inX重复复制dataSetSize次,以便与训练样本集的样本个数一致
#减去dataSet就是求出其差值,所以diffMat为一个差值矩阵
diffMat = tile(inX,(dataSetSize,1))- dataSet
#以下三行代码执行的是欧式距离的计算
sqDiffMat = diffMat**2
#平时用的sum应该是默认的axis=0,就是普通的相加,而当加入axis=1以后就是将一个矩阵的每一行向量相加,axis用于控制是行相加还是列相加
sqDistances = sqDiffMat.sum(axis=1)
distance = sqDistances**0.5
#相关性的排序
#argsort函数返回的是数组值从小到大的索引值
sortedDistance = distance.argsort()
#<span style="text-indent: 28px;">确定前K个点所在类别出现的频率</span>
classCount= {}
for i in range(k):
voteLable = lables[sortedDistance[i]]
#dict.get(key, default=None)key 为字典中要查找的键,default如果指定键的值不存在时,返回该默认值值。此句代码用于统计标签出现的次数
classCount[voteLable] = classCount.get(voteLable,0)+1
#sorted函数参数解释,sorted(iterable, cmp=None, key=None, reverse=False)
#iterable:是可迭代类型;
#cmp:用于比较的函数,比较什么由key决定;
#key:用列表元素的某个属性或函数进行作为关键字,有默认值,迭代集合中的一项;
#reverse:排序规则. reverse = True 降序 或者 reverse = False 升序,有默认值。
#返回值:是一个经过排序的可迭代类型,与iterable一样。
######
#operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号)
######
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
group,lables=creatDataset()
print classify0([0,0],group,lables,3) #测试[0,0]所属类别