KNN一个简单的例子

对未知类别属性的数据集中的每个点依次执行以下操作:

  • 计算已知类别的数据集中的点与当前点之间的距离
  • 按距离递增次序排序
  • 选取与当前点距离最小的K个点
  • 确定前K个点所在类别的出现频率
  • 返回前k个点出现频率最高的类别作为当前点的预测分类 
import numpy as np
import operator

def createDataSet():
    group=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels=['A','A','B','B']
    return group,labels

def classif0(inX,dataSet,labels,k=2):

    dataSetSize=dataSet.shape[0]
    diffMat=np.tile(inX,(dataSetSize,1))-dataSet
    sqDiffMat=diffMat**2
    sqDistances=sqDiffMat.sum(axis=1)
    distances=sqDistances**0.5
    print(distances)
    sortedDistIndicies=distances.argsort()#argsort函数返回的是数组值从小到大的索引值
    print(sortedDistIndicies)
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]]
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1#dict.get(key, default=None) key -- 字典中要查找的键。default -- 如果指定键的值不存在时,返回该默认值值
    sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #按第二个价值来排序
    return sortedClassCount[0][0]

A=input()
B=[int(x) for x in A.split()]
dataSet,labels=createDataSet()
print(classif0(B,dataSet,labels))

猜你喜欢

转载自blog.csdn.net/u012785169/article/details/88188171