⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 z_lib_gridsearch.m

📁 libsvm的参数寻优程序。针对SVR提供full 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 + -