依据机器学习算法如何学习数据可分为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. Java微信二次开发(一)

    准备用Java做一个微信二次开发项目,把流程写在这里吧. 第一天,做微信请求验证 需要导入库:servlet-api.jar 第一步:新建包com.wtz.service,新建类LoginServle ...

  2. pgm2

    MRF 笔记 我们先讨论引入 MRF 的必要性.经典的例子就是四个 r.v.s 连成一个正方形的结构的时候,我们没法通过 BN 获得给定对角线两个 r.v.s 而剩下的条件独立(不都是 d-sep), ...

  3. luogu1328 [NOIp2014]生活大爆炸版石头剪刀布 (模拟)

    #include<bits/stdc++.h> #define pa pair<int,int> #define CLR(a,x) memset(a,x,sizeof(a)) ...

  4. 结合NTLM中继和Kerberos委派攻击AD

    0x00 前言 在上个月我深入演讲了无约束委派之后,本文将讨论一种不同类型的Kerberos委派:基于资源的约束委派.本文的内容基于Elad Shamir的Kerberos研究,并结合我自己的NTLM ...

  5. 使用alien命令让deb包和rpm包互相转换

    OS version: CentOS7 / Debian9 发现alien这个命令时很惊喜,之前在debian上安装etcd找不到安装包感觉很不科学,有了alien命令事情一下就变简单了. 这里以et ...

  6. bug4 导入新工程时报 Target runtime com.genuitec.runtime.generic.jee60 is not defined

    系统加载工程后,报错Target runtime com.genuitec.runtime.generic.jee60 is not defined,在发布工程的同事电脑上正常.新导入的工程,出问题很 ...

  7. Python基础学习(二)

    前一段时间学习了Python数据类型,语句和函数,目前书写python的新特性,继续练手!!!! 一.切片 之前我们从python的list 或者 tuple中取得元素都是这样写,显然不够灵活 lis ...

  8. JXL读取,写入Excel

    JXL读取,写入Excel2003 相关阅读:poi 读写excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmlpoi 读写excel200 ...

  9. PDF截取矢量图

    PDF截取矢量图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 方法与步骤 下载并安装 Adobe Acrobat X Pro 软件 点击右侧按钮(工具)-页面-裁剪-单击并选择区域-双击实 ...

  10. angularJs的各种服务和指令的使用场景

    $location服务,获取页面跳转带的参数 比如说页面是这样的  localhost:9102/admin/goods.html#?id=123   如何获取这个id=123的值呢?????(注意: ...