K-近邻(KNN)算法

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

  1. 计算已知类别数据集中的点与当前点之间的距离;
  2. 按照距离递增排序;
  3. 选取与当前点距离最小的k个点;
  4. 确定前k个点所在类别的出现频率;
  5. 返回前k个点出现频率最高的类别作为当前点的预测分类;

2,代码:

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


def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]    //计算行数,shape[1]时计算列数
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet  //俩点之间的距离,坐标相减 tail(a,(b,c)) b为控制行数,c为控制列数
    sqDiffMat = diffMat ** 2   //平方
    sqDistances = sqDiffMat.sum(axis=1)   //axis=1为列相加,0时为行相加
    distances = sqDistances ** 0.5   //开根号
    sortedDistIndicies = distances.argsort()  //将元素按从小到大的顺序返回下标
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1   //get(k,v)方法,有就返回k,没有就返回v
    sortedClassCount = sorted(classCount.iteritems(),   
                              key=operator.itemgetter(1), reverse=True)  //定义函数key获取classcount索引为1的序列,即取classcount序列的每个元素第2个值排序
    return sortedClassCount[0][0]  //调用索引为0可得出分类类别

3,sort函数:

sorted函数包括四个参数即:
sorted(iterable,cmp,key,reverse)
1.iterable表示可迭代对象,包括list,str,tuple,dict,file,以及自定义
2.cmp表示自定的比较函数
3.key对比的关键词
4.reverse表示排列次序,true为降序排列,false为升序排列
在给出的knn算法中应用如下:
sortedclasscount=sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=ture)
      因为之前的代码我们得到了一个字典classcount,其包括了标签与计数,即classcount=['a':5,'b':3]
由于classcount是字典,参见sorted第一个参数的定义,所以通过iteritems函数,转化为可迭代的对象。cmp这里没有定义,不解释。
      key定义为对比用的关键词,即排序的参照,knn算法是选择k中出现频率最高的那一个分类,所以对应classcount索引为1的数字,则通过key=operator.itemgetter(1),定义函数key获取classcount索引为1的序列。
     reverse=ture表示降序排列
这样即通过sorted函数将字典classcount按照计数器次数从大到小排列出来了,只要调用索引为0即可得出分类类别

原文地址:https://www.cnblogs.com/huxinga/p/9428714.html