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)

 

二、分类

参考:如何使用libsvm进行分类

例子:

代码:

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-支持向量分类机。

(2)svmsvmpredict解析:
[predicted_label, accuracy/mse, decision_values]=svmpredict(test_label, test_matrix, model, ['libsvm_options']);
其中:
test _label      表示测试集的标签(这个值可以不知道,因为作预测的时候,本来就是想知道这个值的,这个时候,随便制定一个值就可以了,只是这个时候得到的accuracy就没有意义了)。
test _matrix    表示测试集的属性矩阵。
model            上面训练得到的模型。
libsvm_options 需要设置的一系列参数。
predicted_label 表示预测得到的标签。
accuracy/mse   是一个3*1的列向量,其中第1个数字用于分类问题,表示分类准确率;后两个数字用于回归问题,第2个数字表示mse;第三个数字表示平方相关系数(也就是说,如果分类的话,看第一个数字就可以了;回归的话,看后两个数字)。
decision_values   表示决策值(一般好像不怎么用)。

 

posted @ 2017-11-18 18:11  ->大胖子  阅读(14218)  评论(1编辑  收藏  举报