正态贝叶斯分类模型假设每个类的特征向量是正态分布的(但不一定是独立分布的)。所以,假设整个数据分布函数是一个高斯混合函数,每个类为一个分量。使用训练数据,该算法估计每个类的均值向量和协方差矩阵,然后将其用于预测。
用于正态分布数据的贝叶斯分类器
NormalBayesClassifier类继承基类StatModel,在NormalBayesClassifier类中增加了两个方法:
1、估计输入向量的最可能类别:
virtual float predictProb(
InputArray inputs, //输入矢量(一个或多个)
OutputArray outputs, //输出结果
OutputArray outputProbs, //对应于每个结果元素的输出概率
int flags=0 ) const = 0;
2、创建空模型:
static Ptr<NormalBayesClassifier> create();
示例:
#include "opencv2/opencv.hpp"
#include "opencv2/ml.hpp"
using namespace cv;
using namespace ml;
//NormalBayes分类
int main(int argc, char** argv)
{
// 训练数据
int labels[8] = {1, -1, 1, 1, -1, 1, -1, 1};
float trainingData[8][2] = {{ 501,150 },{255,10},{501,255},{10,501},{25,80},{150,300},{77,200},{300,300}};
float sampleData[3][2] = {{499,152},{75,199},{298,301}};
Mat trainingDataMat(8, 2, CV_32FC1, trainingData);
Mat labelsMat(8, 1, CV_32SC1, labels);
Ptr<NormalBayesClassifier> normalBayes = NormalBayesClassifier::create();
normalBayes->train(trainingDataMat, SampleTypes::ROW_SAMPLE, labelsMat);
Mat image = Mat::zeros(512, 512, CV_8UC3);
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
Mat sampleMat = (Mat_<float>(1, 2) << j, i);
float respose = normalBayes->predict(sampleMat);
if (respose == 1)
image.at<Vec3b>(i, j) = Vec3b(0, 255, 0);
else if (respose == -1)
image.at<Vec3b>(i, j) = Vec3b(0, 255, 255);
}
}
//绘制出数据点
for (int i = 0; i < 8; i++)
{
Scalar color;
if (labels[i] == 1)
{
color = Scalar(0,0,255);
}
else
{
color = Scalar(255,0,0);
}
circle(image, Point(trainingData[i][0], trainingData[i][1]), 5, color, -1, LINE_8);
}
imshow("output", image);
waitKey();
return 0;
}