OpenCV学习笔记(12)-朴素贝叶斯分类

来源:互联网 发布:长城证券炒股软件 编辑:程序博客网 时间:2024/06/04 19:50

前面提到的函数都在cxcore库中,现在我们开始讨论OpenCV的机器学习(ML)库.首先看到OpenCV最简单监督学习分类器CvNormalBayesClassifier,也叫正态贝叶斯分类器或朴素贝叶斯分类器.它简单是因为它假设所有的特征之前相互独立,而这在现实中很少见(如,找到一直眼睛常常意味着另一只眼睛在附近).Zhang讨论了这个分类器有时能获得惊人的性能的原因.朴素贝叶斯分类不能处理回归问题,但是它能有效的处理多类问题,而不仅仅是两类问题.这个分类器是当前快速发展的贝叶斯网络(也叫概率图模型)的最简单情况.贝叶斯网络是因果模型.在图13-6中,脸的存在产生了图像中的脸的特征.在使用中,脸是一个隐含变量,通过输入图像的处理得到的脸部特征.它的逆过程,我们假设脸是存在的,然后在脸存在的前提下,随机采样生成了哪些特征.这种自上而下的由原因模型生成数据的方法可以处理纯判断型的模型不能处理的问题.比如,可以生成人脸用于计算机图形显示,机器人可以逐条想象怎样来生成场景,物体并让物体交互.而与图13-6形成对照的是,判断模型会将图中的所有箭头翻转.

贝叶斯网络很深奥,一开始学习的时候很难理解.但是朴素贝叶斯算法衍生于贝叶斯法则的一个简单应用.在这个例子中,给定特征下脸的条件概率p有:


也可以写成:

条件概率 = 可能性*先验概率/证据


实际情况下,我们计算证据,然后决定产生证据的原因.因为用于计算的证据相同,我们可以不考虑这个条件.如果有很多模型,则需要找到有最大分子的那个.分子是模型和证据的联合概率:p(face,LE,RE,N,M.H).我们可以使用条件概率来表示这个联合概率:


使用这个分类器的时候,要学习所有我们需要的物体模型.运行的时候,我们计算特征,找到使上面等式最大的物体.然后,我们测试获得胜利的物体概率是否大于某个给定值,如果是,我们就宣布物体被检测出来了,如果否,我们宣布没有任何一个物体被检测出来.

注意:如果只有一个感兴趣的物体,通常也是这样,那么你会问:"我正在计算的概率与什么有关?"在这种情况下,一直会有一个暗含的第二个物体:背景.背景是除去我们感兴趣的要学习和识别的物体之外的所有物体.

学习所有物体的模型比较简单.我们照很多张照片;计算这些照片的特征,计算每个物体的训练集中某个特征出现的比例.在实际计算中,我们不允许0概率,因为这样会除去某个存在的物体;因此;0概率被赋予了一个很小的值.一般情况下,如果没有很多的数据,简单的模型(朴素贝叶斯)会比很多复杂模型获得很好的性能,因为复杂模型使用了太多的假设,以至产生欠拟合.

朴素贝叶斯代码

朴素贝叶斯分类器的训练方法如下:

bool CvNormalBayesClassifier::train(

const CvMat* _train_data,

const CvMat* _responses,

const CvMat* _var_idx = 0,

const CvMat* _sample_idx = 0,

bool   Update = false

)

它与前面将的一般训练方法一样,但是它只支持CV_ROW_SAMPLR类型的数据.输入变量_train_data应该是有序的(CV_VAR_ORDERED,数字)CV_32FC1向量.输出标签_responses只能是CV_VAR_CATEGORICAL(整型数值,即使是浮点型向量)的向量列.参数_var_idx和_sample_idx可选,它们允许你标记你想使用哪些特征和数据样本.很多情况下会使用所有数据样本,因而复制为NULL,但是_sample_idx还可以用来区分训练集和测试集.这两个向量都是单通道整型数据(CV_32SC1),0意味着跳过.最后,当update变量为true的时候,使用新数据样本更新模型,update为false的时候,从零开始训练模型.

朴素贝叶斯分类器的预测方法计算了它的输入向量的最大可能性的类别.一个或者多个数据按行排列在输入矩阵sample中.预测在results向量中返回对应的类别.如果只有一个输入向量,则只返回一个浮点值,results将被设置为NULL.预测函数的个数如下:

float CvNormalBayesClassifier::predict(

const CvMat* samples,

CvMat* result = 0;

) const;



原创粉丝点击