OpenCV中的机器学习方法
Mahalanobis算法:通过除以协方差来对数据空间进行变换,然后计算距离。如果协方差矩阵是单位矩阵,那么该度量等价于欧氏距离。
K均值算法:一种非监督的聚类方法,使用K个均值来表示数据的分布,其中K的大小由用户定义。该方法与期望最大化方法的区别是K均值的中心不是高斯分布,而且因为各个中心竞争去“俘获”最近的点,所以聚类结果更像肥皂泡。聚类区域经常被用作稀疏直方图的bin,用来描述数据。
正态/朴素贝叶斯分类器算法:一种通用的分类器,它假设特征是高斯分布而且统计上互相独立。这个假设过于苛刻,在很多条件下不能满足,故被称作“朴素贝叶斯”分类器。而在许多情况下,这个分类器的效果却出奇的好。
决策树算法:一个判别分类器。该树在当前节点通过寻找数据特征和一个阈值,来最优化分数据得不同的类别。处理流程是不停地划分数据并向下到树的左侧子节点或右侧子节点。虽然它一般不具有最优性能,但是往往是测试算法的第一选择,因为它的速度比较快。而且具有不错的功能。
Boosting算法:多个判别子分类器的组合。最终的分类决策是由各个子分类器的加权组合来决定。在训练时,逐个训练子分类器,且每个子分类器是一个弱分类器(只是优于随机选择的性能)。这些弱分类器由单变量决策树构成,被称作“树桩”。在训练时,“树桩”不仅从数据中学习分类决策,而且还根据识别精度学习“投票”的权重。当逐个训练分类器的时候,数据样本的权重被重新分配,使之能够给予分错的数据更多的注意力。训练过程不停地执行,直到总错误(加权组合所有决策树组成的分类器产生的错误)低于某个已经设置好的阈值。为了达到好的效果,这个方法通常需要很大量训练的训练数据。
随机森林:这是由许多决策树组成的“森林”,每个决策树向下递归以获取最大深度。在学习过程中,每棵树的每个节点只从特征数据的一个随机子集中选择。这保证了每棵树是统计上不相关的分类器。在识别过程中,将每棵树的结果进行投票来确定最终结果,每棵树的权重相同。这个分类器方法经常很有效,而且对每棵树的输出进行平均,可以处理回归问题。
人脸检测/Haar分类器:这个物体检测方法巧妙地使用了boosting算法。OpenCV提供了正面人脸检测的检测器,它的检测效果非常好。你也可使用OpenCV提供的软件训练算法,使之能够检测其他物体。该算法非常擅长检测特定视角的刚性物体。
期望最大化(EM)算法:一种用于聚类的非监督生成算法,它可以拟合N个多维高斯到数据上,此处,N的大小由用户决定。这样仅仅使用几个参数(均值和方差)就可以非常有效的表达一个比较负责的分布。该方法经常用于分科。
K近邻:K近邻可能是最简单的分类器。训练数据跟类别标签存放在一起,离测试数据最近的(欧氏距离最近)K个样本进行投票,确定测试数据的分类结果。该方法通常比较有效,但是速度比较慢且对内存需求比较大。
神经网络/多层感知器:该分类算法在输入结点和输出结点之间具有隐藏结点,这可以更好的表示输入信号。训练该分类器很慢,但是识别时很快。
支持向量机(SVM):它可以进行分类,也可以进行回归。该算法需要定一个高位空间中任两点的距离函数。(将数据投影到高维空间会使数据更容易地线性可分。)该算法可以学习一个分类超平面,用来在高纬空间里实现最优分类器。当数据有限的时候,该算法可以获得非常好的性能,而boosting和随机森林只能在拥有大量训练数据时才有好的效果。
算法使用总结
计算机视觉中使用算法流程:标定数据 –> 提取特征 –> 数据分类(训练集、测试集、验证集) –> 选择分类器。
特征提取:需要寻找表达物体固有属性的特征,如梯度直方图、色彩、各种特征等。如果有背景信息,可能需首先把背景去除,提取出物体,然后进行图像处理(归一化图像、尺度变换、旋转、直方图均衡),计算很多特征。物体的特征向量将与物体的标签对应。
数据分类:建议交叉使用训练集、验证集、测试集。即将所有数据分成K个子集,然后每次随机选取其中一部分来训练,剩余的用来测试。测试结果求平均,得到最终的性能结果。使用交叉验证,可更清楚地看到处理异常数据时分类器的性能。
分类器选择:一般分类器的选择需要考虑计算速度、数据形式和内存大小。一些应用中,在线用户优先选择建模,所以分类器需要能够快速完成训练。这种情况下,最近邻算法、正态贝叶斯和决策树是不错的选择。如果需要考虑内存因素,决策树和神经网络是理想的选择。如果不需要很快训练,而需要很快判断,那么神经网络可以满足要求,正态贝叶斯和SVM也不错。如果不需要训练很快,但是需要精度很高,可选择boosting和随机森林。如果选取的特征比较好,仅仅需要一个简单易懂的分类器,就选择决策树和最近邻算法。要获取最好的性能,离不开boosting和随机森林。
诊断特征重要性的算法:
1)用训练集训练一个分类器。
2)使用验证集或测试集来确定分类器的准确率。
3)对于每一个数据样本和一个选择的特征,随机选择其他特征数据中的该特征的值来替代(替补抽样法)。这样可以保证特征的分布与原始数据集的一样,但是特征的结构或者意义被抹去了(因为它的值是从剩余的数据中随机选择的)。
4)用改变后的训练集训练分类器,然后用改变后的测试集或者验证集来评价分类器。如果完全打乱特征使正确率降低很多,那么这个特征并没有多重要,可以考虑删除。
5)把原始数据重新换一个特征按照3和4操作,直到所有的特征全部分析完毕,得到的结果就是每个特征的重要性。
机器学习中,一些重要规律是:大量数据比少量数据好;好的特征比好的算法更重要。如果选取的特征好,最大化它们的独立性,最小化它们在不同环境下的变化,那么大部分算法那都可以获得比较好的效果。此外,经常遇到的两个问题:
欠拟合:模型假设太严格,所以模型不能拟合到实际数据上;
过拟合:算法不仅学习了数据,而且把噪声也当做信号学习了,这样算法的推广能力很差。
欠拟合的解决方案:使用更多的特征有利于拟合;选用一个学习能力更好的拟合算法。
过拟合的解决方案:增加训练数据的数量可使得拟合曲线更光滑;减少特征的数量可降低过拟合程度;使用一个学习能力差一点的算法。
训练和测试比较好,但实际应用效果不好的解决方案:采集更加真实的数据。
模型无法学习数据的解决方案:重新选择特征,使特征更能表达数据的不变特征;采集更新、更相关的数据;选用一个学习能力更好的拟合算法。
交叉验证与自抽样法
交叉验证首先把数据分为k个不同的子集。然后用k-1个子集进行训练,用没有用来训练的子集进行测试。这样做k次(每个子集都有一次机会作为测试集),然后把结果平均。
自抽样法跟交叉验证类似,但是验证集是从训练集中随机选取的。选择的点仅用于测试,不在训练中使用。这样做N次,每次随机选择一些验证集,最后把得到的结果平均。这意味着一些数据样本会出现在不同的验证集中,自抽样的效果一般胜于交叉验证。
ROC曲线评估了分类器参数的变化对分类器性能的影响。
参考文献:学习OpenCV