朴素贝叶斯分类器,决策树,boosting,随机森林实现分类

opencv的机器学习检测在ML库中具有很大的相似性。简单来说都可以分成两步:
1、训练/得到分类器。
2、使用分类器进行数据分类。
实现这两步所需要的也只是两个关键函数:
1、train()
2、predict()
以下我们就14组数据进行训练,每组数据有两个参数,来得到分类器,然后再对一组有两个参数的数据进行预测。


预测参数:


下面开始进行编码拟合:

朴素贝叶斯分类

#include "opencv2/ml/ml.hpp"

using namespace std;
using namespace cv;
const int NUM = 14;   //训练样本的个数
const int D = 2;     //维度
//14个维数为4的训练样本集
double inputArr[NUM][D] =
{ 21,3,
24,3,
30,4,
15,3,
13,3,
19,4,
18,3,
12,3,
13,2,
26,4,
17,3,
16,3,
14,3,
16,3,
};

//一个测试样本的特征向量  
double testArr[] = { 20, 3};

int main()
{
    Mat trainData(NUM, D, CV_32FC1);//构建训练样本的特征向量  
    for (int i = 0; i<NUM; i++)  {
        for (int j = 0; j<D; j++)  {
            trainData.at<float>(i, j) = inputArr[i][j + 1];
        }
    }
    Mat trainResponse = (Mat_<float>(NUM, 1) <<
        39,36,53,31,22,25,33,26,50,25,24,57,33,23);//构建训练样本的类别标签  

    CvNormalBayesClassifier Mybayes;
    bool trainFlag = Mybayes.train(trainData, trainResponse);//进行贝叶斯分类器训练  
    if (trainFlag)  {
        Mybayes.save("normalBayes.txt");
    }
    else  {
        system("pause");
        exit(-1);
    }
    CvNormalBayesClassifier Tbayes;
    Tbayes.load("normalBayes.txt");

    Mat testSample(1, D, CV_32FC1);//构建测试样本  
    for (int i = 0; i<D; i++)  {
        testSample.at<float>(0, i) = testArr[i];
    }
    float flag = Tbayes.predict(testSample);//进行测试  
    cout << "flag = " << flag << endl;
    system("pause");
    return 0;
}

得到的结果为:


朴素贝叶斯分类器

决策树

#include "opencv2/core/core_c.h"
#include "opencv2/ml/ml.hpp"
#include<stdlib.h>
#include <iostream>

int main()
{
    //init data
    float fdata[14][2] = { 
        21, 3,
        24, 3,
        30, 4,
        15, 3,
        13, 3,
        19, 4,
        18, 3,
        12, 3,
        13, 2,
        26, 4,
        17, 3,
        16, 3,
        14, 3,
        16, 3,
    };
    cv::Mat data(14, 2, CV_32F, fdata);
    float fresponses[14] = { 39, 36, 53, 31, 22, 25, 33, 26, 50, 25, 24, 57, 33, 23 };
    cv::Mat responses(14, 1, CV_32F, fresponses);
    CvDTree *tree;
    CvDTreeParams params(10,2, 0,true,15, 0, true,true, NULL);
    tree = new CvDTree;
    tree->train(data, CV_ROW_SAMPLE, responses, cv::Mat(),
        cv::Mat(), cv::Mat(), cv::Mat(),
        params);

    double testArr[] = { 20, 3 };
    cv::Mat sample(1, 2, CV_32F, testArr);
    double flag = tree->predict(sample, cv::Mat())->value;
    std::cout << "flag=" << flag << std::endl;
    system("pause");
    return 0;
}

得到的结果是:


决策树

随机森林

#include "opencv2/core/core.hpp"  
#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/imgproc/imgproc.hpp"  
#include "opencv2/ml/ml.hpp"  

#include<stdlib.h>
#include <iostream>  
using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    double trainingData[14][2] = { 21, 3,
        24, 3,
        30, 4,
        15, 3,
        13, 3,
        19, 4,
        18, 3,
        12, 3,
        13, 2,
        26, 4,
        17, 3,
        16, 3,
        14, 3,
        16, 3 };
    CvMat trainingDataCvMat = cvMat(14, 2, CV_32FC1, trainingData);

    float responses[14] = { 39, 36, 53, 31, 22, 25, 33, 26, 50, 25, 24, 57, 33, 23 };
    CvMat responsesCvMat = cvMat(14, 1, CV_32FC1, responses);

    CvRTParams params = CvRTParams(10, 2, 0, false, 16, 0, true, 0, 100, 0, CV_TERMCRIT_ITER);

    CvERTrees etrees;
    etrees.train(&trainingDataCvMat, CV_ROW_SAMPLE, &responsesCvMat,
        NULL, NULL, NULL, NULL, params);

    double sampleData[2] = { 20, 3 };
    Mat sampleMat(2, 1, CV_32FC1, sampleData);
    float flag = etrees.predict(sampleMat);
    cout << "flag=" << flag << endl;
    system("pause");
    return 0;
}

得到的结果是:


随机森林

boosting

由于boosting的原理是将若干个弱分类器进行结合得到一个强分类器,如图所示
boosting原理

所以boosting只支持二级分类,我们为了和上述其他几种情况作对比,将不小于26的response值设置为1,不大于25的response值设置为0,来进行分类训练,观察得到的结果。


response的新旧值对照表
#include "opencv2/core/core.hpp"  
#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/imgproc/imgproc.hpp"  
#include "opencv2/ml/ml.hpp"  
#include <iostream>  
#include<stdlib.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    float trainingData[14][2] = { 21, 3,
        24, 3,
        30, 4,
        15, 3,
        13, 3,
        19, 4,
        18, 3,
        12, 3,
        13, 2,
        26, 4,
        17, 3,
        16, 3,
        14, 3,
        16, 3 };
    Mat trainingDataMat(14, 2, CV_32FC1, trainingData);
    float responses[14] = { 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0 };
    Mat responsesMat(14, 1, CV_32FC1, responses);
    float prior[] = {1,1};
    CvBoostParams params(CvBoost::REAL, // boost_type    
        10, // weak_count    
        0.95, // weight_trim_rate    
        15, // max_depth    
        false, // use_surrogates    
        prior
        );

    CvBoost boost;
    boost.train(trainingDataMat,
        CV_ROW_SAMPLE,
        responsesMat,
        Mat(),
        Mat(),
        Mat(),
        Mat(),
        params
        );
    float myData[2] = { 20, 3 };
    Mat myDataMat(2, 1, CV_32FC1, myData);
    double flag = boost.predict(myDataMat);
    cout << "flag=" << flag << endl;
    system("pause");
    return 0;
}
boosting

可以认为boosting计算出的值为26。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容