在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类、以及回归分析。


原理简介

SVM方法是通过一个非线性映射p,把样本空间映射到一个高维乃至无穷维的特征空间中(Hilbert空间),使得在原来的样本空间非线性可分的问题转化为在特征空间中的线性可分的问题.简单地说,就是升维和线性化.升维,就是把样本向高维空间做映射,一般情况下这会增加计算的复杂性,甚至会引起"维数灾难",因而人们很少问津.但是作为分类、回归等问题来说,很可能在低维样本空间无法线性处理的样本集,在高维特征空间中却可以通过一个线性超平面实现线性划分(或回归).一般的升维都会带来计算的复杂化,SVM方法巧妙地解决了这个难题:应用核函数的展开定理,就不需要知道非线性映射的显式表达式;由于是在高维特征空间中建立线性学习机,所以与线性模型相比,不但几乎不增加计算的复杂性,而且在某种程度上避免了"维数灾难".这一切要归功于核函数的展开和计算理论.

选择不同的核函数,可以生成不同的SVM,常用的核函数有以下4种:

⑴线性核函数K(x,y)=x·y;

⑵多项式核函数K(x,y)=[(x·y)+1]^d;

径向基函数K(x,y)=exp(-|x-y|^2/d^2)

⑷二层神经网络核函数K(x,y)=tanh(a(x·y)+b).

一般特征


⑴SVM学习问题可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值。而其他分类方法(如基于规则的分类器和人工神经网络)都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。

⑵SVM通过最大化决策边界的边缘来控制模型的能力。尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等。

⑶通过对数据中每个分类属性引入一个哑变量,SVM可以应用于分类数据

SVM一般只能用在二类问题,对于多类问题效果不好。

参考: 支持向量机通俗导论

Demo1:简单的数字分类
步骤:
1、建立训练数据集
	int labels[4] = {1, -1, -1, -1};              //创建标签
	Mat labelsMat(4, 1, CV_32SC1, labels);        //创建矩阵
        float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} };//训练数据集
	Mat trainingDataMat(4, 2, CV_32FC1, trainingData);


2、设置支持向量机的参数
        m1::SVM::Params params;
	params.svmType    = SVM::C_SVC;       //参数类型
	params.kernelType = SVM::LINEAR;      //核类型
	params.termCrit   = TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6);

3、训练支持向量机

        Ptr<SVM> svm = StatModel::train<SVM>(trainingDataMat, ROW_SAMPLE, labelsMat, params);

	Vec3b green(0,255,0), blue (255,0,0);

4、显示训练集数据
                int thickness = -1;
		int lineType = 8;
		circle( image, Point(501,  10), 5, Scalar(  0,   0,   0), thickness, lineType);
		circle( image, Point(255,  10), 5, Scalar(255, 255, 255), thickness, lineType);
		circle( image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType);
		circle( image, Point( 10, 501), 5, Scalar(255, 255, 255), thickness, lineType);

5、显示支持向量
                thickness = 2;
		lineType  = 8;
		Mat sv = svm->getSupportVectors();

		for (int i = 0; i < sv.rows; ++i)
		{
			const float* v = sv.ptr<float>(i);
			circle(	image,  Point( (int) v[0], (int) v[1]),   6,  Scalar(128, 128, 128), thickness, lineType);
		}



Demo2:VS2013+opencv2.4.10实现物体分类。

数据集有三类Corrdior、Office 、Toilet共760张640x480图片。

测试集:Corrdior-284、Office -102、Toilet-374

训练集:Corrdior-70、Office-47 、Toilet-63

源码:SVM物体分类


















Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