您的位置:首页 > 运维架构

OpenCV中贝叶斯分类器相关的API及其用法

2016-04-11 20:52 399 查看

1 贝叶斯公式简介

预备知识:

(1)条件概率 事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为P(A|B),读作“在B条件下A的概率”。若只有两个事件A,B,那么,



(2)如果事件A1、A2、A3…An 构成一个完备事件组,即它们两两互不相容,其和为全集;并且P(Ai)大于0,则对任一事件B有P(B)=P(B|A1)*P(A1) + P(B|A2)*P(A2) + ... + P(B|An)*P(An).



学过概率理论的人都知道条件概率的公式:P(AB)=P(A)P(B|A)=P(B)P(A|B);即事件A和事件B同时发生的概率等于在发生A的条件下B发生的概率乘以A的概率。由条件概率公式推导出贝叶斯公式:P(B|A)=P(A|B)P(B)/P(A);即,已知P(A|B),P(A)和P(B)可以计算出P(B|A)。

假设B是由相互独立的事件组成的概率空间{B1,B2,...Bn}。则P(A)可以用全概率公式展开:P(A)=P(A|B1)P(B1)+P(A|B2)P(B2)+..P(A|Bn)P(Bn)。贝叶斯公式表示成:P(Bi|A)=P(A|Bi)P(Bi)/(P(A|B1)P(B1)+P(A|B2)P(B2)+..P(A|Bn)P(Bn));常常把P(Bi|A)称作后验概率,而P(A|Bn)P(Bn)为先验概率。而P(Bi)又叫做基础概率。贝叶斯公式为:



2 OpenCV中与贝叶斯分类器相关的API函数

(1)CvNormalBayesClassifier::CvNormalBayesClassifier()

该函数为默认构造函数;

(2)CvNormalBayesClassifier::CvNormalBayesClassifier(const Mat& trainData, const Mat& responses,

const Mat& varIdx=Mat(), const Mat& sampleIdx=Mat())

该函数实际是在默认构造函数内部调用train()函数进行分类器训练;

(3)bool CvNormalBayesClassifier::train(const Mat& trainData, const Mat& responses, const Mat& varIdx=Mat(),

const Mat& sampleIdx=Mat(), bool update=false )

该函数进行贝叶斯分类器的训练,输入向量必须为行向量;变量response必须为整数,但其在初始化时类型可被设置为CV_32FC1;所有特征向量必须完整,不允许训练样本集的某一个向量存在数据缺失;

(4)float CvNormalBayesClassifier::predict(const Mat& samples, Mat* results=0 )

该函数根据用户输入的测试样本的特征向量,返回其所属的类别;注意,如果输入是很多个测试样本的特征向量组成的矩阵,返回值为result矩阵;

3 举例

#include "opencv.hpp"
#include "iostream"
using namespace cv;
using namespace std;

//10个样本特征向量维数为12的训练样本集,第一列为该样本的类别标签
double inputArr[10][13] =
{
1, 0.708333, 1, 1, -0.320755, -0.105023, -1, 1, -0.419847, -1, -0.225806, 0, 1,
-1, 0.583333, -1, 0.333333, -0.603774, 1, -1, 1, 0.358779, -1, -0.483871, 0, -1,
1, 0.166667, 1, -0.333333, -0.433962, -0.383562, -1, -1, 0.0687023, -1, -0.903226, -1, -1,
-1, 0.458333, 1, 1, -0.358491, -0.374429, -1, -1, -0.480916, 1, -0.935484, 0, -0.333333,
-1, 0.875, -1, -0.333333, -0.509434, -0.347032, -1, 1, -0.236641, 1, -0.935484, -1, -0.333333,
-1, 0.5, 1, 1, -0.509434, -0.767123, -1, -1, 0.0534351, -1, -0.870968, -1, -1,
1, 0.125, 1, 0.333333, -0.320755, -0.406393, 1, 1, 0.0839695, 1, -0.806452, 0, -0.333333,
1, 0.25, 1, 1, -0.698113, -0.484018, -1, 1, 0.0839695, 1, -0.612903, 0, -0.333333,
1, 0.291667, 1, 1, -0.132075, -0.237443, -1, 1, 0.51145, -1, -0.612903, 0, 0.333333,
1, 0.416667, -1, 1, 0.0566038, 0.283105, -1, 1, 0.267176, -1, 0.290323, 0, 1
};

//一个测试样本的特征向量
double testArr[] =
{
0.25, 1, 1, -0.226415, -0.506849, -1, -1, 0.374046, -1, -0.83871, 0, -1
};

int main(int argc, char* argv[])
{
Mat trainData(10, 12, CV_32FC1);//构建训练样本的特征向量
for (int i = 0; i<10; i++)
{
for (int j = 0; j<12; j++)
{
trainData.at<float>(i, j) = inputArr[i][j + 1];
}
}

Mat trainResponse(10, 1, CV_32FC1);//构建训练样本的类别标签
for (int i = 0; i<10; i++)
{
trainResponse.at<float>(i, 0) = inputArr[i][0];
}

CvNormalBayesClassifier nbc;
bool trainFlag = nbc.train(trainData, trainResponse);//进行贝叶斯分类器训练

if (trainFlag)
{
cout << "train over..." << endl;
nbc.save("c:/normalBayes.txt");
}
else
{
cout << "train error..." << endl;
system("pause");
exit(-1);
}

CvNormalBayesClassifier testNbc;
testNbc.load("c:/normalBayes.txt");

Mat testSample(1, 12, CV_32FC1);//构建测试样本
for (int i = 0; i<12; i++)
{
testSample.at<float>(0, i) = testArr[i];
}

float flag = testNbc.predict(testSample);//进行测试
cout << "flag = " << flag << endl;

system("pause");
return 0;
}


文章转载至http://blog.csdn.net/carson2005/article/details/6854024/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: