目录
支持向量机SVM的详细原理
SVM的定义
SVM理论
Libsvm工具箱详解
简介
参数说明
易错及常见问题
SVM应用实例,基于SVM的分类预测
代码
结果分析
展望
摘要
基于SVM的分类预测,SVM原理,SVM工具箱详解,SVM常见改进方法
支持向量机SVM的详细原理
SVM的定义
支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。
(1)支持向量机(Support Vector Machine, SVM)是一种对数据进行二分类的广义线性分类器,其分类边界是对学习样本求解的最大间隔超平面。
(2)SVM使用铰链损失函数计算经验风险并在求解系统中加入了正则化项以优化结构风险,是一个具有稀疏性和稳健性的分类器 。
(3)SVM可以通过引入核函数进行非线性分类。
SVM理论
1,线性可分性
2,损失函数
3,核函数
Libsvm工具箱详解
简介
LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
主要参数说明
Options:可用的选项即表示的涵义如下
-s svm类型:SVM设置类型(默认0)
0 – C-SVC
1 --v-SVC
2 – 一类SVM
3 – e -SVR
4 – v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 – 线性:u’v
1 – 多项式:(ru’v + coef0)^degree
2 – RBF函数:exp(-r|u-v|^2)
3 –sigmoid:tanh(ru’v + coef0)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
-p p:设置e -SVR 中损失函数p的值(默认0.1)
-m cachesize:设置cache内存大小,以MB为单位(默认40)
-e eps:设置允许的终止判据(默认0.001)
-h shrinking:是否使用启发式,0或1(默认1)
-wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1)
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
其中-g选项中的k是指输入数据中的属性数。option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差。以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
具体对应解释如下:
svm类别
指定SVM的类型,下面是可能的取值:
CvSVM::C_SVC C类支持向量分类机。 n类分组 (n \geq 2),允许用异常值惩罚因子C进行不完全分类。
CvSVM::NU_SVC \nu类支持向量分类机。n类似然不完全分类的分类器。参数为 \nu 取代C(其值在区间【0,1】中,nu越大,决策边界越平滑)。
CvSVM::ONE_CLASS 单分类器,所有的训练数据提取自同一个类里,然后SVM建立了一个分界线以分割该类在特征空间中所占区域和其它类在特征空间中所占区域。
CvSVM::EPS_SVR \epsilon类支持向量回归机。训练集中的特征向量和拟合出来的超平面的距离需要小于p。异常值惩罚因子C被采用。
CvSVM::NU_SVR \nu类支持向量回归机。 \nu 代替了 p。
kernel_type –
SVM的内核类型,下面是可能的取值:
CvSVM::LINEAR 线性内核。没有任何向映射至高维空间,线性区分(或回归)在原始特征空间中被完成,这是最快的选择。K(x_i, x_j) = x_i^T x_j.
CvSVM::POLY 多项式内核: K(x_i, x_j) = (\gamma x_i^T x_j + coef0)^{degree}, \gamma > 0.
CvSVM::RBF 基于径向的函数,对于大多数情况都是一个较好的选择: K(x_i, x_j) = e^{-\gamma ||x_i - x_j||^2}, \gamma > 0.
CvSVM::SIGMOID Sigmoid函数内核:K(x_i, x_j) = \tanh(\gamma x_i^T x_j + coef0).
degree – 内核函数(POLY)的参数degree。
gamma – 内核函数(POLY/ RBF/ SIGMOID)的参数\gamma。
coef0 – 内核函数(POLY/ SIGMOID)的参数coef0。
Cvalue – SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C。
nu – SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数 \nu。
p – SVM类型(EPS_SVR)的参数 \epsilon。
class_weights – C_SVC中的可选权重,赋给指定的类,乘以C以后变成 class_weights_i * C。所以这些权重影响不同类别的错误分类惩罚项。权重越大,某一类别的误分类数据的惩罚项就越大。
term_crit – SVM的迭代训练过程的中止条件,解决部分受约束二次最优问题。您可以指定的公差和/或最大迭代次数。
易错及调参注意事项
1,分类和回归容易搞错,分类-s参数为1,回归-s参数为1
2,bestc参数分类的时候调小,回归的时候调大。
3,安装libsvm参数的时候,工具箱自带的参数容易和matlab自带的冲突,要做好协调
SVM应用实例
数据
基于SVM的分类预测
部分代码
clc
clear
close all
format compact
%%
str1 = {‘真空系统不严密’,‘真空系统管道破裂’,‘供汽中断’,‘冷却管破裂’,‘凝结水泵故障’,‘低压加热管道破裂’,‘循环水泵故障’,‘循环水流量不足’,‘真空泵故障’,‘冷却管结垢’,‘冷却管堵塞’,‘凝水武器满水’};
%%
load maydata.mat
rand(‘seed’,0)
pan = 23;
y=1;
n = randperm(600);
m=500;
train_label1 = num(n(1:m),pan+y);
P_train= num(n(1:m),1:pan);
P_test= num(n(m+1:end),1:pan);
test_label1 = num(n(m+1:end),pan+y);
% 归一化
[p,ps]=mapminmax(P_train’,-1,1);
p_train=p’;
pt=mapminmax(‘apply’,P_test’,ps);
p_test=pt’;
%[outputn,outputps]=mapminmax(train_label’,1,length(str2));%训练数据的输出数据的归一化
[outputn,outputps]=mapminmax(train_label1’,-1,1);%训练数据的输出数据的归一化
train_label = outputn’;
p_testl =mapminmax(‘apply’,test_label1’,outputps);
test_label =p_testl’;
t=2;%t=0为线性核函数,1-多项式。2rbf核函数
%%
% train_label =[train_label ; test_label];
% p_train = [p_train ; p_test];
bestc=29;bestg=0.029;%1
cmd = [‘-s 3 -t ‘,num2str(t),’ -c ‘, num2str(bestc),’ -g ‘,num2str(bestg),’ -p 0.00001’];
model = svmtrain(train_label,p_train,cmd);
load maymodel.mat
[predict1,acc]= svmpredict(train_label,p_train,model);
predict1=mapminmax(‘reverse’,predict1’,outputps)';%
predict1 = round(predict1);
predict1(predict1<1)=1;
predict1(predict1>12)=12;
[train_label1,mx] = sort(train_label1);
predict1=predict1(mx);
figure;
hold on;
stem(predict1,‘o’);
plot(train_label1,‘r*’);
xlabel(‘训练集集样本’,‘FontSize’,12);
ylabel(‘类别标签’,‘FontSize’,12);
legend(‘实际输出’,‘期望输出’);
title(‘训练集分类结果’,‘FontSize’,12);
set(gca,‘YTick’,1:length(str1));
set(gca,‘YTickLabel’,str1)
grid on;
%% SVM网络预测
[predict_label,accuracy] = svmpredict(test_label,p_test,model);
predict_label=round(mapminmax(‘reverse’,predict_label’,outputps)');%
predict_label = round(predict_label);
predict_label(predict_label<1)=1;
predict_label(predict_label>12)=12;
[test_label1,mx1] = sort(test_label1);
predict_label=predict_label(mx1);
xunlian = sum(predict1train_label1)/length(train_label1)
ceshi = sum(predict_labeltest_label1)/length(test_label1)
效果图
结果分析
从效果图看,SVM能能通过训练测试,基于SVM的分类预测,比较准确,具有实际应用参考意义,相对于传统的二分类SVM,libsvm工具箱,不仅能实现多分类,还可以实现回归分析,大大扩展了SVM的应用范围,在很多方面,特别小样本难训练的问题的应用方
扩展
下面是部分SVM可以应用的方面,如果有需要欢迎扫描二维码联系