opencv笔记(12):支持向量机-SVM

来源:互联网 发布:stm8软件复位 编辑:程序博客网 时间:2024/05/23 15:24

支持向量机-SVM

支持向量机(Support Vector Machine,SVM)是一种对线性和非线性数据进行分类的方法,通过寻找最大边缘超平面将数据分类。

支持向量机比较其他传统机器学习算法的优点:
  • 小样本,SVM解决问题的时候,和样本的维度是无关的,只与落在超平面边缘的侧面的支持向量有关。
  • 结构风险最小,对问题真实模型的逼近与问题真实解之间的误差,就叫做风险,更严格的说,误差的累积叫做风险。
  • 非线性,是指SVM擅长应付样本数据线性不可分的情况,主要通过松弛变量(也有人叫惩罚变量)和核函数技术来实现。

1.核函数

核函数的种类有:
(1)线性核函数:CvSVM::LINEAR
(2)多项式核函数:CvSVM::POLY
(3)径向基(RBF)核函数(高斯核函数):CvSVM::RBF
(4)Sigmoid核函数(二层神经收集核函数):CvSVM::SIGMOID

CvSVMParams::CvSVMParams(int svm_type,  //SVM参数设置int kernel_type,  double degree,  double gamma,  double coef0,  double Cvalue,  double nu,  double p,  CvMat* class_weights,  CvTermCriteria term_crit  ) 
若是不传参数,默认以下初始化:
CvSVMParams::CvSVMParams() : svm_type(CvSVM::C_SVC),kernel_type(CvSVM::RBF),degree(0),  gamma(1),coef0(0),Cvalue(1),nu(0),p(0),class_weights(0)  {      term_crit = cvTermCriteria( CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 1000, FLT_EPSILON );  }  
参数1:SVM的类型,默认C类。
(1)CvSVM::C_SVC : C类支撑向量分类机。 n类分组 (n≥2),容许用异常值处罚因子C进行不完全分类。
(2)CvSVM::NU_SVC : 
类支撑向量分类机。n类似然不完全分类的分类器。参数为庖代C(其值在区间【0,1】中,nu越大,决定计划鸿沟越腻滑)。
(3)CvSVM::ONE_CLASS : 单分类器,所有的练习数据提取自同一个类里,然后SVM建树了一个分界线以分别该类在特点空间中所占区域和其它类在特点空间中所占区域。
(4)CvSVM::EPS_SVR : 
类支撑向量回归机。练习集中的特点向量和拟合出来的超平面的间隔须要小于p。异常值处罚因子C被采取。
(5)CvSVM::NU_SVR : 类支撑向量回归机。庖代了p。
参数2:核函数类型,默认RBF。
参数3:核函数(POLY)的参数degree。
参数4:核函数(POLY/ RBF/ SIGMOID)的参数
参数5:核函数(POLY/ SIGMOID)的参数coef0。
参数6:SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C。
参数7:SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数
参数8:SVM类型(EPS_SVR)的参数
参数9:C_SVC中的可选权重,赋给指定的类,乘以C今后变成 。所以这些权重影响不合类此外错误分类处罚项。权重越大,某一类此外误分类数据的处罚项就越大。
参数10:SVM的迭代练习过程的中断前提,解决项目组受束缚二次最优题目。您可以指定的公差和/或最大迭代次数。

#include <cv.h>  #include <highgui.h>  #include <ml.h>  #include <cxcore.h>    #include <iostream>  using namespace std;    int main()  {   // step 1:  //训练数据的分类标记,即4类   float labels[16] = {1.0, 1.0,1.0,1.0,2.0,2.0,2.0,2.0,3.0,3.0,3.0,3.0,4.0,4.0,4.0,4.0};   CvMat labelsMat = cvMat(16, 1, CV_32FC1, labels);   //训练数据矩阵   float trainingData[16][2] = { {0, 0}, {4, 1}, {4, 5}, {-1, 6},{3,11},{-2,10},{4,30},{0,25},{10,13},{15,12},{25,40},{11,35},{8,1},{9,6},{15,5},{20,-1} };   CvMat trainingDataMat = cvMat(16, 2, CV_32FC1, trainingData);     // step 2:   //训练参数设定   CvSVMParams params;   params.svm_type = CvSVM::C_SVC;                 //SVM类型   params.kernel_type = CvSVM::LINEAR;             //核函数的类型     //SVM训练过程的终止条件, max_iter:最大迭代次数  epsilon:结果的精确性   params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, FLT_EPSILON );     // step 3:   //启动训练过程   CvSVM SVM;   SVM.train( &trainingDataMat, &labelsMat, NULL,NULL, params);     // step 4:   //使用训练所得模型对新样本进行分类测试   for (int i=-5; i<15; i++)   {        for (int j=-5; j<15; j++)        {             float a[] = {i,j};             CvMat sampleMat;             cvInitMatHeader(&sampleMat,1,2,CV_32FC1,a);             cvmSet(&sampleMat,0,0,i);                                        // Set M(i,j)             cvmSet(&sampleMat,0,1,j);                                        // Set M(i,j)             float response = SVM.predict(&sampleMat);             cout<<response<<" ";        }        cout<<endl;   }     // step 5:   //获取支持向量   int c = SVM.get_support_vector_count();   cout<<endl;   for (int i=0; i<c; i++)   {        const float* v = SVM.get_support_vector(i);        cout<<*v<<" ";   }   cout<<endl;     system("pause");   return 0;  }  
原创粉丝点击