SVM几种核函数的对比分析以及SVM算法的优缺点?
发布网友
发布时间:2022-05-03 10:08
我来回答
共2个回答
懂视网
时间:2022-05-07 02:09
【原文:http://blog.csdn.net/firefight/article/details/6400060】 为了学习OPENCV SVM分类器, 参考网上的 利用SVM解决2维空间向量的分类问题 实现并改为C代码,仅供参考 环境:OPENCV2.2 VS2008 步骤: 1,生成随机的点,并按一定的空间分布将其归类 2,
【原文:http://blog.csdn.net/firefight/article/details/6400060】
为了学习OPENCV SVM分类器, 参考网上的"利用SVM解决2维空间向量的分类问题"实现并改为C++代码,仅供参考
环境:OPENCV2.2 + VS2008
步骤:
1,生成随机的点,并按一定的空间分布将其归类
2,创建SVM并利用随机点样本进行训练
3,将整个空间按SVM分类结果进行划分,并显示支持向量
[cpp] view
plaincopy
-
#include "stdafx.h"
-
#include
-
-
void drawCross(Mat &img, Point center, Scalar color)
-
{
-
int col = center.x > 2 ? center.x : 2;
-
int row = center.y> 2 ? center.y : 2;
-
-
line(img, Point(col -2, row - 2), Point(col + 2, row + 2), color);
-
line(img, Point(col + 2, row - 2), Point(col - 2, row + 2), color);
-
}
-
-
int newSvmTest(int rows, int cols, int testCount)
-
{
-
if(testCount > rows * cols)
-
return 0;
-
-
Mat img = Mat::zeros(rows, cols, CV_8UC3);
-
Mat testPoint = Mat::zeros(rows, cols, CV_8UC1);
-
Mat data = Mat::zeros(testCount, 2, CV_32FC1);
-
Mat res = Mat::zeros(testCount, 1, CV_32SC1);
-
-
//Create random test points
-
for (int i= 0; i< testCount; i++)
-
{
-
int row = rand() % rows;
-
int col = rand() % cols;
-
-
if(testPoint.at(row, col) == 0)
-
{
-
testPoint.at(row, col) = 1;
-
data.at(i, 0) = float (col) / cols;
-
data.at(i, 1) = float (row) / rows;
-
}
-
else
-
{
-
i--;
-
continue;
-
}
-
-
if (row > ( 50 * cos(col * CV_PI/ 100) + 200) )
-
{
-
drawCross(img, Point(col, row), CV_RGB(255, 0, 0));
-
res.at(i, 0) = 1;
-
}
-
else
-
{
-
if (col > 200)
-
{
-
drawCross(img, Point(col, row), CV_RGB(0, 255, 0));
-
res.at(i, 0) = 2;
-
}
-
else
-
{
-
drawCross(img, Point(col, row), CV_RGB(0, 0, 255));
-
res.at(i, 0) = 3;
-
}
-
}
-
-
}
-
-
//Show test points
-
imshow("dst", img);
-
waitKey(0);
-
-
/////////////START SVM TRAINNING//////////////////
-
CvSVM svm = CvSVM();
-
CvSVMParams param;
-
CvTermCriteria criteria;
-
-
criteria= cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);
-
/* SVM种类:CvSVM::C_SVC
Kernel的种类:CvSVM::RBF
degree:10.0(此次不使用)
gamma:8.0
coef0:1.0(此次不使用)
C:10.0
nu:0.5(此次不使用)
p:0.1(此次不使用)
然后对训练数据正规化处理,并放在CvMat型的数组里。*/
-
param= CvSVMParams (CvSVM::C_SVC, CvSVM::RBF, 10.0, 8.0, 1.0, 10.0, 0.5, 0.1, NULL, criteria);
-
svm.train(data, res, Mat(), Mat(), param);
-
-
for (int i= 0; i< rows; i++)
-
{
-
for (int j= 0; j< cols; j++)
-
{
-
Mat m = Mat::zeros(1, 2, CV_32FC1);
-
m.at(0,0) = float (j) / cols;
-
m.at(0,1) = float (i) / rows;
-
-
float ret = 0.0;
-
ret = svm.predict(m);
-
Scalar rcolor;
-
-
switch ((int) ret)
-
{
-
case 1: rcolor= CV_RGB(100, 0, 0); break;
-
case 2: rcolor= CV_RGB(0, 100, 0); break;
-
case 3: rcolor= CV_RGB(0, 0, 100); break;
-
}
-
-
line(img, Point(j,i), Point(j,i), rcolor);
-
}
-
}
-
-
imshow("dst", img);
-
waitKey(0);
-
-
//Show support vectors
-
int sv_num= svm.get_support_vector_count();
-
for (int i= 0; i< sv_num; i++)
-
{
-
const float* support = svm.get_support_vector(i);
-
circle(img, Point((int) (support[0] * cols), (int) (support[1] * rows)), 5, CV_RGB(200, 200, 200));
-
}
-
-
imshow("dst", img);
-
waitKey(0);
-
-
return 0;
-
}
-
-
int main(int argc, char** argv)
-
{
-
return newSvmTest(400, 600, 100);
-
}
学习样本:
分类:
支持向量:
热心网友
时间:2022-05-06 23:17
SVM核函数的作用
SVM核函数是用来解决数据线性不可分而提出的,把数据从源空间映射到目标空间(线性可分空间)。
SVM中核函数的种类
1、线性核
优点:
方案首选,奥卡姆剃刀定律
简单,可以求解较快一个QP问题
可解释性强:可以轻易知道哪些feature是重要的
*:只能解决线性可分问题
2、多项式核
基本原理:依靠升维使得原本线性不可分的数据线性可分;
升维的意义:使得原本线性不可分的数据线性可分;
优点:
可解决非线性问题
可通过主观设置幂数来实现总结的预判
缺点:
对于大数量级的幂数,不太适用
比较多的参数要选择
通常只用在已经大概知道一个比较小的幂数的情况
请点击输入图片描述
3、高斯核
优点:
可以映射到无限维
决策边界更为多样
只有一个参数,相比多项式核容易选择
缺点:
可解释性差(无限*的转换,无法算w)
计算速度比较慢(解一个对偶问题)
容易过拟合(参数选不好时容易overfitting)
4、Sigmoid核
采用Sigmoid函数作为核函数时,支持向量机实现的就是一种多层感知器神经网络,应用SVM方法,隐含层节点数目(它确定神经网络的结构)、隐含层节点对输入节点的权值都是在设计(训练)的过程中自动确定的。而且支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部最小值,也保证了它对于未知样本的良好泛化能力而不会出现过学习现象。
在实战中更多的是:
特征维数高选择线性核
样本数量可观、特征少选择高斯核(非线性核)
样本数量非常多选择线性核(避免造成庞大的计算量)
SVM的优缺点
1、SVM算法对大规模训练样本难以实施
SVM的空间消耗主要是存储训练样本和核矩阵,由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。针对以上问题的主要改进有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的CSVM以及O.L.Mangasarian等的SOR算法。如果数据量很大,SVM的训练时间就会比较长,如垃圾邮件的分类检测,没有使用SVM分类器,而是使用了简单的naive bayes分类器,或者是使用逻辑回归模型分类。
2、用SVM解决多分类问题存在困难
经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器。
3、对缺失数据敏感,对参数和核函数的选择敏感
支持向量机性能的优劣主要取决于核函数的选取,所以对于一个实际问题而言,如何根据实际的数据模型选择合适的核函数从而构造SVM算法。目前比较成熟的核函数及其参数的选择都是人为的,根据经验来选取的,带有一定的随意性.在不同的问题领域,核函数应当具有不同的形式和参数,所以在选取时候应该将领域知识引入进来,但是目前还没有好的方法来解决核函数的选取问题。