基于Dragonboard 410c开发板的机器学习研究(一)K-近邻算法
扫描二维码
随时随地手机看文章
机器学习与人工智能一起作为当前最流行的一个概念,目前已经被广泛的应用到各个领域,如人们常用的微信、支付宝、百度等,这些软件里面都集成了机器学习算法,以实现各种智能化的操作,让用户体验更加,如在百度的在线识别图像应用,阿里巴巴的商品智能推荐、人脸识别验证等这些都用到了机器学习的相关技术,当然有的是更高级的深度学习(其实质也是机器学习的一种,更加高大上,具体概念以及关于机器学习、深度学习和模式识别大家可以参考深度学习 vs 机器学习 vs 模式识别三种技术对比这篇文章),但是机器学习只能用在这些高大上的地方么?当然不是,其实在我们普通的开发者想DIY自己的东西的时候,也可以用到机器学习,如在你的智能车视觉避障中就可以用机器学习来构建障碍物模型,在人脸识别中就可以用机器学习来不断优化识别结果,好了废话不多说了,如果能够在自己的DIY中,在你的Dragonboard 410c中用上机器学习,是不是更高大上?
机器学习的算法非常多,今天给大家来一个入门级别的,也是机器学习中最简单的一个算法,K-近邻算法(KNN),该算法是采用不同特征值之间的距离的方法来对不同的对象进行分类,在具体的操作过程中我们需要一个样本集,这个样本集中的所有的特征数据都有一个对应的标签,即这个样本集中所有的数据所对应的分类属性我们是知道的,然后再输入新的数据的时候,KNN算法就通过计算实现新数据与样本数据的比较,同时提取样本中特征最相似的数据对应的分类标签,在具体的KNN处理过程中,通常只选取样本数据的前k个最相似的数据,然后选取这前k个数据中出现次数最多的标签作为结果。
有了上述了解了,基本上你只要知道KNN就是一个简单的分类器,将东西进行分类,既然提到了分类,我们通过生活中简单的一个分类场景来向大家介绍KNN算法的具体实现原理和过程,并且结合Python脚本告诉大家怎么在Dragonbaord 410c上编写和运行KNN算法。
这里引用的是《机器学习实战》中的一个经典的学习例子,根据电影中出现的接吻镜头和打斗镜头的数量来判断一部电影是属于爱情片还是属于动作片,具体可以通过下图来进行描述:
在上图中,我们已经知道了六部电影的接吻镜头和打斗镜头的数目,但是如果给你一个新的电影,并且告诉你了接吻镜头和打斗镜头数,这个时候你该如何确定这部电影是什么类型电影呢?
在分析中,为了更好的看出我们已经知道的六部电影的各种镜头的数量和所属类型,下面给出了各个电影的镜头和类型分布表:
根据前面跟大家聊的KNN算法原理,我们主要是根据样本数据,计算未知的数据与样本数据的距离,然后根据标签出现频率来实现分类,这里我们如果用KNN来实现对根据已知的这六部电影的分类,来实现对未知电影的分类就非常简单了。其中KNN实现核心代码如下:
def 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]
上述代码中classify0包含了4个参数,分别用于输入向量inX、输入训练样本集dataSet、标签向量labels,选择最近邻居的数目参数k,在本文使用的KNN算法中,计算距离使用了常用的欧氏距离公式,如下:
详细的代码大家可以到 http://pan.baidu.com/s/1mh5W0XU 下载,
好了,准备好代码后,我们就可以进行测试了,将代码通过SD卡或者U盘拷贝到我们的Dragonbaord 410c上,然后输入cd命令跳转到代码目录下,输入Python,进入到Python命令模式,输入下面测试命令:
>>> import kNN
>>> group,lables = kNN.createDataSet()
>>>kNN,classify0([0,0],group,lables,3)
我们可以看到输出结果为B,如下图所示,同时大家在测试过程中也可以改变输入的[0,0]为其他值,测试结果。
到这里我们已经成功的完成在Dragonbaord 410c上借助于Python脚本完成了我们KNN算法的编写和测试,利用测试代码大家可以进行扩展,将该分类器用于你的DIY中的其他识别和分类中,让你的DIY变得更加智能,后期我将在机器学习系列blog中向大家进一步介绍更为复杂的机器学习算法和在Dragonbaord410c上实现。