机器学习——k近邻算法原理分析与python代码实现

Posted python学习与大数据分析

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习——k近邻算法原理分析与python代码实现相关的知识,希望对你有一定的参考价值。



一、KNN算法分析


       K近邻分类算法是一种常用的监督学习方法。它采用测量不同特征值之间的距离方法进行分类。它的原理很简单:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。用我们熟知的一个成语来概括就是:近朱者赤近墨者黑。从实践上,我们发现k-近邻算法没有训练过程,它只是把训练样本保存起来,训练开销为零,收到测试样本后才进行处理,它是典型的懒惰学习(lazy learning);


机器学习——k近邻算法原理分析与python代码实现


        如上图有两类数据,分别是蓝色方块和红色三角形,假如我们有一个绿色圆形,需要判断这个圆形是跟蓝色同类还是跟红色同类。我们先把离这个绿色圆圈最近的K个点来帮助判断绿色圆圈离哪个分类的图形比较近,从而对蓝色圆圈进行分类。如果k=3,就表示我们选择离绿色圆圈最近的3个点来判断,由于红色三角形所占比例为2/3,所以我们认为绿色圆形和红色三角形同类。如果k=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。由此可见,k是一个重要参数,当k选不同值时会产生不同的结果。

k值设置过小会降低分类精度;若设置过大且测试样本属于训练集中包含数据较少的类,则会增加噪声,降低分类效果。

通常,k值的设定采用交叉检验的方式(以k=1为基准)

经验规则:k一般低于训练样本数的平方根


K近邻算法通常采用的是欧式距离公式(当然也可以采用其他距离公式,如曼哈顿距离公式。只不过欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。):


二、Python实现

import numpy as np #导入numpy模块import operator as op #导入operator模块

def createDataSet(): # 创建训练集及其对应标签集并返回 group = numpy.array([[1.0, 1.1], [1.2, 1.4], [2.2, 2.9], [2.0, 3.1]]) labels = ['A', 'A', 'B', 'B'] return dataSet, labels

#K-NN分类函数,采用欧式距离公式# ==============================================# 输入:#        inX:目标向量#        dataSet:训练集#        labels:训练集对应的标签集#        k:算法参数# 输出:#        sortedClassCount[0][0]:目标向量的分类结果# ==============================================def classify(inX, dataSet, labels, k): dataSetSize = dataSet.shape[0] #将修改规模后的未知标签的数据记录与训练数据集作差 diffMat = np.tile(inX, (dataSetSize,1)) - dataSet     #将对应得到的差值求平方 sqDiffMat = diffMat**2 #横向求得上面差值平方的和,axis=1:表示矩阵的每一行分别进行相加 sqDistances = sqDiffMat.sum(axis=1) #再对每条记录的平方和开方,得到每一条已知标签的记录与未知标签数据的距离 distances = sqDistances**0.5 #对求得的距离进行排序,返回的是排序之后的数值对应它原来所在位置的下标 sortedDistIndicies = distances.argsort() #创建一个空的字典,用来保存和统计离未知标签数据最近的已知标签与该标签的个数,标签作为字典的key(键),该标签的个数作为字典的value(值) classCount={}     for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) #统计数最大的那个标签,作为对未知标签的预测,也就是该返回标签就是未知标签数据inX的预测标签了 return sortedClassCount[0][0]
def knn():     # 新建训练集及其对应标签集     group, labels = createDataSet()     # 输入目标向量并返回分类结果后打印     label = classify([1.1, 0.0], group, labels, 3)     print label  if __name__ == '__main__':     # 调用测试函数     knn()



-END-

扫描二维码添加小编↓



以上是关于机器学习——k近邻算法原理分析与python代码实现的主要内容,如果未能解决你的问题,请参考以下文章

Python-机器学习-K近邻算法的原理与鸢尾花数据集实现详解

监督学习算法_k-近邻(kNN)分类算法_源代码

机器学习K-近邻算法

《机器学习实战》-k近邻算法

Python机器学习(十六)KNN原理与代码实现

k近邻算法的Python实现