【教程】利用libsvm-mat建立分类模型model参数解密【by faruto】
原文地址:http://www.matlabsky.com/thread-12649-1-1.html
建議大家看這篇帖子之前先看一下以下幾篇帖子:
如何使用libsvm進(jìn)行分類【by faruto】
http://www.matlabsky.com/forum-v … -fromuid-18677.html
libsvm 參數(shù)說(shuō)明【中英文雙語(yǔ)版本】
http://www.matlabsky.com/forum-v … -fromuid-18677.html
線性可分模式的最優(yōu)超平面的詳細(xì)推導(dǎo)過(guò)程【支持向量機(jī)相關(guān)】
http://www.matlabsky.com/forum-v … -fromuid-18677.html
更多關(guān)于SVM相關(guān)的東西可以看:
關(guān)于SVM的那點(diǎn)破事[長(zhǎng)期更新整理 by faruto]
http://www.matlabsky.com/forum-v … -fromuid-18677.html
=======================================================
本帖子主要就是講解利用libsvm-mat工具箱建立分類(回歸模型)后,得到的模型model里面參數(shù)的意義都是神馬?以及如果通過(guò)model得到相應(yīng)模型的表達(dá)式,這里主要以分類問(wèn)題為例子。
測(cè)試數(shù)據(jù)使用的是libsvm-mat自帶的heart_scale.mat數(shù)據(jù)(270*13的一個(gè)屬性據(jù)矩陣,共有270個(gè)樣本,每個(gè)樣本有13個(gè)屬性),方便大家自己測(cè)試學(xué)習(xí)。
首先上一個(gè)簡(jiǎn)短的測(cè)試代碼:
%% ModelDecryption
% by faruto @ faruto’s Studio~
% http://blog.sina.com.cn/faruto
% Email:faruto@163.com
% http://www.MATLABsky.com
% http://www.mfun.la
% http://video.ourmatlab.com
% last modified by 2011.01.06
%% a litte clean work
tic;
close all;
clear;
clc;
format compact;
%%
% 首先載入數(shù)據(jù)
load heart_scale;
data = heart_scale_inst;
label = heart_scale_label;
% 建立分類模型
model = svmtrain(label,data,’-s 0 -t 2 -c 1.2 -g 2.8’);
model
% 利用建立的模型看其在訓(xùn)練集合上的分類效果
[PredictLabel,accuracy] = svmpredict(label,data,model);
accuracy
%%
toc;
復(fù)制代碼
運(yùn)行結(jié)果:
model =
Parameters: [5x1 double]
nr_class: 2
totalSV: 259
rho: 0.0514
Label: [2x1 double]
ProbA: []
ProbB: []
nSV: [2x1 double]
sv_coef: [259x1 double]
SVs: [259x13 double]
Accuracy = 99.6296% (269/270) (classification)
accuracy =
99.6296
0.0148
0.9851
Elapsed time is 0.040155 seconds.
復(fù)制代碼
這里面為了簡(jiǎn)單起見(jiàn)沒(méi)有將測(cè)試數(shù)據(jù)進(jìn)行訓(xùn)練集和測(cè)試集的劃分,這里僅僅是為了簡(jiǎn)單明了而已,分類結(jié)果估計(jì)可以不要管,參數(shù)優(yōu)化也不要管,另有帖子講解。
下面我們就看看 model這個(gè)結(jié)構(gòu)體里面的各種參數(shù)的意義都是神馬,model如下:
model =
Parameters: [5x1 double]
nr_class: 2
totalSV: 259
rho: 0.0514
Label: [2x1 double]
ProbA: []
ProbB: []
nSV: [2x1 double]
sv_coef: [259x1 double]
SVs: [259x13 double]
model.Parameters
我們先來(lái)看一下model.Parameters里面承裝的都是什么:
model.Parameters
ans =
0
2.0000
3.0000
2.8000
0
復(fù)制代碼
重要知識(shí)點(diǎn):
model.Parameters參數(shù)意義從上到下依次為:
-s svm類型:SVM設(shè)置類型(默認(rèn)0)
-t 核函數(shù)類型:核函數(shù)設(shè)置類型(默認(rèn)2)
-d degree:核函數(shù)中的degree設(shè)置(針對(duì)多項(xiàng)式核函數(shù))(默認(rèn)3)
-g r(gama):核函數(shù)中的gamma函數(shù)設(shè)置(針對(duì)多項(xiàng)式/rbf/sigmoid核函數(shù)) (默認(rèn)類別數(shù)目的倒數(shù))
-r coef0:核函數(shù)中的coef0設(shè)置(針對(duì)多項(xiàng)式/sigmoid核函數(shù))((默認(rèn)0)
即在本例中通過(guò)model.Parameters我們可以得知 –s 參數(shù)為0;-t 參數(shù)為 2;-d 參數(shù)為3;-g 參數(shù)為2.8(這也是我們自己的輸入);-r 參數(shù)為0。
關(guān)于libsvm參數(shù)的一點(diǎn)小說(shuō)明:
Libsvm中參數(shù)設(shè)置可以按照SVM的類型和核函數(shù)所支持的參數(shù)進(jìn)行任意組合,如果設(shè)置的參數(shù)在函數(shù)或SVM類型中沒(méi)有也不會(huì)產(chǎn)生影響,程序不會(huì)接受該參數(shù);如果應(yīng)有的參數(shù)設(shè)置不正確,參數(shù)將采用默認(rèn)值。
model.Label model.nr_class
model.Label
ans =
1
-1
model.nr_class
ans =
2
復(fù)制代碼
重要知識(shí)點(diǎn):
model.Label表示數(shù)據(jù)集中類別的標(biāo)簽都有什么,這里是 1,-1;
model.nr_class表示數(shù)據(jù)集中有多少類別,這里是二分類。
model.totalSV model.nSV
model.totalSV
ans =
259
model.nSV
ans =
118
141
復(fù)制代碼
重要知識(shí)點(diǎn):
model.totalSV代表總共的支持向量的數(shù)目,這里共有259個(gè)支持向量;
model.nSV表示每類樣本的支持向量的數(shù)目,這里表示標(biāo)簽為1的樣本的支持向量有118個(gè),標(biāo)簽為-1的樣本的支持向量為141。
注意:這里model.nSV所代表的順序是和model.Label相對(duì)應(yīng)的。
model.ProbA model.ProbB
關(guān)于這兩個(gè)參數(shù)這里不做介紹,使用-b參數(shù)時(shí)才能用到,用于概率估計(jì)。
-b probability_estimates: whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
model.sv_coef model.SVs model.rho
sv_coef: [259x1 double]SVs: [259x13 double]model.rho = 0.0514復(fù)制代碼
重要知識(shí)點(diǎn):
model.sv_coef是一個(gè)259*1的矩陣,承裝的是259個(gè)支持向量在決策函數(shù)中的系數(shù);
model.SVs是一個(gè)259*13的稀疏矩陣,承裝的是259個(gè)支持向量。
model.rho是決策函數(shù)中的常數(shù)項(xiàng)的相反數(shù)(-b)
在這里首先我們看一下 通過(guò) –s 0 參數(shù)(C-SVC模型)得到的最終的分類決策函數(shù)的表達(dá)式是怎樣的?
這里如果有關(guān)于C-SVC模型不懂的地方,請(qǐng)看這個(gè)pdf文件:
libsvm_library.pdf
附件:
libsvm_library.pdf (316.82 KB, 下載次數(shù): 21547)
最終的決策函數(shù)為:
在由于我們使用的是RBF核函數(shù)(前面參數(shù)設(shè)置 –t 2),故這里的決策函數(shù)即為:
其中|| x-y ||是二范數(shù)距離 ;
這里面的
b就是-model.rho(一個(gè)標(biāo)量數(shù)字);
b = -model.rho;
n代表支持向量的個(gè)數(shù)即 n = model.totalSV(一個(gè)標(biāo)量數(shù)字);
對(duì)于每一個(gè)i:
wi =model.sv_coef(i); 支持向量的系數(shù)(一個(gè)標(biāo)量數(shù)字)
xi = model.SVs(i,:) 支持向量(1*13的行向量)
x 是待預(yù)測(cè)標(biāo)簽的樣本 (1*13的行向量)
gamma 就是 -g 參數(shù)
好的下面我們通過(guò)model提供的信息自己建立上面的決策函數(shù)如下:
%% DecisionFunction
function plabel = DecisionFunction(x,model)
gamma = model.Parameters(4);
RBF = @(u,v)( exp(-gamma.*sum( (u-v).^2) ) );
len = length(model.sv_coef);
y = 0;
for i = 1:len
u = model.SVs(i,:);
y = y + model.sv_coef(i)*RBF(u,x);
end
b = -model.rho;
y = y + b;
if y >= 0
plabel = 1;
else
plabel = -1;
end
復(fù)制代碼
有了這個(gè)決策函數(shù),我們就可以自己預(yù)測(cè)相應(yīng)樣本的標(biāo)簽了:
%%
plable = zeros(270,1);
for i = 1:270
x = data(i,:);
plabel(i,1) = DecisionFunction(x,model);
end
%% 驗(yàn)證自己通過(guò)決策函數(shù)預(yù)測(cè)的標(biāo)簽和svmpredict給出的標(biāo)簽相同
flag = sum(plabel == PredictLabel)
over = 1;
復(fù)制代碼
最終可以看到 flag = 270 ,即自己建立的決策函數(shù)是正確的,可以得到和svmpredict得到的一樣的樣本的預(yù)測(cè)標(biāo)簽,事實(shí)上svmpredict底層大體也就是這樣實(shí)現(xiàn)的。
最后我們來(lái)看一下,svmpredict得到的返回參數(shù)的意義都是什么
在下面這段代碼中 :
%%
% 首先載入數(shù)據(jù)
load heart_scale;
data = heart_scale_inst;
label = heart_scale_label;
% 建立分類模型
model = svmtrain(label,data,’-s 0 -t 2 -c 1.2 -g 2.8’);
model
% 利用建立的模型看其在訓(xùn)練集合上的分類效果
[PredictLabel,accuracy] = svmpredict(label,data,model);
accuracy
復(fù)制代碼
運(yùn)行可以看到
model =
Parameters: [5x1 double]
nr_class: 2
totalSV: 259
rho: 0.0514
Label: [2x1 double]
ProbA: []
ProbB: []
nSV: [2x1 double]
sv_coef: [259x1 double]
SVs: [259x13 double]
Accuracy = 99.6296% (269/270) (classification)
accuracy =
99.6296
0.0148
0.9851
復(fù)制代碼
這里面要說(shuō)一下返回參數(shù)accuracy的三個(gè)參數(shù)的意義。
重要的知識(shí)點(diǎn):
返回參數(shù)accuracy從上到下依次的意義分別是:
分類準(zhǔn)率(分類問(wèn)題中用到的參數(shù)指標(biāo))
平均平方誤差(MSE (mean squared error)) [回歸問(wèn)題中用到的參數(shù)指標(biāo)]
平方相關(guān)系數(shù)(r2 (squared correlation coefficient))[回歸問(wèn)題中用到的參數(shù)指標(biāo)]
其中mse 和r2的計(jì)算公式分別為:
插圖:
寫在后面的話,至此關(guān)于model中相應(yīng)參數(shù)的一些意義,以及到底如果得到?jīng)Q策函數(shù)的表達(dá)式或者計(jì)算方式的就算是說(shuō)的很明了了。
可能還有的同學(xué)會(huì)問(wèn),如何得到分類決策函數(shù)中的那個(gè)alpha系數(shù)【這個(gè)肯定會(huì)有人問(wèn)】,還是再磨嘰說(shuō)一下吧:
上面的wi其實(shí)是alpha和支持向量的類別標(biāo)簽(1或-1的乘積),原始決策函數(shù)的表達(dá)式如下:
插圖:
上面的yi是支持向量的類別標(biāo)簽(1或者-1),在libsvm中將yi和alpha的乘積放在一起用model.sv_coef(w)來(lái)承裝。
都說(shuō)到這份上,應(yīng)該能明白了嗎?
再說(shuō)點(diǎn)廢話:就是在關(guān)于SVM的學(xué)習(xí)中,我發(fā)現(xiàn)很多朋友都不主動(dòng)思考和嘗試,老是在問(wèn),這樣很不好,這樣很被動(dòng),上面這些也沒(méi)有人教我,都是我自己思考出來(lái),然后編程驗(yàn)證,如果出現(xiàn)不合理的地方就再繼續(xù)思考,反正道理和書籍里面都有講解,總能洞穿的啊。O(∩_∩)O?
Anyway,有關(guān)于SVM的問(wèn)題還是可以一起探討的,但您首先要獨(dú)立思考一下下才好,您說(shuō)是不是~
PS:預(yù)祝大家春節(jié)愉快
by faruto 2011.01.06
總結(jié)
以上是生活随笔為你收集整理的【教程】利用libsvm-mat建立分类模型model参数解密【by faruto】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习笔记9 Sparse codin
- 下一篇: L0,L1,L2范数