创建ch2.py
#k-近邻算法
from numpy import *
import operator
def createDataSet():
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['A','A','B','B']
return group,labels
创建ch2_1.py
import operator
from numpy import *
import ch2
group,labels=ch2.createDataSet()
print('group:',group)
print('labels:',labels)
def classify0(inX,dataSet,labels,k): #inX:用于分类的输入向量 dataSet:训练的样本集
dataSetSize=dataSet.shape[0]
#计算距离 根据欧式距离公式
diffMat=tile(inX,(dataSetSize,1))-dataSet #tile(inX,(A,B)) 将在行方向上重复inX A次 在列方向重复B次
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1) # axis=1 是将一个矩阵的每一行向量相加
distances=sqDistances**0.5 #开根号
sortedDistIndicies=distances.argsort()#将distances中的元素从小到大排列,提取其对应的index(索引)
classCount={}
#选择距离最小的k个点
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #初始值为0 如过classCount中有某个标签则+1
#排序 将字典中的值从大到小排序
sortedClassCount=sorted(classCount.items(), #返回可遍历的(键, 值) 元组数组
key=operator.itemgetter(1),
reverse=True) #reverse = True 降序
return sortedClassCount[0][0]
if __name__ == '__main__':
label=classify0([0,0],group,labels,3)
print('类别:',label)