?? z_lib_gridsearch.m
字號:
function [gam_optimization,C_optimization,Yt_svm_train,Yt_svm_test,time_run]=z_lib_gridsearch(gam_array,C_array,X_svm_train,X_svm_test,Y_svm_train,Y_svm_test,P)
%this function is a full grid-search using Lib-SVM
tic; %記錄開始時間
if (nargin == 6) % check number of input arguments
P=0.1; %默認epsilon值為0.1
end
gam_size = size(gam_array,2);
C_size = size(C_array,2);
%以gama的值作為行,C的值作為列,記錄train set的mse誤差
search_array_train = zeros(gam_size,C_size); %儲存train set的mse誤差
a='-s 3 -t 2 -c ';%設置libsvm type為epsilon SVR,核函數為RBF
b='-g ';
e='-p ';
for i=1:gam_size
gam = gam_array(i);
for j=1:C_size
C = C_array(j);
Parameter=[a,' ',num2str(C),' ',b,' ',num2str(gam),' ',e,' ',num2str(P)];
model = svmtrain(Y_svm_train, X_svm_train , Parameter);
Yt_svm_train = svmpredict(Y_svm_train, X_svm_train, model);
[train_mse,train_mae,train_nmse,train_mape] = w_errcompute(Y_svm_train,Yt_svm_train);
search_array_train(i,j) = train_mse;
train_mse=0; %數值清0
end
end
for i=1:gam_size
min_mse_train(i)= min(search_array_train(i,:));
end
min_point_train = min(min_mse_train); %記錄最小值
%查找此最小值在原數組中的位置,從而確定對應的gam和C
gam_count_train = 1; %計數作用,防止有超過1個以上的最優參數組合
C_count_train = 1; %與gam_count_train保持一致,形成一對組合
for j=1:size(min_mse_train,2)
if min_point_train == min_mse_train(j)
gam_data_train(gam_count_train) = j; %數組gam_data_train用來記錄在gam_array數組中的最優參數所在位置
gam_count_train = gam_count_train +1;
end
end
for ii = 1:(gam_count_train-1)
for jj = 1:C_size
if search_array_train(gam_data_train(ii),jj) == min_point_train
C_data_train(C_count_train) = jj;%數組C_data_train用來記錄在C_array數組中的最優參數所在位置
%只要在此列中找到了一個同最小值一樣的數值,就停止搜索,而不再考慮向后繼續搜索.主要出于對數組存儲位置的考慮,用以實現同gam值的一一對應
C_count_train = C_count_train +1;
break; %跳出此內嵌循環,回到外層循環
end
end
end
flag = 0; %標識是否存在多于1組的最優參數,0表示沒有,1表示有 %%注意,判斷是否存在多于1組最優參數,是基于比較train set的mse的
%取出最小誤差下的C和gam的值
if gam_count_train >2 & C_count_train >2
disp('Attention: There are more than one pair of optimization parameters!')
flag = 1;
end
if flag == 0 %表示只有一組最優值
time_run = toc; %計算完全搜索所使用時間
gam_optimization = gam_array(gam_data_train);
C_optimization = C_array(C_data_train);
Parameter=[a,' ',num2str(C_optimization),' ',b,' ',num2str(gam_optimization),' ',e,' ',num2str(P)];
model = svmtrain(Y_svm_train, X_svm_train , Parameter);
Yt_svm_train = svmpredict(Y_svm_train, X_svm_train, model);
Yt_svm_test = svmpredict(Y_svm_test, X_svm_test, model);
%[train_mse,train_mae,train_nmse,train_mape] = w_errcompute(Y_svm_train,Yt_svm_train);
%[test_mse,test_mae,test_nmse,test_mape] = w_errcompute(Y_svm_test,Yt_svm_test);
% disp(['Using Full_gridsearch'])
disp(['The optimization parameters are follows: gam is ' num2str(gam_optimization) ', C is ' num2str(C_optimization)])
% disp(['train_mse is ' num2str(train_mse) ', train_mae is ' num2str(train_mae) ',train_nmse is' num2str(test_nmse) ',train_mape is ' num2str(train_mape)])
% disp(['test_mse is ' num2str(test_mse) ', test_mae is ' num2str(test_mae) ',test_nmse is ' num2str(test_nmse) ',test_mape is ' num2str(test_mape)])
end
% 存在多于1組的最優參數! 在這種情況下,再比較具有相同train mse的不同最優參數下面的test set上面的mse
if flag ==1
for i = 1:(gam_count_train-1)
gam_optimization_array(i) = gam_array(gam_data_train(i));
C_optimization_array(i) = C_array(C_data_train(i));
Parameter=[a,' ',num2str(C_optimization_array(i)),' ',b,' ',num2str(gam_optimization_array(i)),' ',e,' ',num2str(P)];
model = svmtrain(Y_svm_train, X_svm_train , Parameter);
Yt_svm_train = svmpredict(Y_svm_train, X_svm_train, model);
Yt_svm_test = svmpredict(Y_svm_test, X_svm_test, model);
[train_mse,train_mae,train_nmse,train_mape] = w_errcompute(Y_svm_train,Yt_svm_train);
[test_mse,test_mae,test_nmse,test_mape] = w_errcompute(Y_svm_test,Yt_svm_test);
test_mse_array(i) = test_mse;
train_mse_array(i) = train_mse;
end
%%%在test_mse_array中找出最小的誤差值,然后找出對應情況下的gam,C,%注意,找到第一個即可,不考慮還存在相同train set mse相同而且test set上面mse還相同的情況
min_test_mse_array = min(test_mse_array);
for ii =1:size(test_mse_array,2)
if test_mse_array(ii) == min_test_mse_array
min_position = ii;
end
end
%%%得到最優參數如下
gam_optimization = gam_optimization_array(min_position);
C_optimization = C_optimization_array(min_position);
time_run = toc; %計算完全搜索所使用時間
Parameter=[a,' ',num2str(C_optimization),' ',b,' ',num2str(gam_optimization),' ',e,' ',num2str(P)];
model = svmtrain(Y_svm_train, X_svm_train , Parameter);
Yt_svm_train = svmpredict(Y_svm_train, X_svm_train, model);
Yt_svm_test = svmpredict(Y_svm_test, X_svm_test, model);
%[train_mse,train_mae,train_nmse,train_mape] = w_errcompute(Y_svm_train,Yt_svm_train);
%[test_mse,test_mae,test_nmse,test_mape] = w_errcompute(Y_svm_test,Yt_svm_test);
% disp(['Using Full_gridsearch'])
disp(['The optimization parameters are follows: gam is ' num2str(gam_optimization) ', C is ' num2str(C_optimization)])
% disp(['train_mse is ' num2str(train_mse) ', train_mae is ' num2str(train_mae) ',train_nmse is' num2str(test_nmse) ',train_mape is ' num2str(train_mape)])
% disp(['test_mse is ' num2str(test_mse) ', test_mae is ' num2str(test_mae) ',test_nmse is ' num2str(test_nmse) ',test_mape is ' num2str(test_mape)])
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -