依据机器学习算法如何学习数据可分为3类:
有监督学习:从有标签的数据学习,得到模型参数,对测试数据正确分类;
无监督学习:没有标签,计算机自己寻找输入数据可能的模型;
强化学习(reinforcement learning):计算机与动态环境交互,学习错误反馈达到更优的目的。

依据机器学习期望结果来分类:
分类:输入被分为N个类别的一种;
回归:输出是连续值;如依据房子的大小,时间,位置来预测房子的价格;
聚类:使用无监督学习将输入聚为N类;
密度估计(density estimation):找到输入可能的分布;

以OpenCV的SVM为例:
支持向量机较其他传统机器学习算法的优点:
1、小样本,并不是说样本的绝对数量少(实际上,对任何算法来说,更多的样本几乎总是能带来更好的效果),而是说与问题的复杂度比起来,SVM算法要求的样本数是相对比较少的。SVM解决问题的时候,和样本的维数是无关的(甚至样本是上万维的都可以,这使得SVM很适合用来解决文本分类的问题,当然,有这样的能力也因为引入了核函数)。
2、结构风险最小。(对问题真实模型的逼近与问题真实解之间的误差,就叫做风险,更严格的说,误差的累积叫做风险)。
3、非线性,是指SVM擅长应付样本数据线性不可分的情况,主要通过松弛变量(也有人叫惩罚变量)和核函数技术来实现,这一部分是SVM的精髓。

SVM的精髓之一核函数:OpenCV提供了以下几种
线性核函数:SVM::LINEAR,线性内核,没有高维空间映射,速度快;
多项式核函数:SVM::POLY,gamma>0,coef(),degree;
径向基核函数: SVM::RBF,比较好的选择,gamma>0;
SIGMOD核函数:这个核让人想起神经网络和深度学习。。gamma,coef();

上面核中记录了SVM使用的参数;见SVMParams();
C++: CvSVMParams::CvSVMParams(int svm_type, int kernel_type, double degree, double gamma, double coef0, double Cvalue, double nu, double p, CvMat* class_weights, CvTermCriteria term_crit)

svm_type:SVM类型:
1、CvSVM::C_SVC : C类支撑向量分类机。 n类分组 (n≥2),容许用异常值处罚因子C进行不完全分类。
2、CvSVM::NU_SVC : 类支撑向量分类机。n类似然不完全分类的分类器。参数为gamma代替C。
3、CvSVM::ONE_CLASS : 单分类器,所有的练习数据提取自同一个类里,然后SVM建树了一个分界线以分别该类在特点空间中所占区域和其它类在特点空间中所占区域。
4、CvSVM::EPS_SVR : 用于回归。练习集中的特征向量和拟合出来的超平面的间隔须要小于p。异常值处罚因子C被采取。
5、CvSVM::NU_SVR : 回归机,gamma代替p
kernel_type:即上面所说的核函数类型;仔细看可以发现这两个参数类型都是int,所以除了填这些宏一样的名称外也可以直接填1,2,3.。。。
degree,gamma,coef0,都是特定核函数使用的参数,上面有总结;
Cvalue:SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C。
nu:SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数 gamma;
p:SVM类型(EPS_SVR)的参数
class_weights:C_SVC中的可选权重,赋给指定的类,乘以C后变成 class_weights*C;
term_crit:SVM的迭代终止条件,可以指定的公差和最大迭代次数。
不设置时使用默认初始值初始化各参数。

SVM的训练函数有两个,训练的好坏直接影响学习结果,非常重要。
C++: bool CvSVM::train(const Mat& trainData, const Mat& responses, const Mat& varIdx=Mat(), const Mat& sampleIdx=Mat(), CvSVMParams params=CvSVMParams() )

C++: bool CvSVM::train_auto();
推荐第二个,因为能帮你优化参数啊!!!除非你自认调参能力出众可选第一个!

训练后就是预测了,SVM有以下三种形式:
C++: float CvSVM::predict(const Mat& sample, bool returnDFVal=false ) const
C++: float CvSVM::predict(const CvMat* sample, bool returnDFVal=false ) const
C++: float CvSVM::predict(const CvMat* samples, CvMat* results) const
sample: 须要预测的输入样本;samples: 须要预测的输入样本们,多个;
returnDFVal: 指定返回值类型。若值是true,则是一个2类分类问题;
results: 响应的样本输出猜测的响应;分类中返回的是标签类别号;

来看一下OPENCV文档的例子:

 void TestSVM1()
{ int width = , height = ;
Mat image = Mat::zeros(height, width, CV_8UC3); // set up training data
float labels[] = { 1.0, 1.0, -1.0, -1.0 };
Mat labelsMat(, , CV_32FC1, labels); float trainingData[][] = { { , }, { , }, { , }, { , } };
Mat trainingDataMat(, , CV_32FC1, trainingData); // set up SVM's parameters
CvSVMParams params;
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, , 1e-); // train the svm
CvSVM SVM;
SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params); Vec3b green(, , ), blue(, , ); // show the decision region given by the SVM
for (int i = ; i < image.rows; ++i)
{
for (int j = ; j < image.cols; ++j)
{
Mat sampleMat = (Mat_<float>(, ) << i, j); // predict 函数使用训练好的SVM模型对一个输入的样本进行分类
float response = SVM.predict(sampleMat); if (response == )
{
// 注意这里是(j,i),不是(i,j)
image.at<Vec3b>(j, i) = green;
}
else
{
// 同上
image.at<Vec3b>(j, i) = blue;
}
}
} int thickness = -;
int lineType = ; circle(image, Point(, ), , Scalar(, , ), thickness, lineType);
circle(image, Point(, ), , Scalar(, , ), thickness, lineType);
circle(image, Point(, ), , Scalar(, , ), thickness, lineType);
circle(image, Point(, ), , Scalar(, , ), thickness, lineType); // show support vectors
thickness = ;
lineType = ; // 获得当前的支持向量的个数
int c = SVM.get_support_vector_count(); for (int i = ; i < c; ++i)
{
const float* v = SVM.get_support_vector(i);
circle(image, Point((int)v[], (int)v[]), , Scalar(, , ), thickness, lineType);
} //imwrite("result.png", image); // save the image imshow("SVM Simple Example", image); // show it to the user
waitKey();
return;
}

  看代码的label可以知道是一个二分类问题,输入为四个点,核函数也是线性核。

