基本思路
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]属于什么类别