一、回歸
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-支持向量分類機。
(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 表示決策值(一般好像不怎么用)。