MATLAB SVM尋找最佳引數 c g

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第22天,點選檢視活動詳情

image.png

老師佈置了一個數據挖掘的作業,用SVM做分類。老師原話是:“說SVM訓練慢,其實svmtrain的過程是很快的,慢是慢在尋找最佳引數。”

但是尋找最佳引數這裡老師又直接給了一個別人寫的網格計算的小程式碼,一個函式直接呼叫就OK了。並不是每個人都有老師,所以在這裡分享一下。

配合livsvm庫一起使用效果絕佳。

新建一個檔案叫SVMcgForClass.m,如果你不嫌麻煩,拉到最底下,把下面程式碼解釋部分的程式碼從頭到尾複製進去,儲存。

如果你懶得複製儲存可以直接下一個: - 下載地址:SVMcgForClass.m 阿里雲盤下載

搞好了那個檔案之後,將檔案放到你程式碼同目錄下邊。

1651661306(1).png

然後在你的程式碼中加一句: clike [bestacc,bestc,bestg] = SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep) 就會自動呼叫SVMcgForClass的函式,並返回最高準確率下(bestacc)的最佳的g和c(bestc、bestg)。

比如下圖這樣,我的訓練集的分類標籤是train_labels,訓練集的分類特徵是train_features,之後就是設定c和g的最大值最小值以及網格步長,還有交叉驗證的折數(引數下邊程式碼部分會詳細解釋)。 都設定好之後執行可以看到最右邊的結果。

image.png


程式碼解釋

解釋一下下邊這段程式碼啊,就是搞了個網格,挨個資料對測試,獲取最佳的c和g,注意這是在計算精度相同的情況下獲取最小的c和g。

原作者備註資訊在程式碼的3-15行。

最後一次修改已經是10年了,(12年前的事了,現在居然還能用),我看了一下新浪部落格已經倒閉了,所以我就發過來了。

clike function [bestacc,bestc,bestg] = SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep) 第1行程式碼就是:寫了一個SVMcgForClass函式,能返回在最好準確率情況下的最好的c和g。 引數: - train_label:測試集分類標籤 - train:測試集資料 - cmin、cmax、cstep:c的取值範圍以及每次增加的步長 - gmin、gmax、gstep:g的取值範圍以及每次增加的步長 - v:SVM會做k折交叉驗證,這裡是驗證的折數,即k的大小 - accstep:精度的步長,這裡是畫圖時候會用到的一個值

clike %% about the parameters of SVMcg if nargin < 10 accstep = 4.5; end ...... 原始碼的17-35行是引數設定。 nargin為“number of input arguments”的縮寫。 在matlab中定義一個函式時, 在函式體內部, nargin是用來判斷輸入變數個數的函式。 他一共設定了10個引數。 - nargin < 10就是說你只寫了9個引數,不寫accstep的時候預設設定accstep為4.5。 - nargin < 8就是你還沒寫gstep和cstep,預設設定為0.8。 - nargin < 7不寫K折交叉預設5折。 - nargin < 5不寫g預設[-8,8] - nargin < 3不寫c預設[-8,8]

所以我上邊的例子程式碼寫成下邊這樣也是可以的。

image.png

原始碼的36-70行是設定網格挨個資料對都搞一個SVM訓練。 cg用來儲存你所有的SVM網路,以便尋找最好的一個。

原始碼的71到最後就是對你剛才網格所有的資料進行一個視覺化,一個等高線圖一個3D的圖。


完整程式碼

```clike function [bestacc,bestc,bestg] = SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)

%SVMcg cross validation by faruto %% % by faruto %Email:[email protected] QQ:516667408 http://blog.sina.com.cn/faruto BNU %last modified 2010.01.17

%% 若轉載請註明: % faruto and liyang , LIBSVM-farutoUltimateVersion % a toolbox with implements for support vector machines based on libsvm, 2009. % % Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for % support vector machines, 2001. Software available at % http://www.csie.ntu.edu.tw/~cjlin/libsvm

%% about the parameters of SVMcg if nargin < 10 accstep = 4.5; end if nargin < 8 cstep = 0.8; gstep = 0.8; end if nargin < 7 v = 5; end if nargin < 5 gmax = 8; gmin = -8; end if nargin < 3 cmax = 8; cmin = -8; end %% X:c Y:g cg:CVaccuracy [X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax); [m,n] = size(X); cg = zeros(m,n);

eps = 10^(-4);

%% record acc with different c & g,and find the bestacc with the smallest c bestc = 1; bestg = 0.1; bestacc = 0; basenum = 2; for i = 1:m for j = 1:n cmd = ['-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) <= 90
        continue;
    end

    if cg(i,j) > bestacc
        bestacc = cg(i,j);
        bestc = basenum^X(i,j);
        bestg = basenum^Y(i,j);
    end

    if abs( cg(i,j)-bestacc )<=eps && bestc > basenum^X(i,j) 
        bestacc = cg(i,j);
        bestc = basenum^X(i,j);
        bestg = basenum^Y(i,j);
    end

end

end %% to draw the acc with different c & g figure; [C,h] = contour(X,Y,cg,70:accstep:100); clabel(C,h,'Color','r'); xlabel('log2c','FontSize',12); ylabel('log2g','FontSize',12); firstline = 'SVC引數選擇結果圖(等高線圖)[GridSearchMethod]'; secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ... ' CVAccuracy=',num2str(bestacc),'%']; title({firstline;secondline},'Fontsize',12); grid on;

figure; meshc(X,Y,cg); % mesh(X,Y,cg); % surf(X,Y,cg); axis([cmin,cmax,gmin,gmax,30,100]); xlabel('log2c','FontSize',12); ylabel('log2g','FontSize',12); zlabel('Accuracy(%)','FontSize',12); firstline = 'SVC引數選擇結果圖(3D檢視)[GridSearchMethod]'; secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ... ' CVAccuracy=',num2str(bestacc),'%']; title({firstline;secondline},'Fontsize',12);