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

47 篇文章 37 订阅 ¥9.90 ¥99.00
本文介绍了贝叶斯公式的基本概念,并详细讲解了OpenCV中贝叶斯分类器的相关API,包括构造函数、训练函数和预测函数的用法,通过实例展示了如何运用这些函数进行分类器训练和样本预测。
摘要由CSDN通过智能技术生成

贝叶斯公式简介

    预备知识:

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

(2)如果事件A1A2A3An 构成一个完备事件组,即它们两两互不相容,其和为全集;并且PAi)大于0,则对任一事件BP(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/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值