在opencv3.0中,提供了一个ml.cpp的文件,这里面全是机器学习的算法,共提供了这么几种:

1、正态贝叶斯:normal Bayessian classifier    我已在另外一篇博文中介绍过:在opencv3中实现机器学习之:利用正态贝叶斯分类

2、K最近邻:k nearest neighbors classifier

3、支持向量机:support vectors machine    请参考我的另外一篇博客:在opencv3中实现机器学习之:利用svm(支持向量机)分类

4、决策树: decision tree

5、ADA Boost:adaboost

6、梯度提升决策树:gradient boosted trees

7、随机森林:random forest

8、人工神经网络:artificial neural networks

9、EM算法:expectation-maximization

这些算法在任何一本机器学习书本上都可以介绍过,他们大致的分类过程都很相似,主要分为三个环节:

一、收集样本数据sampleData

二、训练分类器mode

三、对测试数据testData进行预测

不同的地方就是在opencv中的参数设定,假设训练数据为trainingDataMat,且已经标注好labelsMat。待测数据为testMat.

1、正态贝叶斯

 // 创建贝叶斯分类器
Ptr<NormalBayesClassifier> model=NormalBayesClassifier::create(); // 设置训练数据
Ptr<TrainData> tData =TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat); //训练分类器
model->train(tData);
//预测数据
float response = model->predict(testMat);

2、K最近邻

 Ptr<KNearest> knn = KNearest::create();  //创建knn分类器
knn->setDefaultK(K); //设定k值
knn->setIsClassifier(true);
// 设置训练数据
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
knn->train(tData);
float response = knn->predict(testMat);

3、支持向量机

Ptr<SVM> svm = SVM::create();    //创建一个分类器
svm->setType(SVM::C_SVC); //设置svm类型
svm->setKernel(SVM::POLY); //设置核函数;
svm->setDegree(0.5);
svm->setGamma();
svm->setCoef0();
svm->setNu(0.5);
svm->setP();
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, , 0.01));
svm->setC(C);
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
svm->train(tData);
float response = svm->predict(testMat);

4、决策树: decision tree

Ptr<DTrees> dtree = DTrees::create();  //创建分类器
dtree->setMaxDepth(); //设置最大深度
dtree->setMinSampleCount();
dtree->setUseSurrogates(false);
dtree->setCVFolds(); //交叉验证
dtree->setUse1SERule(false);
dtree->setTruncatePrunedTree(false);
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
dtree->train(tData);
float response = dtree->predict(testMat);

5、ADA Boost:adaboost

 Ptr<Boost> boost = Boost::create();
boost->setBoostType(Boost::DISCRETE);
boost->setWeakCount();
boost->setWeightTrimRate(0.95);
boost->setMaxDepth();
boost->setUseSurrogates(false);
boost->setPriors(Mat());
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
boost->train(tData);
float response = boost->predict(testMat);

6、梯度提升决策树:gradient boosted trees

此算法在opencv3.0中被注释掉了,原因未知,因此此处提供一个老版本的算法。

GBTrees::Params params( GBTrees::DEVIANCE_LOSS, // loss_function_type
, // weak_count
0.1f, // shrinkage
1.0f, // subsample_portion
, // max_depth
false // use_surrogates )
);
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
Ptr<GBTrees> gbtrees = StatModel::train<GBTrees>(tData, params);
float response = gbtrees->predict(testMat);

7、随机森林:random forest

   Ptr<RTrees> rtrees = RTrees::create();
rtrees->setMaxDepth();
rtrees->setMinSampleCount();
rtrees->setRegressionAccuracy(.f);
rtrees->setUseSurrogates(false);
rtrees->setMaxCategories();
rtrees->setPriors(Mat());
rtrees->setCalculateVarImportance(false);
rtrees->setActiveVarCount();
rtrees->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, , ));
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
rtrees->train(tData);
float response = rtrees->predict(testMat);

8、人工神经网络:artificial neural networks

 Ptr<ANN_MLP> ann = ANN_MLP::create();
ann->setLayerSizes(layer_sizes);
ann->setActivationFunction(ANN_MLP::SIGMOID_SYM, , );
ann->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, , FLT_EPSILON));
ann->setTrainMethod(ANN_MLP::BACKPROP, 0.001);
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
ann->train(tData);
float response = ann->predict(testMat);

9、EM算法:expectation-maximization

EM算法与前面的稍微有点不同,它需要创建很多个model,将trainingDataMat分成很多个modelSamples,每个modelSamples训练出一个model

训练核心代码为:

 int nmodels = (int)labelsMat.size();
vector<Ptr<EM> > em_models(nmodels);
Mat modelSamples; for( i = ; i < nmodels; i++ )
{
const int componentCount = ; modelSamples.release();
for (j = ; j < labelsMat.rows; j++)
{
if (labelsMat.at<int>(j,)== i)
modelSamples.push_back(trainingDataMat.row(j));
} // learn models
if( !modelSamples.empty() )
{
Ptr<EM> em = EM::create();
em->setClustersNumber(componentCount);
em->setCovarianceMatrixType(EM::COV_MAT_DIAGONAL);
em->trainEM(modelSamples, noArray(), noArray(), noArray());
em_models[i] = em;
}
}

