k-近邻算法

来源:互联网 发布:影音先锋替代软件 编辑:程序博客网 时间:2024/05/29 10:01

k-近邻算法

一、理论介绍

  • K最近邻(k-Nearest Neighbour,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。

  • 例子:
    这里写图片描述

  • 对于上图中的待预测类,当 K=5 ,即选取预测类周围距离最近的五个图形。从蓝色小圆里的图形数目可计算:

                P(A类) = 3 /5            P(B类) = 2 /5

因此,以少数服从多数的原则,认为待预测类属于A类

  • 当 K=15 时,可计算得出:

               P(A类) = 7 /15           P(B类) = 8 /15

因此,认为待预测类属于B类

二、实现步骤

  • 计算待预测点与其他点的距离,并按升序排列。

  • 在第一步计算的结果中,选择前 K 个结果,即距离最小的 K 个点。

  • 分别计算 K 个点中所属类别的比重,取得其中的最大值。其所对应的类别即为待预测点所属类别。

三、代码实现

import numpy as npimport operatordef createDataSet():    group = np.array([[1.0,1.1],[1.0,1.0],[0.0,0.0],[0,0.1]])    labels = ["A","A","B","B"]    return group,labelsdef classify(inX,dataSet,labels,k):    #数据集的大小    dataSetAize = dataSet.shape[0]    #计算预测点与其余点的距离    diffMat = np.tile(inX, (dataSetAize,1))-dataSet    sqDiffMat = diffMat ** 2    sqDistances = sqDiffMat.sum(axis=1)    distance = sqDistances**0.5    #对所求的距离集合进行排序    sortedDistIndices = distance.argsort()    classCout = {}    for i in range(k):        voteLabel = labels[sortedDistIndices[i]]        classCout[voteLabel] = classCout.get(voteLabel,0)+1    sortedClassCount = sorted(classCout.items(),key=operator.itemgetter(1),reverse=True)    return sortedClassCount[0][0]def main():    group,labels=createDataSet()    test = classify([2,2],group,labels,3)       print(test)if __name__ == '__main__':    main()

四、结果展示

这里写图片描述

  • 当输入点为 [2,2] 时,其为A类。

  • 当输入点为 [0,0] 时,其为B类。

  • 当输入点为 [0.5,6] 时,其为A类。

  • 当输入点为 [0.5,0.5] 时,其为B类。