最近想搞点事情,用opencv实现手写数字、字母识别。核心算法就是KNN,好高大上,其实原理明白了也不难的。
什么是KNN(k-NearestNeighbor),它是一个理论上比较成熟的方法,是一种最简单的分类算法,是基于实例的最基本的学习方法,是最好的文本分类算法之一,是数据挖掘分类技术中最简单的方法之一。(说白了就是一种分类器)
KNN算法机器学习中“懒惰学习”的代表,它在训练阶段只是把数据保存下来,训练时间开销为0,等收到测试样本后进行处理。怎么理解,就像我,平时不学习,等到考试了就使劲复习,这样节省了平时的学习时间(训练时间),这样就需要在考试前花大把大把的时间复习(这样导致程序运行中,KNN分类器的运行效率低一点)。
具体原理是什么?
存在一个样本数据集合(每个数据都带有标签),也就是训练样本集,即我们通过标签知道 样本集中 每个数据 与 所属分类 对应的关系。然后在我们输入没有标签的数据后(也就是需要进行分类的数据),将新数据中的 每个特征 与 样本集中 数据对应的特征进行比较,提取出样本集中特征最相似数据(最近邻)的分类标签。
用下面左图来解释其原理,绿色为新数据(需要归类的数据),你觉得图像中绿色归为红色三角合适还是蓝色矩形好?
KNN算法是这样分类的,如果K=3(也就是选择离着最近的三个样本数据,也就是小圆内),那么离绿色点最近的有2个红色的三角形和1个蓝色的矩形,这三个点进行投票,于是绿色的待分类点就属于红色的三角形。而如果K=5,那么离绿色点最近的有2个红色的三角形和3个蓝色的正方形,这五个点进行投票,于是绿色的待分类点就属于蓝色的矩形。
K值的选择会对k近邻法的结果产生重大影响。在应用中,k值一般取一个比较小的数值,通常采用交叉验证法来选取最优的k值,K一般取值不大于20。