在谈R-CNN之前,应该要先总结一下模式识别。
模式识别主要是对已知数据样本的特征发现和提取,比如人脸识别、雷达信号识别等,强调从原始信息中提取有价值的特征,在机器学习里面,好的特征所带来的贡献有时候远远大于算法本身的贡献。在番外篇中,我们使用过opencv中已经训练好的分类器,这也是模式识别的一种。
模式识别从处理问题的性质和解决问题的方法角度,可以分为有监督(分类)与无监督(聚类)两种。二者的主要差别在于,样本是否有labels。一般说来,有监督的分类往往需要提供大量带有labels的样本,但在实际问题中,这是比较困难的,因此研究无监督的分类十分重要。(当然,模式识别已经是比较老的技术,当有监督的分类有用武之地时,更有效的神经网络已经出现了,生不逢时呀)
1.1 分类
1.1.1 K-Nearest Neighbour
首先就是K最近邻(K-NN),是一种比较简单,直观的分类算法,也是计算量很大的一种算法。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。特别的,当k = 1时,该对象被分到离它最近的邻居所在的类中。不过这种算法有个缺点是,它对数据的局部结构敏感,容易过度拟合数据。作为简单的防止过拟合的方法一般都是赋给更近的邻居更大的权重,比如距离的倒数。
参数k的选择很依赖数据,k越大,越容易忽视噪声,但边界也会更模糊。一般可以用不同的k值来训练k-NN分类器,然后验证哪个效果最好。
如果是分两类,k最好选择一个奇数,这样不容易产生某一个点模棱两可的情况。
还有,这个分类器对输入特征值域敏感,如果引入无关的特征会降低分类的准确性。可以将数据归一化到[0, 1]或[-1, 1]的区间内来防止。
1.1.2 决策树算法
决策树算法的核心,是根据先验条件构造一颗最好的决策树,来预测类别。
举一个例子,一个公司评判员工有两个标准,一个是听话程度,一个是聪明程度;
我们靠这两个参数来区分是否是好员工;
聪明 | 听话 | 好员工 |
---|---|---|
8 | 2 | no |
4 | 8 | yes |
8 | 5 | yes |
2 | 6 | no |
我们有几种方法来做区分。以一种为例:用听话程度来区分:
听话>=5 是树的左子树,听话<4是树的右叶子节点,右叶子节点均为坏员工;
再对左子树进行区分,聪明>3为左子树,聪明<=为右子树,左子树均为好员工,右子树均为坏员工;这样就完成了一种决策树。那如何判断决策树的好坏呢?
这种判断好坏的参数就是,信息熵增益。如果经过某个属性,划分后的数据信息熵下降最多,那么这种划分为最优。
如我现在用的方法,第一次划分前熵为:
-(2/4*log2(2/4)+2/4*log2(2/4)) = 1;
划分后右子节点熵为0,左子节点熵:
-(2/3*log2(2/3)+1/3*log2(1/3))= 0.39+0.526 = 0.916;这个熵下降就是0.084。
第二次划分后,区分完毕,熵为0。(举的例子太弟弟了,不太明显,不过还算容易懂啦)
经过决策属性的划分后,数据的无序度越来越低,也就是信息熵越来越小。
具体就不细说啦 我们这可以说图像处理的,有点跑偏了。。顺便说一下,基于规则的分类器和这个大致相同,有兴趣的可以自己搜,就不在这里占用版面了。
1.1.3 贝叶斯分类
说贝叶斯,首先要说朴素贝叶斯。朴素贝叶斯如其名,非常朴素。核心思想就是对于待分类项,求解各个类别出现的概率,然后哪个概率最大,这个分类项就是那个类别。
当然,这个概率获得才是NB的核心。一般我们需要一个训练样本集,统计一下条件概率估计,然后如果每个条件对概率的影响互相不相关,我们就可以算出测试集中某一个样本的各类别概率,从而顺利分类了。朴素贝叶斯一个很重要的点就是每个条件对概率的影响互相不相关。然而这个在现实中几乎不可能,所以贝叶斯分类又有了新的成员:贝叶斯网络。类似决策树(不过这个树是事先确定而不是训练),贝叶斯在每个子叶片上(全部特征区分后的)计算概率,然后用这个概率作为测试集中某一个样本按照条件走下来之后的概率。 贝叶斯网络比朴素贝叶斯更复杂,而想构造和训练出一个好的贝叶斯网络更是异常艰难。但是贝叶斯网络是模拟人的认知思维推理模式,用一组条件概率函数以及有向无环图对不确定性的因果推理关系建模,因此其具有更高的实用价值。
贝叶斯网络要首先确定随机变量之间的拓扑结构。这也是一个容易出问题的环节。
1.1.4 支持向量机(SVM)
这才是重头戏嘛!偷别人一张图说明下:
c1,c2分别是两个类,如何把这两个类区分开呢?就是在中间画条线(废话)
不过这个线其实很有讲究,画在哪里,角度如何呢?
这就是svm算法所研究的核心,核心思想是:让最近的样本点距离这个超平面最远(有点小绕)。那么,我们就有了目标函数:min(样本点i到超平面的距离)。
然后我们改变超平面的参数(这图上是线性的,就只有k,b两个),创造很多超平面,得到max(min(样本点i到超平面j的距离))。
这是一个凸二次规划问题,用拉格朗日对偶法可以解得。网上很多求解过程,看着都累,就不搬上来了,自己搜搜看。当这种方法可以区分的比较好,但是有异常点怎么办呢?svm算法引入了松弛变量的概念,给这个线性超平面一个可以改变的偏置,下面的点只要在这个偏置最大的时候被分类就可以,上面同理。当然,在计算超平面的时候,也要保证这个松弛变量尽量小。(SMO算法)
当样本完全线性不可分的时候怎么办呢?SVM又引入了一个概念:核函数。在我的理解例,核函数就是一个映射,把线性不可分的样本映射到一个线性可分的坐标系中,然后再用线性可分的方法来区分。核函数一般有多项式核和高斯核,除了特殊情况,一般高斯核被使用的最多,因为比较灵活啦。。
感觉也没啥好说的,不过好像蛮重要的诶,说一下python实现的思路:
from numpy import *
def loadDataSet(filename): #读取数据
dataMat=[]
labelMat=[]
fr=open(filename)
for line in fr.readlines():
lineArr=line.strip().split(' ')
dataMat.append([float(lineArr[0]),float(lineArr[1])])
labelMat.append(float(lineArr[2]))
return dataMat,labelMat #返回数据特征和数据类别