📄 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 + -