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/
相关文章推荐
- opencv 鼠标操作SetMouseCallback()函数传递用户定义参数的问题
- hadoop开发环境搭建
- 山东省第一届ACM省赛 D SDUT 2154 Shopping
- 每天一个linux命令(1):pwd命令
- linux下的ssh服务
- Linux目录结构及文件基础操作
- linux模块的编译步骤详解
- 每天一个Linux命令目录
- Centos6.5 ssh修改默认端口号
- Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择
- 近 100 个 Linux 常用命令大全
- linux 安装jdk
- Linux基础篇一
- linux下, 使用iconv命令实现文件目录编码批量转换
- 堆与堆排序与topK问题
- linux/windows环境变量那些事
- @property 后面可以有哪些修饰符?
- Tomcat安装的常见问题以及其第一个应用
- Tomcat安装教程
- Nginx安装及配置文件nginx.conf详解