K-近邻算法实现简单filmClassify

来源:互联网 发布:dayz没有数据连接 编辑:程序博客网 时间:2024/06/16 02:24

k-近邻算法采用测量不同特征值之间的距离方法进行分类,属于监督学习。

主要代码如下:
def createDataSet():    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    labels = ['A','A','B','B']    return group,labelsdef classify0(inX,dataSet,labels,k):    dataSetSize = dataSet.shape[0]    diffMat = tile(inX,(dataSetSize,1)) - dataSet    sqDiffMat = diffMat **2    sqDistances = sqDiffMat.sum(axis=1)    distances = sqDistances **0.5    sortedDistIndicies = distances.argsort()    classCount = {}    for i in range(k):        voteIlabel = labels[sortedDistIndicies[i]]        classCount[voteIlabel] = classCount.get(voteIlabel,0) +1    sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)    return sortedClassCount[0][0]
createDataSet()用于导入数据;
主要介绍classify0(inX,dataSet,labels,k):
  1. 4个输入参数:用于分类的输入向量inX,训练样本集dataSet(是一个数组),标签向量labels,用于选择最近邻的数目k;
  2. dataSetSize = dataSet.shape[0] 这一句使用到了NumPy的shape函数,返回矩阵/数组的不同维数的长度,第一个元素(shape[0])表示第一维的长度,亦即行数,即有几个训练数据;
  3. diffMat = tile(inX, (dataSetSize,1)) - dataSet 这里用到了NumPy中的tile(A,reps)函数,用于扩充A,numpy.tile([0,0],(3,1))表示将(0,0)在行上重复3次,在列上重复1次;
  4. sqDiffMat = diffMat**2 求平方;
  5. sqDistances = sqDiffMat.sum(axis=1) 在列上求和;
  6. distances = sqDistances**0.5 求开方,上面的几步是用来计算距离的;
  7. sortedDistIndicies = distances.argsort()使用了argsort()函数,升序排序,返回数组值从小到大的索引index;
  8. classCount={} 这是一个dict,用于存储不同标签出现的次数;
  9. for i in range(k):
      voteIlabel = labels[sortedDistIndicies[i]]
      classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    这里是选择距离最小的k个点, sortedDistIndicies已经排好序,只需迭代的取前k个样本点的labels(即标签),并计算该标签出现的次数,这里还用到了dict.get(key, default=None)函数,key就是dict中的键voteIlabel,如果不存在则返回一个0并存入dict,如果存在则读取当前值并+1;
  10. sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) 这里使用了sorted()函数sorted(iterable, cmp=None, key=None, reverse=False),iteritems()将dict分解为元组列表,operator.itemgetter(1)表示按照第二个元素的次序对元组进行排序,排序默认是升序,reverse=true表示反转,降序排序