结果:

四个点每个类才两个点总觉得不够看啊,笔者增加了点数还是二分类,分界面看上去好多了。

  每个类6点,看上去分类更有规律了。

下次将介绍从文件训练模型,使用更复杂的SVM模型~~

OPENCV SVM介绍和自带例子的更多相关文章

  1. OpenCV支持向量机(SVM)介绍

    支持向量机(SVM)介绍 目标 本文档尝试解答如下问题: 如何使用OpenCV函数 CvSVM::train 训练一个SVM分类器, 以及用 CvSVM::predict 测试训练结果. 什么是支持向 ...

  2. opencv SVM多分类 人脸识别

    上一篇介绍了OPENCV中SVM的简单使用,以及自带的一个二分类问题. 例子中的标签是程序手动写的,输入也是手动加的二维坐标点. 对于复杂问题就必须使用数据集中的图片进行训练,标签使用TXT文件或程序 ...

  3. 数据挖掘入门系列教程(八点五)之SVM介绍以及从零开始推导公式

    目录 SVM介绍 线性分类 间隔 最大间隔分类器 拉格朗日乘子法(Lagrange multipliers) 拉格朗日乘子法推导 KKT条件(Karush-Kuhn-Tucker Conditions ...

  4. OpenCV框架介绍

    OpenCV框架介绍 概述 OpenCV是一个开放源代码的计算机视觉应用平台,由英特尔公司下属研发中心俄罗斯团队发起该项目,开源BSD证书,OpenCV的目标是实现实时计算机视觉,,是一个跨平台的计算 ...

  5. cocos2d-x入门学习笔记,主要介绍cocos2d-x的基本结构,并且介绍引擎自带的示例

    cocos2d-x 3.0 制作横版格斗游戏 http://philon.cn/post/cocos2d-x-3.0-zhi-zuo-heng-ban-ge-dou-you-xi http://blo ...

  6. 学习OpenCV——SVM

    学习OpenCV——SVM 学习SVM,首先通过http://zh.wikipedia.org/wiki/SVM, 再通过博客http://blog.csdn.net/yang_xian521/art ...

  7. IPC介绍——10个ipcs例子

    IPC介绍——10个ipcs例子 semaphorearrays2010performancesystemaccess ipcs是一个uinx/linux的命令.用于报告系统的消息队列.信号量.共享内 ...

  8. 083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法

    083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法 本文知识点:构造方法-带参构造方法 说明:因为时间紧张, ...

  9. MYSQL的锁介绍,以及死锁发生情况-带例子

    mysql锁能在并发情况下的mysql进行更好的优化 MySQL有三种锁的级别:页级.表级.行级,这3种锁的特性可大致归纳如下: 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高 ...

随机推荐

  1. 【Mysql】根据时间去除重复数据

    SELECT a.project_id,a.user_id,a.app_version,a.src_system,a.channel,a.thedate FROM rpt_innoreport_luc ...

  2. 05.基于IDEA+Spring+Maven搭建测试项目--web.xml配置

    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " ...

  3. 等价类计数(Polya定理/Burnside引理)学习笔记

    参考:刘汝佳<算法竞赛入门经典训练指南> 感觉是非常远古的东西了,几乎从来没有看到过需要用这个的题,还是学一发以防翻车. 置换:排列的一一映射.置换乘法相当于函数复合.满足结合律,不满足交 ...

  4. 百度搜索 “Java面试题” 前200页(面试必看)

    前言 本文中的题目来源于网上的一篇文章<百度搜索 "Java面试题" 前200页>,但该文章里面只有题目,没有答案.因此,我整理了一些答案发布于本文.本文整理答案的原则 ...

  5. hdu 1151 Air Raid 最小路径覆盖

    题意:一个城镇有n个路口,m条路.每条路单向,且路无环.现在派遣伞兵去巡逻所有路口,伞兵只能沿着路走,且每个伞兵经过的路口不重合.求最少派遣的伞兵数量. 建图之后的就转化成邮箱无环图的最小路径覆盖问题 ...

  6. 【Revit API】改变填充区域的填充样式

    话不多说,直接上代码 var target = pattern.Target; var name = pattern.Name; var fpElem = FillPatternElement.Get ...

  7. PyCharm远程开发配置及一些问题的解决方案

    PyCharm远程开发配置 具体请参考:https://www.jianshu.com/p/79df9ac88e96 Tips:必须要安装PyCharm专业版 实践过程中遇到的问题 背景 因项目需要, ...

  8. go gcc

    http://www.cnblogs.com/zkweb/p/7880099.html

  9. Windows 7 安装VS2008 SP1 失败

    由于Windows 7自带了.NET Framework 3.5 SP1, 所以在安装VS 2008 SP1的时候会发生fatal error during installation的错误, 网上找来 ...

  10. ssm框架中Controller层的junit测试_我改

    Controller测试和一般其他层的junit测试可以共用一个BaseTest 一.BaseTest如下: @RunWith(SpringJUnit4ClassRunner.class) @WebA ...