『壹』 matlab配置libsvm需要哪個版本的matlab了
我的libsvm 版本為目前最新的3.12版本,matlab版本為matlab R2011b,c/c++編譯器為vs2010。提到c/c++編譯器是因為matlab下安裝使用libsvm需要c/c++編譯器,具體matlab支持哪些版本的編譯器,可以到matlab官網上查詢。
安裝配置過程具體如下:
1、設置matlab搜索工作目錄:file->Set Path->Add With Subfolders,選擇的目錄為「..\libsvm-3.12」,選定後,點擊save,然後close即可。
2、設置matlab的當前工作目錄:設置Current Folder為「..\libsvm-3.12\matlab」。
3、選擇c/c++編譯器:Command Window裡面輸入mex -setup,當出現提示:Would you like mex to locate installed compilers [y]/n?時,選擇y,接下來就要選擇編譯器,我這里出現的選項有:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2011b\sys\lcc
[2] Microsoft Visual C++ 2010 in d:\Program Files\Microsoft Visual Studio 10.0
[3] Microsoft Visual C++ 2005 SP1 in E:\vs2005
[0] None
我選擇了2,出現提示語句:Are these correct [y]/n?,繼續y之後,如果編譯器選擇成功,會出現:
Trying to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2011b\mexopts.bat
From template: D:\PROGRA~1\MATLAB\R2011b\bin\win32\mexopts\msvc100opts.bat
Done . . .
3、編譯:輸入make命令,系統會生成如下4個文件:svmtrain.mexw32,svmpredict.mexw32,libsvmread.mexw32,libsvmwrite.mexw32。完成~
4、測試:使用 [heart_scale_label,heart_scale_inst] = libsvmread('../heart_scale');生成測試數據
model = svmtrain(heart_scale_label,heart_scale_inst);
[predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);
model =
Parameters: [5x1 double]
nr_class: 2
totalSV: 132
rho: 0.4245
Label: [2x1 double]
ProbA: []
ProbB: []
nSV: [2x1 double]
sv_coef: [132x1 double]
SVs: [132x13 double]
accuracy =
86.6667
0.5333
0.5326
測試通過,說明libsvm在matlab中已經可以使用~
『貳』 libsvm 怎麼訓練多個變數
c語言版本的也記錄在 model 裡面.其中model 是一個結構體,其定義如下.
struct svm_model
{
struct svm_parameter param; // parameter
int nr_class; // number of classes, = 2 in regression/one class svm
int l; // total #SV
struct svm_node **SV; // SVs (SV[l])
double **sv_coef; // coefficients for SVs in decision functions (sv_coef[k-1][l])
double *rho; // constants in decision functions (rho[k*(k-1)/2])
double *probA; // pariwise probability information
double *probB;
// for classification only
int *label; // label of each class (label[k])
int *nSV; // number of SVs for each class (nSV[k])
// nSV[0] + nSV[1] + ... + nSV[k-1] = l
// XXX
int free_sv; // 1 if svm_model is created by svm_load_model
// 0 if svm_model is created by svm_train
};
裡面的sv_coef就是指向 拉格朗日參數(可能乘了1或者-1)的指針的指針
=============
其實用Matlab版本的更方便
『叄』 libsvm安裝在哪個ide裡面
一。下載libsvm
http://www.csie.ntu.e.tw/——cjlin/libsvm/
在libsvm的網站上下載 libsvm-3.12.zip文件,解壓後放在任意目錄下,最好放在MATLAB工具箱中,比如 C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12下。
二。配置編譯器
打開 matlab,切換到C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12\matlab目錄下,鍵入以下命令:
mex –setup
出現提示語句
Please choose your compiler for building MEX-files:
Would you like mex to locate installed compilers [y]/n?n %這次是選擇編譯器,輸入n,選擇自定義的編譯器
出現以下選項(因電腦而異)
Select a compiler:
[1] Intel C++ 11.1 (with Microsoft Visual C++ 2008 SP1 linker)
[2] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 SP1 linker)
[3] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 Shell linker)
[4] Lcc-win32 C 2.4.1
[5] Microsoft Visual C++ 6.0
[6] Microsoft Visual C++ 2005 SP1
[7] Microsoft Visual C++ 2008 SP1
[8] Microsoft Visual C++ 2010
[9] Microsoft Visual C++ 2010 Express
[10] Open WATCOM C++
[0] None
Compiler: 8%可以用其他的,出現以下提示語句
Your machine has a Microsoft Visual C++ 2010 compiler located at
C:\Program Files\Microsoft Visual Studio 10.0. Do you want to use this compiler [y]/n?
編譯器默認路徑,確認正確輸入y,更改路徑,輸入n
輸入y出現再次確認
Please verify your choices:
Compiler: Microsoft Visual C++ 2010
Location: C:\Program Files\Microsoft Visual Studio 10.0
Are these correct [y]/n? y
編譯器配置完成
Trying to update options file: C:\Documents and Settings\zhangokun\Application Data\MathWorks\MATLAB\R2011a\mexopts.bat
From template: C:\PROGRA——1\MATLAB\R2011a\bin\win32\mexopts\msvc100opts.bat
Done . . .
三。編譯
輸入命令
》 make
》
%編譯完成
系統就會生成svmtrain.mexw32,svmpredict.mexw32,libsvmread.mexw32和libsvmwrite.mexw32等文件(對於 Matlab 7.1以下上版本,生成的對應文件為svmtrain.dll,svmpredict.dll和read_sparse.dll,沒做測試),然後可以在matlab的菜單 File->Set Path->add with subfolders(可直接用Add Folder)里,把 C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12\matlab目錄添加進去,這樣以後在任何目錄下都可以調用 libsvm的函數了。
四。測試
為了檢驗 libsvm和 matlab之間的介面是否已經配置完成,可以在 matlab下執行以下命令:
》load heart_scale
完成該步驟後發現Workspace中出現了heart_scale_inst和 heart_scale_label,說明正確
》model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07『);
》 [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model); %
Accuracy = 86.6667% (234/270) (classification)% done
如果運行正常並生成了model這個結構體(其中保存了所有的支持向量及其系數),那麼說明libsvm和matlab 之間的介面已經完全配置成功。
附:
如果你沒有 heart_scale.mat(官方現在都不給了,給的都是VC++下的格式 所以load 會報錯:heart_scale must be same as previous lines)
所以必須使用給的一個函數,轉化數據此函數為libsvmread()
使用如下: [label_vector, instance_matrix] = libsvmread('filename』);
此處為了跟官方統一名稱可以[heart_scale_label,heart_scale_inst] = libsvmread(『heart_scale』);
由於heart_scale在libsvm-3.11目錄下,不是在matlab下,所以直接用libsvmread命令會報錯,要買改變當前路徑,或者使用[heart_scale_label,heart_scale_inst] = libsvmread(『/heart_scale』);/代表返回上層路徑。
注意:
1. matlab自帶了C編譯器Lcc-win32C,但是libsvm原始版本是C++實現的,因此需要C++的編譯器來編譯,這就是不適用matlab默認編譯器而選擇其他C++編譯器的原因。
matlab支持的編譯器也是有限的,可以查看不同版本matlab支持的編譯器列表
2. 如果matlab版本太低,如matlab 7.0是不能用VS作為編譯器的,只能用VC++ 6.0
3. .mexw32 文件是經過加密的,打開是亂碼,函數本身沒有幫助。
例如輸入 help svmpredict會出現報錯: svmpredict not found
工具箱libsvm-3.12\matlab中README文件才是幫助文件。
但是輸入help svmtrain會出現幫助信息,其實出現的是系統自帶的svmtrain函數,沒有libsvm工具箱中的好用。
4.在新版本libsvm3.12中,文件夾libsvm-3.12\windows中已經有編譯好的程序,可以直接使用,只需要把libsvm-3.12\windows添加到matlab路徑中即可,不需要編譯的過程。當然最好還是自己編譯一遍,因為編譯環境不同會導致一些不可預估的小問題,自己編譯的過程是可控的。
5. 測試用數據集,libsvm官網上提供了很多數據集
測試使用的heart_scale數據集是C++版本的(類標簽 1:第一個屬性 2:第二個屬性…),可以用libsvmread來轉換為matlab版本的(它們的區別在類標簽)。
[label_vector, instance_matrix] = libsvmread(『C++版本數據集』); %得到類標簽和屬性矩陣,然後可以使用它們訓練了model = svmtrain(label_vector, instance_matrix);
》 load heart_scale
》 model = svmtrain(heart_scale_label,heart_scale_inst);
*
optimization finished, #iter = 162
nu = 0.431029
obj = -100.877288, rho = 0.424462
nSV = 132, nBSV = 107
Total nSV = 132
》 [predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);
Accuracy = 86.6667% (234/270) (classification)
6.參考資料
libsvm庫下載:http://www.csie.ntu.e.tw/——cjlin/libsvm/
視頻:http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html(有小問題,等下會提到)
『肆』 如何將數據轉換libsvm格式文件
使用FormatDataLibsvm.xls。其實這個軟體就是一個excel工作薄,先把office的宏安全性應當設置為中或者低。打開它就會跳出來一個對話框,選「啟用宏」就行了,其他不用管它,把你要的數據拷上去就好了。
1,先運行FormatDataLibsvm.xls然後將數據粘貼到sheet1的topleft單元。
2,再"工具"-->"宏"-->執行下面有一個選項(FormatDatatoLibsvm)-->執行,要選中這個然後運行就可以了 ,這時數據轉換的問題就解決了,可是現在生成的數據是.xls格式,它還是不能做為libsvm的訓練文件啊!還需要怎麼轉換呢?
3,可以到一個記事本中即可。但是注意在用libsvm的時候要在命令行輸入.txt後綴。
輸入數據的格式是
條件屬性a 條件屬性b ... 決策屬性
7 5 ... 2
4 2 ... 1
輸出數據格式是
決策屬性 條件屬性a 條件屬性b ...
2 1:7 2:5 ...
1 1:4 2:2 ...
P.S. 在第2步時,執行下面還有另一個選項(FormatDatafromLibsvm)這個可以把libsvm數據的格式重新轉回來,轉到你第1步時剛拷貝到excel里的數據形式。
或者自己寫個MATLAB的程序,將自己常用的數據格式按照這種數據格式要求轉換成這種格式供LIBSVM直接使用。
格式轉換函數write2libsvm如下:
function write2libsvm
% 為了使得數據滿足libsvm的格式要求而進行的數據格式轉換
% 原始數據保存格式為:
% [標簽 第一個屬性值 第二個屬性值...]
% 轉換後文件格式為滿足libsvm的格式要求,即:
% [標簽 1:第一個屬性值 2:第二個屬性值 3:第三個屬性值 ...]
[filename, pathname] = uigetfile( {'*.mat', ...
'數據文件(*.mat)'; '*.*', '所有文件 (*.*)'}, '選擇數據文件');
try
S=load([pathname filename]);
fieldName = fieldnames(S);
str = cell2mat(fieldName);
B = getfield(S,str);
[m,n] = size(B);
[filename, pathname] = uiputfile({'*.txt;*.dat' ,'數據文件
(*.txt;*.dat)';'*.*','所有文件 (*.*)'},'保存數據文件');
fid = fopen([pathname filename],'w');
if(fid~=-1)
for k=1:m
fprintf(fid,'%3d',B(k,1));
for kk = 2:n
fprintf(fid,'\t%d',(kk-1));
fprintf(fid,':');
fprintf(fid,'%d',B(k,kk));
end
fprintf(fid,'\n');
end
fclose(fid);
else
msgbox('無法保存文件!');
end
catch
msgbox('文件保存過程中出錯!','出錯了...','error');
end
『伍』 有沒有用c或c++實現svm演算法
林智仁 的libsvm 就是C實現的SVM演算法代碼,回答不能帶鏈接,你去搜一下libsvm就能找到了.你可以找到他的主頁,上面還會有演算法的具體介紹,和libsvm的使用. 這個估計是使用最廣泛的求解svm的工具包. 裡面的代碼都是可以看的.
理論的話,july寫的一篇文章很經典, 搜索 支持向量機通俗導論(理解SVM的三層境界) 就能找到.
另外看樓主是想學習人工智慧演算法的, 附加一個學習神經網路的網路, <神經網路之家> nnetinfo ,專講神經網路的,還有相關視頻.
都是本人學習過程了解到的干貨, 望採納.
『陸』 用libsvm如何得到每個樣本的點到超平面的距離,網上找的資料都說在svm.cpp中加上一段代碼,具體怎麼加
你可以試試,matlab 版本的那個svm工具包,如果你對C不太熟悉的話
『柒』 哪位朋友能介紹一下支持向量機工具libsvm的用法
LIBSVM的簡單介紹 2006-09-20 15:59:48
大 中 小
1. LIBSVM 軟體包簡介
LIBSVM 是台灣大學林智仁(Chih-Jen Lin)博士等開發設計的一個操作簡單、易於使用、快速有效的通用SVM 軟體包,可以解決分類問題(包括C- SVC、n - SVC )、回歸問題(包括e - SVR、n - SVR )以及分布估計(one-class-SVM )等問題,提供了線性、多項式、徑向基和S形函數四種常用的核函數供選擇,可以有效地解決多類問題、交叉驗證選擇參數、對不平衡樣本加權、多類問題的概率估計等。LIBSVM 是一個開源的軟體包,需要者都可以免費的從作者的個人主頁http://www.csie.ntu.e.tw/~cjlin/
處獲得。他不僅提供了LIBSVM的C++語言的演算法源代碼,還提供了Python、Java、R、MATLAB、Perl、Ruby、LabVIEW以及C#.net 等各種語言的介面,可以方便的在Windows 或UNIX 平台下使用。另外還提供了WINDOWS 平台下的可視化操作工具SVM-toy,並且在進行模型參數選擇時可以繪制出交叉驗證精度的等高線圖。
2. LIBSVM 使用方法簡介
LibSVM是以源代碼和可執行文件兩種方式給出的。如果是Windows系列操作系統,可以直接使用軟體包提供的程序,也可以進行修改編譯;如果是Unix類系統,必須自己編譯。
LIBSVM 在給出源代碼的同時還提供了Windows操作系統下的可執行文件,包括:進行支持向量機訓練的svmtrain.exe;根據已獲得的支持向量機模型對數據集進行預測的svmpredict.exe;以及對訓練數據與測試數據進行簡單縮放操作的svmscale.exe。它們都可以直接在DOS 環境中使用。如果下載的包中只有C++的源代碼,則也可以自己在VC等軟體上編譯生成可執行文件。
3. LIBSVM 使用的一般步驟是:
1) 按照LIBSVM軟體包所要求的格式准備數據集;
2) 對數據進行簡單的縮放操作;
3) 考慮選用RBF 核函數;
4) 採用交叉驗證選擇最佳參數C與g ;
5) 採用最佳參數C與g 對整個訓練集進行訓練獲取支持向量機模型;
6) 利用獲取的模型進行測試與預測。
4. LIBSVM使用的數據格式
1)訓練數據和檢驗數據文件格式如下:
<label> <index1>:<value1> <index2>:<value2> ...
其中<label> 是訓練數據集的目標值,對於分類,它是標識某類的整數(支持多個類);對於回歸,是任意實數。<index> 是以1開始的整數,可以是不連續的;<value>為實數,也就是我們常說的自變數。檢驗數據文件中的label只用於計算準確度或誤差,如果它是未知的,只需用一個數填寫這一欄,也可以空著不填。
在程序包中,還包括有一個訓練數據實例:heart_scale,方便參考數據文件格式以及練習使用軟體。可以編寫小程序,將自己常用的數據格式轉換成這種格式
2)Svmtrain和Svmpredict的用法
LIBSVM軟體提供的各種功能都是DOS命令執行方式。我們主要用到兩個程序,svmtrain(訓練建模)和svmpredict(使用已有的模型進行預測),下面分別對這兩個程序的使用方法、各參數的意義以及設置方法做一個簡單介紹:
(1)Svmtrain的用法:
svmtrain [options] training_set_file [model_file]
Options:可用的選項即表示的涵義如下
-s svm類型:SVM設置類型(默認0)
0 -- C-SVC
1 --v-SVC
2 – 一類SVM
3 -- e -SVR
4 -- v-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)
-d degree:核函數中的degree設置(默認3)
-g 函數設置(默認1/ k)r(gama):核函數中的
-r coef0:核函數中的coef0設置(默認0)
-c cost:設置C-SVC, -SVR的參數(默認1)-SVR和
- SVR的參數(默認0.5)-SVC,一類SVM和-n nu:設置
-SVR-p e:設置的值(默認0.1)中損失函數
-m cachesize:設置cache內存大小,以MB為單位(默認40)
-e :設置允許的終止判據(默認0.001)
-h shrinking:是否使用啟發式,0或1(默認1)
-wi C(C-SVC中的C)(默認1)weight:設置第幾類的參數C為weight
-v n: n-fold交互檢驗模式
其中-g選項中的k是指輸入數據中的屬性數。option -v 隨機地將數據剖分為n部分並計算交互檢驗准確度和均方根誤差。以上這些參數設置可以按照SVM的類型和核函數所支持的參數進行任意組合,如果設置的參數在函數或SVM類型中沒有也不會產生影響,程序不會接受該參數;如果應有的參數設置不正確,參數將採用默認值。training_set_file是要進行訓練的數據集;model_file是訓練結束後產生的模型文件,文件中包括支持向量樣本數、支持向量樣本以及lagrange系數等必須的參數;該參數如果不設置將採用默認的文件名,也可以設置成自己慣用的文件名。
(2)Svmpredict的用法:
svmpredict test_file model_file output_file
model_file 是由svmtrain產生的模型文件;test_file是要進行預測的數據文件;Output_file是svmpredict的輸出文件。svm-predict沒有其它的選項。
下面是具體的使用例子
svmtrain -s 0 -c 1000 -t 1 -g 1 -r 1 -d 3 data_file
訓練一個由多項式核(u'v+1)^3和C=1000組成的分類器。
svmtrain -s 1 -n 0.1 -t 2 -g 0.5 -e 0.00001 data_file =-SVM (在RBF核函數exp(-0.5|u-v|^2)和終止允許限0.00001的條件下,訓練一個 0.1)分類器。 svmtrain -s 3 -p 0.1 -t 0 -c 10 data_file =以線性核函數u'v和C=10及損失函數 0.1求解SVM回歸。
『捌』 如何在matlab里安裝libsvm包
1.下載好libsvm包
下載libsvm-3.21到隨意一個地方,比如到matlab安裝路徑下的 toolbox下——D:\MATLAB\R2014A\toolbox\下,並解壓。
打開matlab,將libsvm-3.21\matlab 添加到路徑,比如將:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab 添加到路徑。
2.setup 第一次嘗試
若提示沒有C++編譯器,則根據提示的網址去下載 winsdk_web.exe,然後 雙擊運行winsdk_web.exe,安裝到最後若提示失敗,則去卸載自帶的visual studio 和 .netframework 4,然後再運行 winsdk_web.exe,提示缺少 .netframework 4,則自行下載安裝,反復運行 winsdk_web.exe。
直到運行 winsdk_web.exe 時出現如下圖所示情況,說明距成功更近一步了,
選擇 Change,下一步,
勾選上 visual C++ compilers 和 microsoft visual C++ 2010,下一步,
最後提示成功安裝。
2. setup
打開Matlab中,進入LIBSVM根目錄下的matlab目錄(如D:\MATLAB\R2014A\toolbox\libsvm-3.21),在命令窗口的輸入mex -setup 輸出為:
>>mex –setup
MEX 配置為使用 'Microsoft Windows SDK 7.1 (C)' 以進行 C 語言編譯。
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. In the near future
you will be required to update your code to utilize the
new API. You can find more information about this at:
http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.
要選擇不同的語言,請從以下選項中選擇一種命令:
mex -setup C++
mex -setup FORTRAN
繼續:
>> mex -setup C++
MEX 配置為使用 'Microsoft Windows SDK 7.1 (C++)' 以進行 C++ 語言編譯。
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. In the near future
you will be required to update your code to utilize the
new API. You can find more information about this at:
http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.
3.編譯
執行 make,輸出如下:
>> make
使用 'Microsoft Windows SDK 7.1 (C)' 編譯。
MEX 已成功完成。
使用 'Microsoft Windows SDK 7.1 (C)' 編譯。
MEX 已成功完成。
使用 'Microsoft Windows SDK 7.1 (C++)' 編譯。
找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmtrain.exp
找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmtrain.exp
MEX 已成功完成。
使用 'Microsoft Windows SDK 7.1 (C++)' 編譯。
找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmpredict.exp
找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmpredict.exp
MEX 已成功完成。
>>
4.重命名
忽略錯誤(找不到……),繼續,編譯完成後,在當前目錄下(libsvm-3.21/matlab下)會出現svmtrain.mexw64、svmpredict.mexw64 或者svmtrain.mexw32、svmpredict.mexw32 ,把文件名svmtrain和svmpredict 相應改成 libsvmtrain 和 libsvmpredict。
這是因為Matlab中自帶有SVM的工具箱,其函數名字就是svmtrain和svmpredict,和 libsvm 默認的名字一樣.
5.測試是否安裝成功libsvm
libsvm 軟體包中自帶有測試數據,即軟體包根目錄下的 heart_scale 文件。
在matlab運行代碼,輸出如下:
>> [heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
>> model = libsvmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
*
optimization finished, #iter = 134
nu = 0.433785
obj = -101.855060, rho = 0.426412
nSV = 130, nBSV = 107
Total nSV = 130
>> [predict_label, accuracy, dec_values] = libsvmpredict(heart_scale_label, heart_scale_inst, model);
Accuracy = 86.6667% (234/270) (classification)
>>
OK ,perfect ! Congratulations to you!
如果遇到:
>> [heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
Invalid MEX-file 'C:\Users\jiao\Documents\MATLAB\libsvm-3.20\matlab\libsvmread.mexw64': 找不到指定的模塊。
則把 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab 文件夾添加到路徑就可以了。
『玖』 如何使用libsvm進行分類
這帖子就是初步教教剛接觸libsvm(svm)的同學如何利用libsvm進行分類預測,關於參數尋優的問題在這里姑且不談,另有帖子詳述。
其實使用libsvm進行分類很簡單,只需要有屬性矩陣和標簽,然後就可以建立分類模型(model),然後利用得到的這個model進行分類預測了。
那神馬是屬性矩陣?神馬又是標簽呢?我舉一個直白的不能在直白的例子:
說一個班級裡面有兩個男生(男生1、男生2),兩個女生(女生1、女生2),其中
男生1 身高:176cm 體重:70kg;
男生2 身高:180cm 體重:80kg;
女生1 身高:161cm 體重:45kg;
女生2 身高:163cm 體重:47kg;
如果我們將男生定義為1,女生定義為-1,並將上面的數據放入矩陣data中,即
data = [176 70;
180 80;
161 45;
163 47];
復制代碼
在label中存入男女生類別標簽(1、-1),即
label = [1;1;-1;-1];
復制代碼
這樣上面的data矩陣就是一個屬性矩陣,行數4代表有4個樣本,列數2表示屬性有兩個,label就是標簽(1、-1表示有兩個類別:男生、女生)。
Remark:這里有一點廢話一些(因為我看到不止一個朋友問我這個相關的問題):
上面我們將男生定義為1,女生定義為-1,那定義成別的有影響嗎?
這個肯定沒有影響啊!(用腳趾頭都能想出來,我不知道為什麼也會有人問),這裡面的標簽定義就是區分開男生和女生,怎麼定義都可以的,只要定義成數值型的就可以。
比如我可將將男生定義為2,女生定義為5;後面的label相應為label=[2;2;5;5];
比如我可將將男生定義為18,女生定義為22;後面的label相應為label=[18;18;22;22];
為什麼我說這個用腳趾頭都能想怎麼定義都可以呢?學過數學的應該都會明白,將男生定義為1,女生定義為-1和將男生定義為2,女生定義為5本質是一樣的,應為可以找到一個映射將(2,5)轉換成(1,-1),so所以本質都是一樣的,後面的18、22本質也是一樣的。
這里要多說一些,如果你原本的數據集合的標簽不是數值型的(比如a、b、c)那麼你完全可以通過某種轉換映射將不是數值型的標簽轉換成數值型的。
現在回歸正題,有了上面的屬性矩陣data,和標簽label就可以利用libsvm建立分類模型了,簡要代碼如下:
model = svmtrain(label,data);
復制代碼
有了model我們就可以做分類預測,比如此時該班級又轉來一個新學生,其
身高190cm,體重85kg
我們想通過上面這些信息就給出其標簽(想知道其是男【1】還是女【-1】)
比如 令 testdata = [190 85]; 由於其標簽我們不知道,我們假設其標簽為-1(也可以假設為1)
Remark:這里又有一點廢話一些(因為我看到不止一個朋友問我這個相關的問題):
如果測試集合的標簽沒有怎麼辦?測試集合的標簽就應該沒有,否則測試集合的標簽都有了,還預測你妹啊!?沒有是正確的,就像上面一樣,新來的學生其標簽咱不應知道,就想通過其屬性矩陣來預測其標簽,這才是預測分類的真正目的。
之所以平時做測試時,測試集合的標簽一般都有,那是因為一般人們想要看看自己的分類器的效果如何,效果的評價指標之一就是分類預測的准確率,這就需要有測試集的本來的真實的標簽來進行分類預測准確率的計算。
話歸正傳,即
testdatalabel = -1;
然後利用libsvm來預測這個新來的學生是男生還是女生,代碼如下:
[predictlabel,accuracy] = svmpredict(testdatalabel,testdata,model)
復制代碼
下面我們整體運行一下上面這段惡 搞[e gao]的背景數據和代碼(你別笑,這個是真能運行的,也有結果的):
data = [176 70;
180 80;
161 45;
163 47];
label = [1;1;-1;-1];
model = svmtrain(label,data);
testdata = [190 85];
testdatalabel = -1;
[predictlabel,accuracy] = svmpredict(testdatalabel,testdata,model);
predictlabel
復制代碼
運行結果如下:
Accuracy = 0% (0/1) (classification)
predictlabel =
1
復制代碼
哎,我們看到,通過預測我們得知這個新來的學生的標簽是1(男生),由於原本我們假設其標簽為-1,假設錯誤,所以分類准確率為0%。
好,通過上面的講解,不知道諸位看官對於利用libsvm進行分類是否有了一定了解【誰要是這么通俗的例子還搞不清楚怎麼使用libsvm進行分類,那我真無語啦】,下面使用libsvm工具箱本身帶的測試數據heart_scale來實際進行一下測試:
%% HowToClassifyUsingLibsvm
% by faruto @ faruto's Studio~
% http://blog.sina.com.cn/faruto
% Email:[email protected]
% http://www.MATLABsky.com
% http://www.mfun.la
% http://video.ourmatlab.com
% last modified by 2010.12.27
%% a litte clean work
tic;
close all;
clear;
clc;
format compact;
%%
% 首先載入數據
load heart_scale;
data = heart_scale_inst;
label = heart_scale_label;
% 選取前200個數據作為訓練集合,後70個數據作為測試集合
ind = 200;
traindata = data(1:ind,:);
trainlabel = label(1:ind,:);
testdata = data(ind+1:end,:);
testlabel = label(ind+1:end,:);
% 利用訓練集合建立分類模型
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
% 利用建立的模型看其在訓練集合上的分類效果
[ptrain,acctrain] = svmpredict(trainlabel,traindata,model);
% 預測測試集合標簽
[ptest,acctest] = svmpredict(testlabel,testdata,model);
%%
toc;
復制代碼
運行結果:
model =
Parameters: [5x1 double]
nr_class: 2
totalSV: 197
rho: 0.0583
Label: [2x1 double]
ProbA: []
ProbB: []
nSV: [2x1 double]
sv_coef: [197x1 double]
SVs: [197x13 double]
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.040873 seconds.
>>
『拾』 請教libSVM中一類SVM訓練及測試的參數設置問題
-s svm類型:SVM設置類型(默認0)
% 0 -- C-SVC
% 1 --v-SVC
% 2 – 一類SVM
% 3 -- e -SVR
% 4 -- v-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)
% 4 -- precomputed kernel (kernel values in training_instance_matrix)
% -d degree:核函數中的degree設置(針對多項式核函數)(默認3)
% -g r(gama):核函數中的gamma函數設置(針對多項式/rbf/sigmoid核函數)(默認1/ k)
% -r coef0:核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)
% -c cost:設置C-SVC,e -SVR和v-SVR的參數(損失函數)(默認1)
% -n nu:設置v-SVC,一類SVM和v- SVR的參數(默認0.5)
% -p p:設置e -SVR 中損失函數p的值(默認0.1)
% -m cachesize:設置cache內存大小,以MB為單位(默認40)
% -e eps:設置允許的終止判據(默認0.001)
% -h shrinking:是否使用啟發式,0或1(默認1)