正态贝叶斯分类器
该分类器只能处理特征属性是连续数值的分类问题。
正态贝叶斯分类器认为每一个分类的所有特征属性(即特征向量)服从多变量正态高斯分布;执行步骤:
- 由训练数据估计每个分类的协方差矩阵和均值向量;
计算各个特征属性的均值,构成该类的均值向量;
计算两两特征属性的协方差,构成该类的协方差矩阵; - 每个分类的对数似然函数;
- 将待预测样本的特征属性分别代入各分类的对数似然函数中,最大对数似然函数对应的分类就是该样本的分类结果。
测试用例-性别预测
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/ml/ml.hpp>
using namespace std;
using namespace cv;
using namespace cv::ml;
int main(int argc, char *argv[])
{
//创建正态贝叶斯分类器
Ptr<NormalBayesClassifier> model = NormalBayesClassifier::create();
//训练样本:身高,体重,脚掌长
float trainData[8][3] = {
{6,180,12},
{5.92,190,11},
{5.58,170,12},
{5.92,165,10},
{5,100,6},
{5.5,150,8},
{5.42,130,7},
{5.75,150,9}
};
Mat trainDataMat(8, 3, CV_32FC1, trainData);
cout << trainDataMat << endl;
//训练样本的响应值,1代表M -1代表F
int labels[8] = { 1, 1, 1, 1, -1, -1, -1, -1 };
Mat labelsMat(8, 1, CV_32SC1, labels);
cout << labelsMat << endl;
//创建TrainData并进行训练
Ptr<TrainData> tData = TrainData::create(trainDataMat, ROW_SAMPLE, labelsMat);
model->train(tData);
float myData[3] = {6, 130, 8};//测试样本
Mat myDataMat(1, 3, CV_32FC1, myData);
//利用训练好的分类器进行测试样本预测
int res = model->predict(myDataMat);
cout << endl << "The result is : " << res << endl;
return 0;
}
结果: