如何使用libsvm進(jìn)行分類
這帖子就是初步教教剛接觸libsvm(svm)的同學(xué)如何利用libsvm進(jìn)行分類預(yù)測(cè),關(guān)于參數(shù)尋優(yōu)的問題在這里姑且不談,另有帖子詳述。
其實(shí)使用libsvm進(jìn)行分類很簡(jiǎn)單,只需要有屬性矩陣和標(biāo)簽,然后就可以建立分類模型(model),然后利用得到的這個(gè)model進(jìn)行分類預(yù)測(cè)了。
那神馬是屬性矩陣?神馬又是標(biāo)簽?zāi)兀课遗e一個(gè)直白的不能在直白的例子:
說一個(gè)班級(jí)里面有兩個(gè)男生(男生1、男生2),兩個(gè)女生(女生1、女生2),其中
男生1 身高:176cm 體重:70kg;
男生2 身高:180cm 體重:80kg;
女生1 身高:161cm 體重:45kg;
女生2 身高:163cm 體重:47kg;
如果我們將男生定義為1,女生定義為-1,并將上面的數(shù)據(jù)放入矩陣data中,即
- data = [176 70;
- 180 80;
- 161 45;
- 163 47];
- label = [1;1;-1;-1];
Remark:這里有一點(diǎn)廢話一些(因?yàn)槲铱吹讲恢挂粋€(gè)朋友問我這個(gè)相關(guān)的問題):
上面我們將男生定義為1,女生定義為-1,那定義成別的有影響嗎?
這個(gè)肯定沒有影響啊!(用腳趾頭都能想出來,我不知道為什么也會(huì)有人問),這里面的標(biāo)簽定義就是區(qū)分開男生和女生,怎么定義都可以的,只要定義成數(shù)值型的就可以。
比如我可將將男生定義為2,女生定義為5;后面的label相應(yīng)為label=[2;2;5;5];
比如我可將將男生定義為18,女生定義為22;后面的label相應(yīng)為label=[18;18;22;22];
為什么我說這個(gè)用腳趾頭都能想怎么定義都可以呢?學(xué)過數(shù)學(xué)的應(yīng)該都會(huì)明白,將男生定義為1,女生定義為-1和將男生定義為2,女生定義為5本質(zhì)是一樣的,應(yīng)為可以找到一個(gè)映射將(2,5)轉(zhuǎn)換成(1,-1),so所以本質(zhì)都是一樣的,后面的18、22本質(zhì)也是一樣的。
這里要多說一些,如果你原本的數(shù)據(jù)集合的標(biāo)簽不是數(shù)值型的(比如a、b、c)那么你完全可以通過某種轉(zhuǎn)換映射將不是數(shù)值型的標(biāo)簽轉(zhuǎn)換成數(shù)值型的。
現(xiàn)在回歸正題,有了上面的屬性矩陣data,和標(biāo)簽label就可以利用libsvm建立分類模型了,簡(jiǎn)要代碼如下:
- model =svmtrain(label,data);
身高190cm,體重85kg
我們想通過上面這些信息就給出其標(biāo)簽(想知道其是男【1】還是女【-1】)
比如 令 testdata = [190 85];由于其標(biāo)簽我們不知道,我們假設(shè)其標(biāo)簽為-1(也可以假設(shè)為1)
Remark:這里又有一點(diǎn)廢話一些(因?yàn)槲铱吹讲恢挂粋€(gè)朋友問我這個(gè)相關(guān)的問題):
如果測(cè)試集合的標(biāo)簽沒有怎么辦?測(cè)試集合的標(biāo)簽就應(yīng)該沒有,否則測(cè)試集合的標(biāo)簽都有了,還預(yù)測(cè)你妹?。??沒有是正確的,就像上面一樣,新來的學(xué)生其標(biāo)簽咱不應(yīng)知道,就想通過其屬性矩陣來預(yù)測(cè)其標(biāo)簽,這才是預(yù)測(cè)分類的真正目的。
之所以平時(shí)做測(cè)試時(shí),測(cè)試集合的標(biāo)簽一般都有,那是因?yàn)橐话闳藗兿胍纯醋约旱姆诸惼鞯男Ч绾?,效果的評(píng)價(jià)指標(biāo)之一就是分類預(yù)測(cè)的準(zhǔn)確率,這就需要有測(cè)試集的本來的真實(shí)的標(biāo)簽來進(jìn)行分類預(yù)測(cè)準(zhǔn)確率的計(jì)算。
話歸正傳,即
testdatalabel = -1;
然后利用libsvm來預(yù)測(cè)這個(gè)新來的學(xué)生是男生還是女生,代碼如下:
- [predictlabel,accuracy] =svmpredict(testdatalabel,testdata,model)
- data = [176 70;
- 180 80;
- 161 45;
- 163 47];
- label =[1;1;-1;-1];
- model =svmtrain(label,data);
- testdata = [19085];
- testdatalabel =-1;
- [predictlabel,accuracy] =svmpredict(testdatalabel,testdata,model);
- predictlabel
- Accuracy = 0% (0/1)(classification)
- predictlabel =
- 1
好,通過上面的講解,不知道諸位看官對(duì)于利用libsvm進(jìn)行分類是否有了一定了解【誰要是這么通俗的例子還搞不清楚怎么使用libsvm進(jìn)行分類,那我真無語啦】,下面使用libsvm工具箱本身帶的測(cè)試數(shù)據(jù)heart_scale來實(shí)際進(jìn)行一下測(cè)試:
- %%HowToClassifyUsingLibsvm
- % by faruto @ faruto'sStudio~
- %http://blog.sina.com.cn/faruto
- %Email:faruto@163.com
- %http://www.matlabsky.com
- %http://www.mfun.la
- %http://video.ourmatlab.com
- % last modified by2010.12.27
- %% a litte cleanwork
- tic;
- close all;
- clear;
- clc;
- format compact;
- %%
- % 首先載入數(shù)據(jù)
- load heart_scale;
- data =heart_scale_inst;
- label =heart_scale_label;
- %選取前200個(gè)數(shù)據(jù)作為訓(xùn)練集合,后70個(gè)數(shù)據(jù)作為測(cè)試集合
- ind = 200;
- traindata =data(1:ind,:);
- trainlabel =label(1:ind,:);
- testdata =data(ind+1:end,:);
- testlabel =label(ind+1:end,:);
- % 利用訓(xùn)練集合建立分類模型
- model =svmtrain(trainlabel,traindata,'-s 0 -t 2 -c 1.2 -g 2.8');
- % 分類模型model解密
- model
- Parameters =model.Parameters
- Label =model.Label
- nr_class =model.nr_class
- totalSV =model.totalSV
- nSV =model.nSV
- %利用建立的模型看其在訓(xùn)練集合上的分類效果
- [ptrain,acctrain] =svmpredict(trainlabel,traindata,model);
- % 預(yù)測(cè)測(cè)試集合標(biāo)簽
- [ptest,acctest] =svmpredict(testlabel,testdata,model);
- %%
- toc;
- model=
- Parameters: [5x1 double]
- nr_class:2
- totalSV:197
- rho:0.0583
- Label: [2x1double]
- ProbA:[]
- ProbB:[]
- nSV: [2x1double]
- sv_coef:[197x1 double]
- SVs: [197x13double]
- Parameters =
- 0
- 2.0000
- 3.0000
- 2.8000
- 0
- Label =
- 1
- -1
- nr_class =
- 2
- totalSV =
- 197
- nSV =
- 89
- 108
- Accuracy = 99.5% (199/200)(classification)
- Accuracy = 68.5714% (48/70)(classification)
- Elapsed time is 0.040873seconds.
- >>
只是說一下參數(shù)輸入的意義:
-s svm類型:SVM設(shè)置類型(默認(rèn)0)
0 -- C-SVC
1 --v-SVC
2 – 一類SVM
3 -- e -SVR
4 -- v-SVR
-t 核函數(shù)類型:核函數(shù)設(shè)置類型(默認(rèn)2)
0 – 線性:u'v
1 – 多項(xiàng)式:(r*u'v + coef0)^degree
2 – RBF函數(shù):exp(-r|u-v|^2)
3 –sigmoid:tanh(r*u'v + coef0)
-g r(gama):核函數(shù)中的gamma函數(shù)設(shè)置(針對(duì)多項(xiàng)式/rbf/sigmoid核函數(shù))
-c cost:設(shè)置C-SVC,e -SVR和v-SVR的參數(shù)(損失函數(shù))(默認(rèn)1)
更多關(guān)于libsvm 參數(shù)的說明請(qǐng)看
libsvm 參數(shù)說明【中英文雙語版本】
http://www.matlabsky.com/thread-12380-1-1.html
還有關(guān)于建立的分類模型model
- model=
- Parameters: [5x1 double]
- nr_class:2
- totalSV:197
- rho:0.0583
- Label: [2x1double]
- ProbA:[]
- ProbB:[]
- nSV: [2x1double]
- sv_coef:[197x1 double]
- SVs: [197x13double]
分類模型model解密詳解中說明
利用libsvm-mat建立分類模型model參數(shù)解密【by faruto】
http://www.matlabsky.com/thread-12649-1-1.html
所以也希望諸位看官尤其是對(duì)svm感興趣的朋友多多關(guān)注我。O(∩_∩)O~
如果對(duì)于標(biāo)簽設(shè)置問題您還沒有搞懂可以再看看這個(gè):
【轉(zhuǎn)】Matlab中使用libsvm進(jìn)行分類預(yù)測(cè)時(shí)的標(biāo)簽問題再次說明
http://www.matlabsky.com/thread-12396-1-1.html
更多關(guān)于SVM的東西請(qǐng)看:
關(guān)于SVM的那點(diǎn)破事[長(zhǎng)期更新整理 by faruto]
http://www.matlabsky.com/thread-10966-1-1.html
愛華網(wǎng)



