1. 程式人生 > >libsvm 引數調整 並行選擇最優引數 c g SVMcg強化版

libsvm 引數調整 並行選擇最優引數 c g SVMcg強化版

以下程式碼是SVMcg強化版,事實上,原版本一點都沒有進行作者提到的並行grid引數計算,所以有效程式碼恕我直言大概只有一句呼叫svm運算的。已經不知道原作者是誰了。

主要是把引數矩陣攤平了,一起算,這樣可以呈現最大並行效果。

function [bestacc,bestc,bestg,cg] = SVMcgPP(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
%本作者不提供技術支援,不對程式碼負責,免費,隨意改。
%並行部分[email protected]://blog.csdn.net/u013249853/article/list/1
%如果有優化建議歡迎
[email protected]
% 使用說明.如下: % [bestacc,bestc,bestg,cg] = SVMcgPP(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 < 10 accstep = 1.5; end if nargin < 8 accstep = 1.5; cstep = 1; gstep = 1; end if nargin < 7 accstep = 1.5; v = 3; cstep = 1; gstep = 1; end if nargin < 6 accstep = 1.5; v = 3; cstep = 1; gstep = 1; gmax = 5; end if nargin < 5 accstep = 1.5; v = 3; cstep = 1; gstep = 1; gmax = 5; gmin = -5; end if nargin < 4 accstep = 1.5; v = 3; cstep = 1; gstep = 1; gmax = 5; gmin = -5; cmax = 5; end if nargin < 3 accstep = 1.5; v = 3; cstep = 1; gstep = 1; gmax = 5; gmin = -5; cmax = 5; cmin = -5; end %% X:c Y:g cg:acc x = length(cmin:cstep:cmax); y = length(gmin:gstep:gmax); A = []; C = [cmin:cstep:cmax]; G = [gmin:gstep:gmax]; o=1; for i = 1:x for j = 1:y A(o,1) = C(i); A(o,2) = G(j); o=o+1; end end % [m,n] = size(X); cg =[]; %% record acc with different c & g,and find the bestacc with the smallest c bestc = 0; bestg = 0; bestacc = 0; basenum = 2; parfor i=1:o-1 cmd = ['-v ',num2str(v),' -c ',num2str( basenum^A(i,1) ),' -g ',num2str( basenum^A(i,2) )]; cg(i) = svmtrain(train_label, train, cmd); end % parfor 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); % end % end % if cg(i,j) > bestacc % bestacc = cg(i,j); % bestc = basenum^X(i,j); % bestg = basenum^Y(i,j); % end % if ( cg(i,j) == bestacc && bestc > basenum^X(i,j) ) % bestacc = cg(i,j); % bestc = basenum^X(i,j); % bestg = basenum^Y(i,j); % end [bestacc,I] = max(max(cg)); bestc = basenum^A(I,1); bestg = basenum^A(I,2); [X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax); cg1 = reshape(cg,[y,x]); %% to draw the acc with different c & g [C,h] = contour(X,Y,cg1,60:accstep:100); clabel(C,h,'FontSize',10,'Color','r'); xlabel('log2c','FontSize',10); ylabel('log2g','FontSize',10); grid on;