如何利用svm对苹果恶意病毒应用权限进行分类

《量化投资:以MATLAB为工具》连载(14)基于MATLAB的支持向量机(SVM)在量化投资中的应用 - 推酷
《量化投资:以MATLAB为工具》连载(14)基于MATLAB的支持向量机(SVM)在量化投资中的应用
《量化投资:以MATLAB为工具》连载(14)基于MATLAB的支持向量机(SVM)在量化投资中的应用
《量化投资:以MATLAB为工具》简介
《量化投资:以 MATLAB 为工具》是由电子工业出版社( PHEI )下属旗舰级子公司——北京博文视点资讯有限公司出版的《量化投资与对冲基金丛书》之一,丛书主编为丁鹏博士,《量化投资:以 MATLAB 为工具》由李洋( faruto )、郑志勇( ArisZheng )编著,主要介绍 MATLAB 在量化投资中的具体应用。该书预计 2014 年 10 月上市,欢迎大家多多支持。在书籍上市之前,会在中国量化投资学会的各种网络平台进行系列连载介绍,方便读者提前一窥书籍概要。
《量化投资:以 MATLAB
为工具》连载 (14)
基于 MATLAB
的支持向量机( SVM
)在量化投资中的应用
支持向量机
(Support Vector Machine , SVM) ,
由 Vapnik 首先提出
像多层感知器网络和径向基函数网络一样
支持向量机可用于模式分类和非线性回归 。 支持向量机的主要思想是建立一个分类超平面作为决策曲面
使得正例和反例之间的隔离边缘被最大化
支持向量机的理论基础是统计学习理论
更精确的说
支持向量机是结构风险最小化的近似实现 。 这个原理基于这样的事实
: 学习机器在测试数据上的误差率 ( 即泛化误差率 ) 以训练误差率和一个依赖于 VC 维数 (Vapnik-Chervonenkis dimension) 的项的和为界
在可分模式情况下
支持向量机对于前一项的值为零
并且使第二项最小化 。 因此
尽管它不利用问题的领域内部问题
但在模式分类问题上支持向量机能提供好的泛化性能
这个属性是支持向量机特有的 。
支持向量机具有以下的优点 :
(1) 通用性 ( 能够在很广的各种函数集中构造函数 ) ;
(2) 鲁棒性 ( 不需要微调 ) ;
(3) 有效性 ( 在解决实际问题中总是属于最好的方法之一 ) ;
(4) 计算简单 ( 方法的实现只需要利用简单的优化技术 ) ;
(5) 理论上完善 ( 基于 VC 推广性理论的框架 ) 。
在 & 支持向量
和输入空间抽取的向量
之间的内积核这一个概念是构造支持向量机学习算法的关键。支持向量机是由算法从训练数据中抽取的小的子集构成。
支持向量机的体系结构如下图所示。
图 10- 1 :支持向量机的体系结构
其中 K 为核函数
其种类主要有 :
线性核函数
多项式核函数
径向基核函数
两层感知器核函数
LIBSVM 工具箱介绍
LIBSVM 是台湾大学林智仁 (Lin Chih-Jen) 教授等开发设计的一个简单、易于使用和快速有效的 SVM 模式识别与回归的软件包
不但提供了编译好的可在 Windows 系列系统的执行文件
还提供了源代码
方便改进、修改以及在其它操作系统上应用;该软件还有一个特点
就是对 SVM 所涉及的参数调节相对比较少
提供了很多的默认参数
利用这些默认参数就可以解决很多问题;并且提供了交互检验 (Cross Validation) 的功能。该软件包可以在
http://www . csie . ntu . edu . tw/~cjlin/
免费获得。该软件可以解决
C-SVC(C-support vector classification) , nu-SVC(nu-support vector classification) , one-class SVM(distribution estimation) , epsilon-SVR(epsilon-support vector regression) , nu-SVR(nu-support vector regression)
包括基于一对一算法的多类模式识别问题 。
SVM 用于模式识别或回归时
SVM 方法及其参数、核函数及其参数的选择
目前国际上还没有形成一个统一的模式
也就是说最优 SVM
算法参数选择还只能是凭借经验、实验对比、大范围的搜寻或者利用软件包提供的交互检验功能进行寻优 。
目前, LIBSVM 拥有 Java 、 Matlab 、 C# 、 Ruby 、 Python 、 R 、 Perl 、 Common LISP 、 Labview 等数十种语言版本。最常使用的是 Matlab 、 Java 和命令行的版本。截止到 2014 年 6 月 1 日, LIBSVM 的最新版本为 3.18 ( 2014 年 4 月 1 日更新),可在
LIBSVM 工具箱主要函数:
model = svmtrain(train_label, train_data, options);
-train_data 训练集属性矩阵,大小 n*m , n 表示样本数, m 表示属性数目(维数),数据类型 double 。
-train_label 训练集标签,大小 n*1 , n 表示样本数,数据类型 double 。
-options 参数选项,比如 '-c 1 – g 0.1' 。
训练得到的模型,是一个结构体。
-v 参数时,返回的 model 不再是一个结构体,分类问题返回的是交叉验证下的平均分类准确率;回归问题返回的是交叉检验下的平均均方根误差( MSE )。
[predict_label, accuracy/mse, dec_value] = svmpredict(test_label, test_data, model);
-test_data 测试集属性矩阵,大小 N*m , N 表示测试集样本数, m 表示属性数目(维数),数据类型 double 。
-test_label 测试集标签,大小 N*1 , N 表示样本数,数据类型 double
如果没有测试集标签,可以用任意的
N*1 的列向量代替即可,此时的输出 accuracy/mse ,就没有参考价值。
-model svmtrain 训练得到的模型。
-predict_label 预测的测试集的标签,大小 N*1 , N 表示样本数,数据类型 double 。
-accuracy/mse 一个 3*1 的列向量,第一个数表示分类准确率(分类问题使用),第二个数表示 mse
(回归问题使用),第三个数表示平方相关系数(回归问题使用)。
如果测试集的真实标签事先无法得知,此返回值没有参考意义。
-dec_value 决策值。
更多内容参见《量化投资:以 MATLAB
为工具》。
该书预计 2014 年 10 月上市。
书籍交流论坛: MATLAB 技术论坛读书频道《量化投资:以 MATLAB 为工具》专版,地址:
李洋( faruto ),中国量化投资学会专家委员会成员, MATLAB 技术论坛(
)联合创始人,北京师范大学应用数学硕士,先后就职于私募、期货公司、保险公司,从事量化投资相关工作。十年 MATLAB 编程经验,对机器学习、量化投资等相关领域有深入研究,已出版《 MATLAB 神经网络 30 个案例分析》和《 MATLAB 神经网络 43 个案例分析》等书籍。
微博: /faruto
郑志勇( Ariszheng ),中国量化投资学会专家委员会成员,方正富邦基金产品总监,北京理工大学运筹学与控制论硕士,先后就职于中国银河证券、银华基金、方正富邦基金,从事金融产品研究与设计工作。十余年 MATLAB 编程经验,专注于产品设计、量化投资等相关领域的研究,尤其对于各种结构化产品、分级基金产品有着深入的研究,已出版《运筹学与最优化 MATLAB 编程》和《金融数量分析:基于 MATLAB 编程》等书籍。
微博: /ariszheng
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见SVM:从理论到OpenCV实践 - 推酷
SVM:从理论到OpenCV实践
(转载请注明出处:
&未经允许请勿用于商业用途)
参考网友的博客:
1、SVM是一个分类器(Classifier)&,也可以做回归 (Regression) 。
SVM的主要思想可以概括为两点
(1)它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而 使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能;
(2)它基于结构风险最小化理论之上在特征空间中建构最优分割超平面,使得学习器得到全局最优化,并且在整个样本空间的期望风险以某个概率满足一定上界。
最优超平面
:使得每一类数据与超平面距离最近的向量与超平面之间的距离最大的这样的平面。
:那些在间隔区边缘的训练样本点。
:SVM的关键在于核函数。简单说就是将低维空间线性不可分的样本转化为高维空间线性可分的。低维空间向量集通常难于划分,解决的方法是将它们映射到高维空间。但这个办法带来的困难就是计算复杂度的增加,而核函数正好巧妙地解决了这个问题。也就是说,只要选用适当的核函数,就可以得到高维空间的分类函数。在SVM理论中,采用不同的核函数将导致不同的SVM算法。在确定了核函数之后,由于确定核函数的已知数据也存在一定的误差,考虑到推广性问题,因此引入了
两个参变量来加以校正。在确定了核函数基础上,再经过大量对比实验等将这两个系数取定,该项研究就基本完成,适合相关学科或业务内应用,且有一定能力的推广性。当然误差是绝对的,不同学科、不同专业的要求不一。
常用的核函数有以下4种:
线性核函数
多项式核函数
径向基(RBF)核函数(高斯核函数)
核函数(二层神经网络核函数)
径向基(RBF)核函数(高斯核函数)&的说明
& & 这个核函数可以将原始空间映射到无穷维空间。对于参数
,如果选的很大,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数
,高斯核实际上具有相当高的灵活性,也是
使用最广泛的核函数
径向基(RBF)核函数的参数选取
& & 径向基(
)核函数主要确定
控制着使间隔
最大且错误率最小的折中,就是在确定的特征空间中调节学习机器的置信范围和经验风险的比例;而
核函数参数,主要影响样本数据在高维特征空间中分布的复杂程度。因此分类器的好坏取决于参数
的确定。参数选择的好坏直接影响到分类器性能的好坏,但这方面目前缺乏理论指导,没有合适的方法,传统的参数选取都是通过反复的试验,人工选取令人满意的解。这种方法需要人的经验指导,并且需要付出较高的时间代价。常用的参数选择方法有:
I、网格法【OpenCV中SVM用到】
的组合状态,每种组合状态对应一种
分类器,通过测试对比,找出推广识别率最高的
组合。一般取
取值分别为
取值分别为
组合。网格法实质上是一种穷举法,随着排列组合的可能情况越多,其运算量将急剧增加。
II、双线性法
的性能,首先对线性
求解最佳参数,使之为参数的线性
推广识别率最高,称为
;然后固定
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
,根据对其推广识别率的估算,得到最优参数。虽然这种方法对
有非常明确的公式,但首先要求解
,而很难确定最优的
III、梯度下降搜索法
设泛化误差为
& & & & & & & & & & & & & & & & & & & & & & & & & & & & &&
是待定的核参数,基本过程为:
置一个初始值
用一个标准的
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
是足够小且最终收敛到零的数列。步骤
是一个标准的梯度下降算法。由分类函数公式可以求解
的求解较麻烦,需要通过求解一个二次规划问题得到。
IV、遗传算法
基本步骤为:
&&&&&& a t=0
随机选择初始种群
计算个体适应度函数值
若种群中最优个体所对应的适应度函数值足够大或者算法已经连续运行多代,且个体的最佳适应度无明显改进则转到第
&&&&&& e t=t+1
应用选择算子法从
进行交叉、变异操作,转到第
给出最佳的核函数参合和惩罚因子
,并用其训练数据集以获得全局最优分类面。
遗传算法的缺点是收敛很慢,容易受局部极小值干扰。
&5-3&验证核函数性能的方法(3种)(衡量泛化能力)
I、单一验证估计
& & 将大数量的样本分为两部分:训练样本和测试样本,此时测试集的错误率为:
为样本数,
为样本实际所属的类别,
为对训练样本预测出的类别。这种方法直观简单。可以通过理论证明,当样本数量趋近于无穷大时,该估计为无偏估计,但现实中处理的总是数量有限的样本问题,所以此方法的应用范围在一定程度上受到了限制。
折交叉验证【OpenCV中SVM用到】
折交叉验证是一种迭代方式,一共迭代
次,每次将所有训练样本分为
份相等的子集样本,训练样本是选择其中
份样本,测试样本是剩余的一个样本。通过
次迭代后,可以利用平均值来评估期望泛化误差,根据期望泛化误差选择一组性能最佳的参数。
折交叉验证由
折交叉验证误差决定,
折交叉验证误差是算法错误率的估计,其计算方式为:假设
为错分类的样本个数,经过
次迭代后,得到
,那么算法的错误率可以近似为错误分类数
和总样本点数
。该方法具有操作简单的优点,成为
目前应用最广泛
的方法,但是这种方法容易受样本划分方式的影响。
III、留一法
折交叉验证的特例,其基本思想是当可用样本数为
时,训练集由其中
个样本构成,测试样本为剩余的一个样本,经
次重复,使所有的样本都参加过测试。通过理论证明,这种估计是无偏估计。因此,从实现原理来说,留一法的效果是最佳的;但是,在参数固定的情况下,确定其错误率对样本要训练
次,运算量很大。为了解决留一法计算量大的缺陷,目前该方法确定核函数及其参数的常用方法是估计经验风险的上界,只要上界小,分类器的推广能力就强。
二、OpenCV中SVM的参数和函数说明
1、训练参数结构体&
该结构必须被初始化后,传给CvSVM
(2)构造函数的原型:
C++:&CvSVMParams::
CvSVMParams
C++:&CvSVMParams::
CvSVMParams
kernel_type
, & & & & & & & & &&
class_weights
CvTermCriteria&
A. 默认的构造函数初始化有以下值:&&
CvSVMParams::CvSVMParams() : svm_type(CvSVM::C_SVC), kernel_type(CvSVM::RBF), degree(0),
gamma(1), coef0(0), C(1), nu(0), p(0), class_weights(0)
term_crit = cvTermCriteria( CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 1000, FLT_EPSILON );
B. 构造函数的参数(一共10个):
指定SVM的类型(5种):
CvSVM::C_SVC :&
C类支持向量分类机。&n类分组&&(n&
&2),允许用异常值惩罚因子C进行不完全分类。
CvSVM::NU_SVC :&
类支持向量分类机。n类似然不完全分类的分类器。参数为&
&取代C(其值在区间【0,1】中,nu越大,决策边界越平滑)。
CvSVM::ONE_CLASS :&
单分类器,所有的训练数据提取自同一个类里,然后SVM建立了一个分界线以分割该类在特征空间中所占区域和其它类在特征空间中所占区域。
CvSVM::EPS_SVR :&
类支持向量回归机。训练集中的特征向量和拟合出来的超平面的距离需要小于p。异常值惩罚因子C被采用。
CvSVM::NU_SVR :&
类支持向量回归机。&
&代替了&p。&
kernel_type:
SVM的内核类型(4种):
CvSVM::LINEAR :&
线性内核,没有任何向映射至高维空间,线性区分(或回归)在原始特征空间中被完成,这是最快的选择。
& & & & & &&
CvSVM::POLY :&
多项式内核:
& & & & & & &
0" style="border:0" />
CvSVM::RBF :&
基于径向的函数,对于大多数情况都是一个较好的选择:
& & & & & & &
0" style="border:0" />
CvSVM::SIGMOID :&
Sigmoid函数内核:
& & & & & &&
内核函数(POLY)的参数degree。
内核函数(POLY/ RBF/ SIGMOID)的参数
内核函数(POLY/ SIGMOID)的参数coef0。
SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C。
SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数&
SVM类型(EPS_SVR)的参数&
class_weights:
C_SVC中的可选权重,赋给指定的类,乘以C以后变成&
。所以这些权重影响不同类别的错误分类惩罚项。权重越大,某一类别的误分类数据的惩罚项就越大。
term_crit:
SVM的迭代训练过程的中止条件,解决部分受约束二次最优问题。您可以指定的公差和/或最大迭代次数。
2、支持向量机
类(8个函数)
(1)构造函数
&1&构造函数的原型
C++:&CvSVM::
C++:&CvSVM::
(const Mat&&
const Mat&&
const Mat&&
varIdx=Mat()
const Mat&&
sampleIdx=Mat()
CvSVMParams&
params=CvSVMParams()
C++:&CvSVM::
(const CvMat*&
const CvMat*&
const CvMat*&
const CvMat*&
sampleIdx=0
CvSVMParams&
params=CvSVMParams()
&2&构造函数的参数注释(5个)
&训练数据,必须是CV_32FC1&(32位浮点类型,单通道)。数据必须是CV_ROW_SAMPLE的,即特征向量以行来存储。
&响应数据,通常是1D向量存储在CV_32SC1&(仅仅用在分类问题上)或者CV_32FC1格式。
&指定感兴趣的特征。可以是整数(32sC1)向量,例如以0为开始的索引,或者8位(8uC1)的使用的特征或者样本的掩码。用户也可以传入NULL指针,用来表示训练中使用所有变量/样本。
&指定感兴趣的样本。描述同上。
&SVM参数。
(2)训练函数
&1&作用:训练一个SVM
&2&训练函数的原型
C++:&bool&CvSVM::
(const Mat&&
const Mat&&
const Mat&&
varIdx=Mat()
const Mat&&
sampleIdx=Mat()
CvSVMParams&
params=CvSVMParams()
C++:&bool&CvSVM::
(const CvMat*&
const CvMat*&
const CvMat*&
const CvMat*&
sampleIdx=0
CvSVMParams&
params=CvSVMParams()&
&3&训练函数的参数注释(5个)
& & & & 和构造函数的参数是一样的,请参考构造函数的参数注释。
(3)自动训练函数
根据可选参数训练一个SVM。
&2&自动训练函数原型
C++:&bool&CvSVM::
train_auto
(const Mat
&&trainData
&&responses
&&sampleIdx
CvSVMParams&
CvParamGrid&
Cgrid=CvSVM::get_default_grid(CvSVM::C)
CvParamGrid&
gammaGrid=CvSVM::get_default_grid(CvSVM::GAMMA)
CvParamGrid&
pGrid=CvSVM::get_default_grid(CvSVM::P)
CvParamGrid&
nuGrid=CvSVM::get_default_grid(CvSVM::NU)
CvParamGrid&
coeffGrid=CvSVM::get_default_grid(CvSVM::COEF)
CvParamGrid&
degreeGrid=CvSVM::get_default_grid(CvSVM::DEGREE)
balanced=false
C++:&bool&CvSVM::
train_auto
(const CvMat
*&trainData
const CvMat
*&responses
const CvMat
const CvMat
*&sampleIdx
CvSVMParams&
CvParamGrid&
Cgrid=get_default_grid(CvSVM::C)
CvParamGrid&
gammaGrid=get_default_grid(CvSVM::GAMMA)
CvParamGrid&
pGrid=get_default_grid(CvSVM::P)
CvParamGrid&
nuGrid=get_default_grid(CvSVM::NU)
CvParamGrid&
coeffGrid=get_default_grid(CvSVM::COEF)
CvParamGrid&
degreeGrid=get_default_grid(CvSVM::DEGREE)
balanced=false
&3&自动训练函数的参数注释(13个)
前5个参数参考
构造函数的参数注释。
交叉验证参数。训练集被分成k_fold的自子集。其中一个子集是用来测试模型,其他子集则成为训练集。所以,SVM算法复杂度是执行k_fold的次数。
对应的SVM迭代网格参数。
balanced:&
如果是true则这是一个2类分类问题。这将会创建更多的平衡交叉验证子集。
&4&自动训练函数的使用说明
这个方法根据CvSVMParams中的最佳参数C,&gamma,&p,&nu,&coef0,&degree自动训练SVM模型。
参数被认为是最佳的交叉验证,其测试集预估错误最小。
如果没有需要优化的参数,相应的网格步骤应该被设置为小于或等于1的值。例如,为了避免gamma的优化,设置gamma_grid.step&=&0,gamma_grid.min_val,&gamma_grid.max_val&为任意数值。所以params.gamma&由gamma得出。
最后,如果参数优化是必需的,但是相应的网格却不确定,你可能需要调用函数CvSVM::get_default_grid(),创建一个网格。例如,对于gamma,调用CvSVM::get_default_grid(CvSVM::GAMMA)。
该函数为分类运行 (params.svm_type=CvSVM::C_SVC&或者&params.svm_type=CvSVM::NU_SVC) 和为回归运行 (params.svm_type=CvSVM::EPS_SVR&或者&params.svm_type=CvSVM::NU_SVR)效果一样好。如果params.svm_type=CvSVM::ONE_CLASS,没有优化,并指定执行一般的SVM。
&5&网格搜索法+K交叉验证
& & 上述使用说明是OpenCV使用文档中的,这里再加其他一些补充:
A、可参考文章《
》《LibSVM分类的实用指南》《
》,讲到了K交叉验证和网格搜索法。
B、优化参数的方式一般是用网格搜索法取值,然后对这组参数进行K交叉验证,计算精确值(交叉验证的准确率等于能够被正确分类的数量百分比),寻求最优参数。
(4)预测函数
:对输入样本做预测响应。&&
&2&预测函数的函数原型
(const Mat&&
returnDFVal=false
(const CvMat*&
returnDFVal=false
(const CvMat*&
&3&预测函数的参数注释
需要预测的输入样本。
需要预测的输入样本们。
returnDFVal:&
指定返回值类型。如果值是true,则是一个2类分类问题,该方法返回的决策函数值是边缘的符号距离。
相应的样本输出预测的响应。
&4&预测函数的使用说明
这个函数用来预测一个新样本的响应数据(response)。
在分类问题中,这个函数返回类别编号;在回归问题中,返回函数值。
输入的样本必须与传给trainData的训练样本同样大小。
如果训练中使用了varIdx参数,一定记住在predict函数中使用跟训练特征一致的特征。
后缀const是说预测不会影响模型的内部状态,所以这个函数可以很安全地从不同的线程调用。
(5)生成SVM网格参数的函数
: 生成一个SVM网格参数。&
&2&函数原型
CvParamGrid&
get_default_grid
&3&函数的参数注释
param_id:&
SVM参数的IDs必须是下列中的一个:(网格参数将根据这个ID生成&)
CvSVM::GAMMA
CvSVM::COEF
CvSVM::DEGREE
&4&函数的使用说明
该函数生成一个指定的SVM网格参数,主要用于传递给自动训练函数
CvSVM::train_auto()。
(6)获取当前SVM参数的函数
&1&作用:获取当前SVM参数
&2&函数原型:
CvSVMParams
get_params()
&3&函数的使用说明
& & & & 这个函数主要是在使用CvSVM::train_auto()时去获得最佳参数。
(7)获取支持向量及其数量的函数
:获取支持向量及其数量
&2&函数原型
get_support_vector_count
()&const &//获取支持向量的数量
C++:&const&
get_support_vector
)&const & &//获取支持向量
& & & & 参数:
&– 指定支持向量的索引。
(8)获取所用特征的数量的函数
:获取所用特征的数量
&2&函数原型:
get_var_count
三、OpenCV的简单的程序例子
& & 上述讲述了处理一个
线性可分情况
的例子,包含了SVM使用的几个步骤:
(1)准备训练样本及其类别标签(
trainingDataMat,labelsMat
(2)设置训练参数(CvSVMParams)
(3)对SVM进行训练(
(4)对新的输入样本进行预测(
(5)获取支持向量(
get_support_vector_count
get_support_vector&)
& & 上述讲述了处理一个
线性不可分情况
的例子,着重讲述了
C比较大时:分类错误率较小,但是间隔也较小。 在这种情形下, 错分类对模型函数产生较大的影响,既然优化的目的是为了最小化这个模型函数,那么错分类的情形必然会受到抑制。
C比较小时:间隔较大,但是分类错误率也较大。 在这种情形下,模型函数中错分类之和这一项对优化过程的影响变小,优化过程将更加关注于寻找到一个能产生较大间隔的超平面。
换而言之,C越大,优化时越关注错分问题;C越小,越关注能否产生一个较大间隔的超平面。
& & 由于样本非线性可分, 自然就有一些被错分类的样本。
3、多分类的简单例子
& & 上述讲述了一个三分类的例子,核函数用了RBF,并用到了其参数gamma,以及惩罚因子C,训练与预测和二分类一样,只要对样本赋予第三类的类别标签。
4、文字识别的简单例子
& & 训练与预测的使用方法和上述一样,主要看下对图像数据的处理(简单的特征提取)。
5、HOG+SVM的例子
& & 训练与预测的使用方法还是和上述一样,主要看下Hog特征的使用(
HOGDescriptor::compute
四、SVM处理流程总结:
1、收集数据
相关性分析
(比如p卡方检验),
(比如主成份分析PCA)。
2、归一化数据
:就是根据实际要求,将数据的取值范围转化为统一的区间如[a,b],a,b为整数。(参考
3、分训练集和测试集
:利用抽样技术将数据集分为训练集和测试集。抽样技术有分层抽样,简单抽样(等概率抽样)。
一般训练集数量大于测试集数量
,就是要保证足够的训练样例。
4、将数据转化为软件(接口)所支持的格式
5、选择核函数
,可以优先考虑RBF。
6、使用交叉验证(cross-validation)寻找最佳参数C和Υ:
对训练集利用交叉验证法选择最好的参数C和r(西格玛)(RBF核函数中的参数gama)。可以通过网格法寻找出最优的参数,注意一次交叉验证得到一个参数对所对应的模型精度,网格法目的就是找到使得模型精度达到对高的参数对(这里的参数对可能不止两个,有可能也有其他的),可以使用一些启发式的搜索来降低复杂度,虽然这个方法笨了点,但是它能得到很稳定的搜索结果。需要提到的这里在对训练集进行分割的时候涉及到抽样,一个较好的方法就是分层抽样。从这步可以看出其实 Cross-Validation是一种评估算法的方法。
&训练的目的得到参数和支持向量(存储在xml文件中),得到参数就能得到支持向量,带进算式计算SVM分类的准确度,以准确度最高的一组参数作为最终的结果,没有绝对线性可分的,都有一个误差,参数就是把那个误差降到最低。
这里的准确性是指将训练集的每个样本的向量与支持向量做运算,将运算结果与标记值比较,判断是否属于这个类,统计这个类的正确的样本数,最高的那一组参数准确性最高。
最终训练得到分类器。SVM只能分两类,所以这里的分类器是两个类组成一个分类器,如果有K类,就有k(k-1)/2个分类器。
7、使用最佳参数C和Υ来训练整个训练集:
用6中得到的参数对在整个训练集合上进行训练,从而得出模型。
利用测试集测试模型,得到精度。这个精度可以认为是模型最终的精度。当然有人会担心3步中抽样会有一定的误差,导致8得到的精度不一定是最好的,因此可以重复3-8得到多个模型的精度,然后选择最好的一个精度最为模型的精度(或者求所有精度的均值做为模型精度)。(需要多次选择训练集和测试集,然后每一次得到一个精度的模型,选择最好的一个精度作为模型,也就是我们项目里面要多次训练的原因)。
9. 识别分类:
两个类超平面的形成,意味着目标函数的形成,然后代入待识别样本,识别时对应的组代入对应的参数,得出结果进行投票,判定属于那个类。
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见}

我要回帖

更多关于 权限管理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信