基本思路
1.计算已知类型数据集中的点与当前点之间的距离
2. 按照距离依次递增次序排序
3. 选取当前点距离最小的k个点
4.确定前k个点所在类别出现的频率
5.返回前k个点出现频率最高的类别作为当前点的类别
k-邻近算法
def classify0(inX,dataSet,lables,k):
dataSetSize=dataSet.shape[0]
# 读取矩阵第一维度的长度
diffMat=tile(inX,(dataSetSize,1))-dataSet
# 函数形式: tile(A,rep) 作用创建矩阵数组
# 功能:重复A的各个维度
# 参数类型:
# - A: Array类的都可以
# - rep:A沿着各个维度重复的次数
print(dataSet)
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
#axis=0表示按列相加,axis=1表示按照行的方向相加
distances=sqDistances**0.5
sortedDistIndicies=distances.argsort()
# 按distances中元素进行升序排序后得到的对应下标的列表
classCount={}
for i in range(k):
voteIlable=lables[sortedDistIndicies[i]]
classCount[voteIlable]=classCount.get(voteIlable,0)+1
sortedClassCount =sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
# 将interitems 改为 items
#print(sortedClassCount[0][0])
return sortedClassCount[0][0]
数据集产生
def createDataSet():
group =array([[1.0,1.0],[1.0,1.0],[0,0],[0,0.1]])
labels= ['A','A','B','B']
return group,labels
测试 数据
import kNN
group,lables=kNN.createDataSet()
print(group,lables)
kNN.classify0([0,0],group,lables,3)
去三个点测试[0,0]属于什么类别