日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LIBSVM在MATLAB中的使用及SVM最优参数选取示例代码

發布時間:2023/12/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LIBSVM在MATLAB中的使用及SVM最优参数选取示例代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 參考網站:

LIBSVM 庫下載:http://www.csie.ntu.edu.tw/~cjlin/libsvm/

https://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html?js=1#svm-toy-js

視頻:
http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html

詳解:http://www.matlabsky.com/thread-11925-1-1.html

更多細節可查看
https://sites.google.com/site/kittipat/libsvm_matlab

2. 操作流程:

請注意:詳細操作流程請參考上面的“詳解”網站,這里只說大框架和詳解里沒有提到的問題。

A.設置path

方法1
File->set path ->add with subfolders->加入libsvm-3.21文件夾的路徑

方法2

addpath(genpath(currentFolder))

currentFolder 為 libsvm-3.21 所在路徑

B. 在matlab中編譯

目的:將libsvm-3.21\matlab 中 libsvmwrite.c 等 C++文件編譯成 libsvmread.mexw64等matlab文件,這樣就可以在command window中被直接調用了。

C.加載數據集

訓練集和測試集都是自帶的 heart_scale

cd D:\CMWang\libsvm-3.21 [heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');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); % test the training data

還可以使用 load來載入數據

load heart_scale

有兩個數據集,一個是C++的, 一個是matlab的。libsvm庫中下載的是C++數據,所以matlab加載我們下載的heart_scale是會報錯的, .mat 格式的數據下載地址

下載matlab數據集(http://download.csdn.net/detail/abcjennifer/4215779)

For probability estimate

%For probability estimates, you need '-b 1' for training and testing:[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale'); model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07 -b 1'); [predict_label, accuracy, prob_estimates] = svmpredict(heart_scale_label, heart_scale_inst, model, '-b 1');

For Linear Kernel and Precomputed Kernel

% We give the following detailed example by splitting heart_scale into % 150 training and 120 testing data. Constructing a linear kernel % matrix and then using the precomputed kernel gives exactly the same % testing error as using the LIBSVM built-in linear kernel.[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');% Split Datatrain_data = heart_scale_inst(1:150,:);train_label = heart_scale_label(1:150,:);test_data = heart_scale_inst(151:270,:);test_label = heart_scale_label(151:270,:);% Linear Kernelmodel_linear = svmtrain(train_label, train_data, '-t 0');[predict_label_L, accuracy_L, dec_values_L] = svmpredict(test_label, test_data, model_linear);% Precomputed Kernelmodel_precomputed = svmtrain(train_label, [(1:150)', train_data*train_data'], '-t 4');[predict_label_P, accuracy_P, dec_values_P] = svmpredict(test_label, [(1:120)', test_data*train_data'], model_precomputed);accuracy_L % Display the accuracy using linear kernelaccuracy_P % Display the accuracy using precomputed kernel

備注:

(1) libsvmread主要用于讀取數據

這里的數據是非matlab下的.mat數據,比如說是.txt,.data等等,這個時候需要使用libsvmread函數進行轉化為matlab可識別數據,比如自帶的數據是heart_scale數據,那么導入到matlab有兩種方式,
一種使用libsvmread函數,在matlab下直接libsvmread(heart_scale);
第二種方式為點擊matlab的‘導入數據’按鈕,然后導向heart_scale所在位置,直接選擇就可以了。因為有的數據libsvmread讀取不管用,但是‘導入數據’后就可以變成matlab下數據。

(2)libsvmwrite寫函數,就是把已知數據存起來

使用方式為:libsvmwrite(‘filename’,label_vector, instance_matrix);
label_vector是標簽,instance_matrix為數據矩陣(注意這個數據必須是稀疏矩陣,就是里面的數據不包含沒用的數據(比如很多0),有這樣的數據應該去掉再存)。

(3)svmtrain訓練函數,訓練數據產生模型的

一般直接使用為:model=svmtrain(label,data,cmd); label為標簽,data為訓練數據(數據有講究,每一行為一個樣本的所有數據,列數代表的是樣本的個數),每一個樣本都要對應一個標簽(分類問題的話一般為二分類問題,也就是每一個樣本對應一個標簽)。
cmd為相應的命令集合,都有哪些命令呢?很多,-v,-t,-g,-c,等等,不同的參數代表的含義不同,
比如對于分類問題,這里-t就表示選擇的核函數類型,-t=0時線性核。-t=1多項式核,-t=2,徑向基函數(高斯),-t=3,sigmod核函數,新版出了個-t=4,預計算核(還不會用);
-g為核函數的參數系數-c為懲罰因子系數-v為交叉驗證的數,默認為5,這個參數在svmtrain寫出來使用與不寫出來不使用的時候,model出來的東西不一樣,不寫的時候,model為一個結構體,是一個模型,可以帶到svmpredict中直接使用,寫出來的時候,出來的是一個訓練模型的準確率,為一個數值。

用法: svmtrain [options] training_set_file [model_file]其中, options為操作參數, 可用的選項即表示的涵義如下所示:-s 設置svm類型: 0 – C-SVC1 – v-SVC2 – one-class-SVM3 – ε-SVR4 – n – SVR-t 設置核函數類型, 默認值為2 0 — 線性核: μ‘?ν1 — 多項式核: (γ?μ‘?ν+coef0)degree2 — RBF核: exp(–γ?∥μ?ν∥2)3 — sigmoid 核: tanh(γ?μ‘?ν+coef0)-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: 是否使用啟發式, 01(默認1); -wi weight: 設置第幾類的參數C為weight*C (C-SVC中的C) (默認1); -v n: n-fold交互檢驗模式, n為fold的個數, 必須大于等于2; -b 概率估計: 是否計算SVCSVR的概率估計, 可選值01, 默認0; model_file: 可選項, 為要保存的結果文件, 稱為模型文件, 以便在預測時使用.

(3)svmpredict訓練函數,使用訓練的模型去預測來的數據類型

使用方式為:

[predicted_label,accuracy,decision_values/prob_estimates]= svmpredict(testing_label_vector,testing_instance_matrix,model,’libsvm_options’)

或者:

[predicted_label]=svmpredict(testing_label_vector,testing_instance_matrix, model, ‘libsvm_options’)

第一種方式中,輸出為三個參數,預測的類型,準確率,評估值(非分類問題用著),輸入為測試類型(這個可與可無,如果沒有,那么預測的準確率accuracy就沒有意義了,如果有,那么就可以通過這個值與預測出來的那個類型值相比較得出準確率accuracy,但是要說明一點的是,無論這個值有沒有,在使用的時候都得加上,即使沒有,也要隨便加上一個類型值,反正你也不管它對不對,這是函數使用所規定的的),再就是輸入數據值,最后是參數值(這里的參數值只有兩種選擇,-p和-b參數),曾經遇到一個這樣的問題,比如說我在訓練函數中規定了-g參數為0.1,那么在預測的時候是不是也要規定這個參數呢?當你規定了以后,程序反而錯誤,提醒沒有svmpredict的-g參數,原因是在svmtrain后會出現一個model,而在svmpredict中你已經用了這個model,而這個model中就已經包含了你所有的訓練參數了,所以svmpredict中沒有這個參數,那么對于的libsvm_options就是-p和-b參數了。對于函數的輸出,兩種方式調用的方法不一樣,第一種調用把所有需要的數據都調用出來了,二第二種調用,只調用了predicted_label預測的類型,這里我們可以看到,在單純的分類預測模型中,其實第二種方式更好一些吧,既簡單有實用。

下面給出一個在Matlab中運行SVM的示例
https://sites.google.com/site/kittipat/libsvm_matlab

本文轉自:

http://blog.csdn.net/abcjennifer/article/details/7370177

http://blog.csdn.net/on2way/article/details/47733861

http://blog.csdn.net/m624197265/article/details/41894261

https://sites.google.com/site/kittipat/libsvm_matlab

關于SVM參數c&g選取的總結(matlab-libsvm)

選取SVM中參數 c和g的最佳值
尋找最佳c和g的思想仍然是讓c和g在一定的范圍里跑(比如 c = 2^(-5),2^(-4),…,2^(5),g = 2^(-5),2^(-4),…,2^(5)),然后用cross validation的想法找到是的準確率最高的c和g,在這里做了一點修改是: 因為會有不同的c和g都對應最高的的準確率,我把具有最小c的那組c和g認為是最佳的c和g,因為懲罰參數不能設置 太高,很高的懲罰參數能使得validation數據的準確率提高,但過高的懲罰參數c會造成過學習狀態,往往都是懲罰參數c過高會導致最終測試集合的準確率并不是很理想 。

先大范圍粗糙的找 比較理想的c和g,然后再細范圍找更加理想的c和g.
比如首先讓 c = 2^(-5),2^(-4),…,2^(5),g = 2^(-5),2^(-4),…,2^(5)在這個范圍找比較理想的c和g。
此時bestc = 0.5,bestg=1,bestacc = 98.8764[cross validation 的準確率]
最終測試集合的準確率 Accuracy = 96.6292% (86/89) (classification)

示例

load wine_SVM;train_wine = [wine(1:30,:);wine(60:95,:);wine(131:153,:)]; train_wine_labels = [wine_labels(1:30);wine_labels(60:95);wine_labels(131:153)];test_wine = [wine(31:59,:);wine(96:130,:);wine(154:178,:)]; test_wine_labels = [wine_labels(31:59);wine_labels(96:130);wine_labels(154:178)];[train_wine,pstrain] = mapminmax(train_wine'); pstrain.ymin = 0; pstrain.ymax = 1; [train_wine,pstrain] = mapminmax(train_wine,pstrain);[test_wine,pstest] = mapminmax(test_wine'); pstest.ymin = 0; pstest.ymax = 1; [test_wine,pstest] = mapminmax(test_wine,pstest);train_wine = train_wine'; test_wine = test_wine';[bestacc,bestc,bestg] = SVMcg(train_wine_labels,train_wine,-2,4,-4,4,3,0.5,0.5,0.9);cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)]; model = svmtrain(train_wine_labels,train_wine,cmd); [pre,acc] = svmpredict(test_wine_labels,test_wine,model); function [bestacc,bestc,bestg] = SVMcg(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep) %SVMcg cross validation by faruto %Email:farutoliyang@gmail.com QQ:516667408 http://blog.sina.com.cn/faruto BNU %last modified 2009.8.23 %Super Moderator @ www.ilovematlab.cn % 使用說明.如下: % [bestacc,bestc,bestg] = SVMcg(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep) % % train_label:訓練 集標簽.要求與libsvm工具箱中要求一致. % train:訓練集.要求與libsvm工具箱中要求一致. % cmin:懲罰參數c的變化范圍的最小值(取以2為底的對數后),即 c_min = 2^(cmin).默認為 -5 % cmax:懲罰參數c的變化范圍的最大值(取以2為底的對數后),即 c_max = 2^(cmax).默認為 5 % gmin:參數g的變化范圍的最小值(取以2為底的對數后),即 g_min = 2^(gmin).默認為 -5 % gmax:參數g的變化范圍的最小值(取以2為底的對數后),即 g_min = 2^(gmax).默認為 5 % % v:cross validation的參數,即給測試集分為幾部分進行cross validation.默認為 3 % cstep:參數c步進的大小.默認為 1 % gstep:參數g步進的大小.默認為 1 % accstep:最后顯示準確率圖時的步進大小. 默認為 1.5%% about the parameters of SVMcg if nargin < 10accstep = 1.5; end if nargin < 8accstep = 1.5;cstep = 1;gstep = 1; end if nargin < 7accstep = 1.5;v = 3;cstep = 1;gstep = 1; end if nargin < 6accstep = 1.5;v = 3;cstep = 1;gstep = 1;gmax = 5; end if nargin < 5accstep = 1.5;v = 3;cstep = 1;gstep = 1;gmax = 5;gmin = -5; end if nargin < 4accstep = 1.5;v = 3;cstep = 1;gstep = 1;gmax = 5;gmin = -5;cmax = 5; end if nargin < 3accstep = 1.5;v = 3;cstep = 1;gstep = 1;gmax = 5;gmin = -5;cmax = 5;cmin = -5; end %% X:c Y:g cg:acc [X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax); [m,n] = size(X); cg = zeros(m,n); %% record acc with different c & g,and find the bestacc with the smallest c bestc = 0; bestg = 0; bestacc = 0; basenum = 2; for i = 1:mfor j = 1:ncmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) )];cg(i,j) = svmtrain(train_label, train, cmd);if cg(i,j) > bestaccbestacc = cg(i,j);bestc = basenum^X(i,j);bestg = basenum^Y(i,j);endif ( cg(i,j) == bestacc && bestc > basenum^X(i,j) )bestacc = cg(i,j);bestc = basenum^X(i,j);bestg = basenum^Y(i,j);endend end %% to draw the acc with different c & g [C,h] = contour(X,Y,cg,60:accstep:100); clabel(C,h,'FontSize',10,'Color','r'); xlabel('log2c','FontSize',10); ylabel('log2g','FontSize',10); grid on;

具體詳情請查看
http://blog.csdn.net/alextowarson/article/details/4764801

總結

以上是生活随笔為你收集整理的LIBSVM在MATLAB中的使用及SVM最优参数选取示例代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。