opencv3/C++ 机器学习-正态贝叶斯分类器

正态贝叶斯分类模型假设每个类的特征向量是正态分布的(但不一定是独立分布的)。所以,假设整个数据分布函数是一个高斯混合函数,每个类为一个分量。使用训练数据,该算法估计每个类的均值向量和协方差矩阵,然后将其用于预测。

用于正态分布数据的贝叶斯分类器

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;
}

这里写图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值