matlab libsvm工具箱,svm回归与分类
一、回归
1、例子:拟合曲线:
代码:
close all;
clear;
clc;
%
% 生成待回归的数据
clear;
X=-4*pi:0.05:4*pi;
%X=1:100;
Y=[];
P=length(X);
for i=1:P
%Y(i)=1/X(i)^0.5;
%Y(i)=sin(X(i));
%Y(i)=(sin(X(i))/X(i))^2;
Y(i)=exp(-X(i)^2)*sin(X(i)^2);
end
scatter(X\',Y\',10,\'b\');
hold on;
model = svmtrain(Y\',X\',\'-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01\');
% 利用建立的模型看其在训练集合上的回归效果
[py,accuracy,decision_values] = svmpredict(Y\',X\',model);
plot(X\',py,\'r\');
结果:
这里用了libsvm工具箱,函数model = svmtrain(Y\’,X\’,\’-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01\’) 与 [py,accuracy,decision_values] = svmpredict(Y\’,X\’,model);
-s 3 表示回归
参考了:http://www.matlabsky.com/thread-12390-1-1.html,注意这里输入参数的形式。
2、svmtrain中输入参数:
-s svm类型:SVM设置类型(默认0)
- 0 — C-SVC:C-支持向量分类机;参数C为惩罚系数,C越大表示对错误分类的惩罚越大,适当的参数C对分类Accuracy很关键。
- 1 –v-SVC:v-支持向量分类机;由于C的选取比较困难,用另一个参数v代替C。C是“无意义”的,v是有意义的。(与C_SVC其实采用的模型相同,但是它们的参数C的范围不同,C_SVC采用的是0到正无穷,该类型是[0,1]。)
- 2 – 一类SVM:单类别-支持向量机,不需要类标号,用于支持向量的密度估计和聚类。
- 3 — e -SVR:ε-支持向量回归机,不敏感损失函数,对样本点来说,存在着一个不为目标函数提供任何损失值的区域。
- 4 — v-SVR:n-支持向量回归机,由于EPSILON_SVR需要事先确定参数,然而在某些情况下选择合适的参数却不是一件容易的事情。而NU_SVR能够自动计算参数。
-t 核函数类型:核函数设置类型(默认2)
0 – 线性:u\’v
1 – 多项式:(r*u\’v + coef0)^degree
2 – RBF函数:exp(-r|u-v|^2)
3 –sigmoid:tanh(r*u\’v + coef0)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
-p p:设置e -SVR 中损失函数p的值(默认0.1)
二、分类
例子:
代码:
clear;
XA=ones(1,500);
YA=ones(1,500); %初始化A类的输入数据
XB=ones(1,500);
YB=ones(1,500); %初始化B类的输入数据
for i=1:500
XA(i)=cos(2*pi*(i+8)/25-0.25*pi)*(i+8)/25;
YA(i)=sin(2*pi*(i+8)/25-0.25*pi)*(i+8)/25-0.25;
XB(i)=sin(2*pi*(i+8)/25+0.25*pi)*(i+8)/-25;
YB(i)=cos(2*pi*(i+8)/25+0.25*pi)*(i+8)/25-0.25;
end
scatter(XA,YA,20,\'b\');
hold on;
scatter(XB,YB,20,\'k\');
hold off;
X1=cat(1,XA,YA);
X2=cat(1,XB,YB);
X=cat(2,X1,X2); %得到训练数据集X,Y
Y=zeros(1,1000);
Y(1,1:500)=1;
k=rand(1,1000);
[m,n]=sort(k); %对k按照升序排列
X=X(:,n(1:1000));%目的:打乱数据集的顺序
Y=Y(:,n(1:1000));
model = svmtrain(Y\',X\',\'-s 0 -t 2 -c 1.2 -g 2.8\');
[py,accuracy,decision_values] = svmpredict(Y\',X\',model);
fprintf(\'使用多项式核函数,正确率:%f%%\n\' ,100*sum(py==Y\')/size(Y\',1));
-s 0 表示分类 ;这里用的是 C-SVC:C-支持向量分类机。