预测:

 Mat logLikelihoods(, nmodels, CV_64FC1, Scalar(-DBL_MAX));
for( i = ; i < nmodels; i++ )
{
if( !em_models[i].empty() )
logLikelihoods.at<double>(i) = em_models[i]->predict2(testMat, noArray())[];
}

这么多的机器学习算法,在实际用途中照我的理解其实只需要掌握svm算法就可以了。

ANN算法在opencv中也叫多层感知机,因此在训练的时候,需要分多层。

EM算法需要为每一类创建一个model。

其中一些算法的具体代码练习:在opencv3中的机器学习算法练习:对OCR进行分类

在opencv3中的机器学习算法的更多相关文章

  1. opencv3中的机器学习算法之:EM算法

    不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...

  2. 在opencv3中实现机器学习算法之:利用最近邻算法(knn)实现手写数字分类

    手写数字digits分类,这可是深度学习算法的入门练习.而且还有专门的手写数字MINIST库.opencv提供了一张手写数字图片给我们,先来看看 这是一张密密麻麻的手写数字图:图片大小为1000*20 ...

  3. 在opencv3中的机器学习算法练习:对OCR进行分类

    OCR (Optical Character Recognition,光学字符识别),我们这个练习就是对OCR英文字母进行识别.得到一张OCR图片后,提取出字符相关的ROI图像,并且大小归一化,整个图 ...

  4. scikit-learn中的机器学习算法封装——kNN

    接前面 https://www.cnblogs.com/Liuyt-61/p/11738399.html 回过头来看这张图,什么是机器学习?就是将训练数据集喂给机器学习算法,在上面kNN算法中就是将特 ...

  5. 在opencv3中实现机器学习之:利用逻辑斯谛回归(logistic regression)分类

    logistic regression,注意这个单词logistic ,并不是逻辑(logic)的意思,音译过来应该是逻辑斯谛回归,或者直接叫logistic回归,并不是什么逻辑回归.大部分人都叫成逻 ...

  6. 在opencv3中实现机器学习之:利用svm(支持向量机)分类

    svm分类算法在opencv3中有了很大的变动,取消了CvSVMParams这个类,因此在参数设定上会有些改变. opencv中的svm分类代码,来源于libsvm. #include "s ...

  7. 在opencv3中实现机器学习之:利用正态贝叶斯分类

    opencv3.0版本中,实现正态贝叶斯分类器(Normal Bayes Classifier)分类实例 #include "stdafx.h" #include "op ...

  8. Python机器学习算法 — 朴素贝叶斯算法(Naive Bayes)

    朴素贝叶斯算法 -- 简介 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Baye ...

  9. 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

    一.基于密度的聚类算法的概述     最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...

随机推荐

  1. C语言--static全局使用示例

    前言:看到很多使用Objective-C开发IOS的大牛,有时候会使用static全局变量,相比之下,我却很少用这个,从而很少对其有着比较有实质意义的理解,甚至更别说运用它了. 今天,经过一番思考和自 ...

  2. Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现

    Reverse反转算法 #include <iostream> using namespace std; //交换的函数 void replaced(int &a,int & ...

  3. 局域网内搭建git

    git简介:请大家参看git官网的介绍 http://git-scm.com/book/zh/v1  还有这位大神的git教程:http://www.liaoxuefeng.com/wiki/0013 ...

  4. Centos7安装配置gitlab

    Centos7安装配置gitlab 这篇文字我会介绍在Centos7上安装gitlab,配置gitlab的smtp,并且创建项目demo. sudo yum install openssh-serve ...

  5. 《第一行代码——Android》

    <第一行代码——Android> 基本信息 作者: 郭霖 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115362865 上架时间:2014-7-14 出版日期:2014 ...

  6. JavaScript Patterns 4.3 Returning Functions

    Use closure to store some private data, which is accessible by the returned function but not to the ...

  7. SQL Server游标的使用【转】

    游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服. 正常面向集合的思维方式是: ...

  8. nginx添加模块 (非覆盖安装)

    nginx添加模块(非覆盖安装) 原已经安装好的nginx,现在需要添加一个未被编译安装的模块: 查看原来编译时都带了哪些参数# /usr/local/nginx/sbin/nginx -V ngin ...

  9. Java NIO入门

    NIO入门 前段时间在公司里处理一些大的数据,并对其进行分词.提取关键字等.虽说任务基本完成了(效果也不是特别好),对于Java还没入门的我来说前前后后花了2周的时间,我自己也是醉了.当然也有涉及到机 ...

  10. 解决android的ListView嵌套在ScrollView中不能被滚动的问题

    使用滚动条容易带来一个后果,就是高度和宽度不受控制了, 之前就遇到一个已经有ScrollView的页面需要加个列表listView,然后就发现listView只看到前两行数据,下面的看不到,拉滚动条也 ...