k最临近(kNN)算法Python实现

k最临近(kNN)算法Python实现

工作原理

  • 存在这样的一个样本数据集合,也被称为训练样本集,样本集中每个数据都有标签
  • 输入没有标签的新数据后,将新数据中的每个特征与样本集中的对应特征进行比较,然后算法提取出样本集中最相似(最邻近)数据
  • k一般不大于20
  • 选择样本集中出现次数最多的分类,作为新数据的分类

实施kNN分类算法

我们首先创建一个简单的数据集,共有四组数据,标签分别是AABB:

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

之后我们开始写kNN算法,kNN算法对未知类别属性的数据集中的每个点依次执行以下操作

  • 计算已知类别数据集中的点与当前点之间的距离
  • 按照距离递增次数排序
  • 选取与当前点距离最小的k个点
  • 确定前k个点所在类别的出现频率
  • 返回前k个点出现频率最高的类别作为当前点的预测分类
    实现代码如下:
def classify0(inX,dataSet,labels,k):
    #inX:要分类的输入向量
    #dataSet:数据集
    #labels:标签向量,与dataSet的行数相同
    #k:选取的最相邻的的数目
    #dataSet.shape就是[4,2],
    # dataSet.shape[0]就是4,dataSet.shape[1]就是2
    dataSetSize=dataSet.shape[0]#获取数据集大小
    #tile(matrix,num)就是返回一个重复num次的matrix
    #接下来两步就是计算欧氏距离了,distance就是实际的距离
    diffMat = tile(inX,(dataSetSize,1))-dataSet
    sqDiffMat = diffMat**2
    sqDistances=sqDiffMat.sum(axis=1)
    distances =sqDistances**0.5
    #argsort就是将距离按升序排列
    sortDistIndicies = distances.argsort()
    classCount={}
    for i in range(k):
        #给标签计算前k个的sum
        voteIlabel =labels[sortDistIndicies[i]]
        classCount[voteIlabel] =classCount.get(voteIlabel,0) +1
    #给classCount排序,降序
    sortedClassCount =sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount

接下来我们用一个小测试来尝试,我们用[0,0]来测试函数,很明显这个数据应该属于B:

group,labels=createDataSet()
print(classify0([0,0],group,labels,3))

输出结果为:

[('B', 2), ('A', 1)]

优缺点

优点

  • 简单,容易理解,易于实现,而且不需要估计参数
  • 不需要训练模型
  • 可以处理分类问题,多分类问题,特别适合多分类问题
  • 可以处理回归问题,预测
    -与朴素贝叶斯算法相比,对数据没有假设,准确度高,对异常点不敏感
    缺点:计算复杂度高、空间复杂度高
  • 计算量大,当特征数很多的时候,每一个要分类的数据都要计算它与全体样本集中数据距离,才能得到前k个最近邻点。
  • 可理解性差,不像决策树那样直观
  • 预测时速度比逻辑回归之类的算法慢
  • 样本不平衡时,对稀有类别的预测准确率低。来一个最极端的例子,一个样本集中有50个A类数据,2个B类数据,目前测试一个明显是B类的数据,k取4以上的话,结果却是A。
  • 我们无法知晓平均实例样本和典型实例样本具有什么特征。对训练数据的容错性差
    适用的数据范围:数值型和标称型

参考文献

[1].Harrington P , 李锐等. 机器学习实战[M]. 人民邮电出版社, 2013.

你可能感兴趣的:(机器学习,机器学习)