查看: 2182|回复: 6|关注: 0

[已答复] DE差分进化算法优化SVM参数找不到最优的参数集

[复制链接]

新手

5 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
发表于 2018-9-26 17:09:22 | 显示全部楼层 |阅读模式
本帖最后由 狮子歌歌 于 2018-9-26 17:45 编辑

参考了网上DE差分进化算法优化SVM参数做回归分析的代码,在运行过程中总是找不到最优的那一组参数,烦请各位帮忙解决一下~
报错信息如下:
Reference to non-existent field 'Position'.

Error in my_DE_SVR (line 112)
bestc=BestSol.Position(1,1);

Error in my_DE_SVR_demo (line 16)
[bestc,bestg,test_pre]=my_DE_SVR(para,input_train',output_train',input_test',output_test');


以下是程序代码,附件中有数据
  1. [color=darkgreen]clear
  2. clc
  3. close all
  4. load wndspd % 示例数据为风速(时间序列)数据,共144个样本
  5. %% PSO-SVR
  6. % 训练/测试数据准备(用前3天预测后一天),用前100天做训练数据
  7. input_train(1,:)=wndspd(1:97);
  8. input_train(2,:)=wndspd(2:98);
  9. input_train(3,:)=wndspd(3:99);
  10. output_train=[wndspd(4:100)]';
  11. input_test(1,:)=wndspd(101:end-3);
  12. input_test(2,:)=wndspd(102:end-2);
  13. input_test(3,:)=wndspd(103:end-1);
  14. output_test=[wndspd(104:end)]';
  15. para=[30,200,0.2,0.8,0.2];
  16. [bestc,bestg,test_pre]=my_DE_SVR(para,input_train',output_train',input_test',output_test');
  17. % 预测误差计算
  18. MSE=mymse(output_test',test_pre)
  19. MAE=mymae(output_test',test_pre)
  20. MAPE=mymape(output_test',test_pre)
  21. FVD=myfvd(output_test',test_pre)
  22. CDFR=mycdfr(output_test',test_pre)
  23. %% 预测结果图
  24. err_pre=output_test'-test_pre;
  25. figure('Name','测试数据残差图')
  26. set(gcf,'unit','centimeters','position',[0.5,5,30,5])
  27. plot(err_pre,'*-');
  28. figure('Name','原始-预测图')
  29. plot(test_pre,'*r-');hold on;plot(output_test,'bo-');
  30. legend('预测','原始',0)
  31. set(gcf,'unit','centimeters','position',[0.5,13,30,5])
  32. toc[/color]
复制代码

  1. [color=darkgreen]function [bestc,bestg,test_pre]=my_DE_SVR(para,input_train,output_train,input_test,output_test)
  2. % 参数向量 parameters [n,N_iteration,beta_min,beta_max,pCR]
  3. % n为种群规模,N_iteration为迭代次数
  4. % beta_min 缩放因子下界 Lower Bound of Scaling Factor
  5. % beta_max=0.8; % 缩放因子上界 Upper Bound of Scaling Factor
  6. % pCR 交叉概率 Crossover Probability
  7. % 要求输入数据为列向量(矩阵)

  8. %% 测试参数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  9. % % 清空环境
  10. % clc
  11. % clear
  12. % close all
  13. % format compact
  14. % para=[30,200,0.2,0.8,0.2];
  15. % % 数据准备
  16. % load Shanghai
  17. % shanghai_ori=num';
  18. % clear num
  19. % [imfs_num,cols]=size(shanghai_ori);
  20. % train_size=150;
  21. % test_size=cols-train_size;
  22. % tag=3; % 设定滞后期数
  23. % train_input=cell(1,imfs_num); % 训练输入集
  24. % test_input=cell(1,imfs_num); % 测试输入集
  25. % train_output=ones(imfs_num,train_size-tag); % 训练输出集
  26. % test_output=ones(imfs_num,test_size-tag); % 测试输出集
  27. % for imfs_index=1:imfs_num
  28. %     for tag_index=1:tag
  29. %         train_input{imfs_index}(tag_index,:)=shanghai_ori(imfs_index,tag_index:train_size-tag-1+tag_index);
  30. %         train_output(imfs_index,:)=shanghai_ori(imfs_index,tag+1:train_size);
  31. %         test_input{imfs_index}(tag_index,:)=shanghai_ori(imfs_index,train_size+tag_index:end-tag-1+tag_index);
  32. %         test_output(imfs_index,:)=shanghai_ori(imfs_index,train_size+tag+1:end);
  33. %     end
  34. % end
  35. % input_train=[train_input{1,1}]';
  36. % output_train=train_output';
  37. % input_test=[test_input{1,1}]';
  38. % output_test=test_output';
  39. %%% 测试参数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  40. %% 数据归一化
  41. [input_train,rule1]=mapminmax(input_train');
  42. [output_train,rule2]=mapminmax(output_train');
  43. input_test=mapminmax('apply',input_test',rule1);
  44. output_test=mapminmax('apply',output_test',rule2);
  45. input_train=input_train';
  46. output_train=output_train';
  47. input_test=input_test';
  48. output_test=output_test';
  49. %% 利用差分进化(DE)算法选择最佳的SVR参数
  50. nPop=para(1); % 种群规模 Population Size
  51. MaxIt=para(2); % 最大迭代次数Maximum Number of Iterations
  52. nVar=2; % 自变量维数,此例需要优化两个参数c和g Number of Decision Variables
  53. VarSize=[1,nVar]; % 决策变量矩阵大小 Decision Variables Matrix Size
  54. beta_min=para(3); % 缩放因子下界 Lower Bound of Scaling Factor
  55. beta_max=para(4); % 缩放因子上界 Upper Bound of Scaling Factor
  56. pCR=para(5); %  交叉概率 Crossover Probability
  57. lb=[0.01,0.01]; % 参数取值下界
  58. ub=[100,100]; % 参数取值上界
  59. %% 初始化 Initialization
  60. empty_individual.Position=[]; % 种群初始化
  61. empty_individual.Cost=[]; % 种群目标函数值初始化
  62. BestSol.Cost=inf; % 最优值初始化
  63. pop=repmat(empty_individual,nPop,1); % 将保存种群信息的结构体扩展为结构体矩阵,行数等于种群大小
  64. for i=1:nPop % 遍历每个个体
  65.     pop(i).Position=init_individual(lb,ub,nVar,1); % 随机初始化个体   
  66.     pop(i).Cost=fobj(pop(i).Position,input_train,output_train,input_test,output_test); % 计算个体目标函数值
  67.     if pop(i).Cost<BestSol.Cost % 如果个体目标函数值优于当前最优值
  68.         BestSol=pop(i); % 更新最优值
  69.     end   
  70. end
  71. BestCost=zeros(MaxIt,1); % 初始化迭代最优值
  72. %% 主循环 DE Main Loop
  73. for it=1:MaxIt
  74.     for i=1:nPop % 遍历每个个体
  75.         x=pop(i).Position; % 提取个体位置
  76.         % 随机选择三个个体以备变异使用
  77.         A=randperm(nPop); % 个体顺序重新随机排列
  78.         A(A==i)=[]; % 当前个体所排位置腾空(产生变异中间体时当前个体不参与)
  79.         a=A(1);
  80.         b=A(2);
  81.         c=A(3);
  82.         % 变异操作 Mutation
  83.         beta=unifrnd(beta_min,beta_max,VarSize); % 随机产生缩放因子
  84.         y=pop(a).Position+beta.*(pop(b).Position-pop(c).Position); % 产生中间体
  85.         % 防止中间体越界
  86.         y=max(y,lb);
  87.         y=min(y,ub);
  88.         % 交叉操作 Crossover
  89.         z=zeros(size(x)); % 初始化一个新个体
  90.         j0=randi([1,numel(x)]); % 产生一个伪随机数,即选取待交换维度编号???
  91.         for j=1:numel(x) % 遍历每个维度
  92.             if j==j0 || rand<=pCR % 如果当前维度是待交换维度或者随机概率小于交叉概率
  93.                 z(j)=y(j); % 新个体当前维度值等于中间体对应维度值
  94.             else
  95.                 z(j)=x(j); % 新个体当前维度值等于当前个体对应维度值
  96.             end
  97.         end
  98.         NewSol.Position=z; % 交叉操作之后得到新个体
  99.         NewSol.Cost=fobj(NewSol.Position,input_train,output_train,input_test,output_test); % 新个体目标函数值
  100.         if NewSol.Cost<pop(i).Cost % 如果新个体优于当前个体
  101.             pop(i)=NewSol; % 更新当前个体
  102.             if pop(i).Cost<BestSol.Cost % 如果当前个体(更新后的)优于最优个体
  103.                BestSol=pop(i); % 更新最优个体
  104.             end
  105.         end
  106.     end   
  107.     % 保存当前迭代最优个体函数值 Update Best Cost
  108.     BestCost(it)=BestSol.Cost;  
  109. end
  110. bestc=BestSol.Position(1,1);
  111. bestg=BestSol.Position(1,2);
  112. %% 图示寻优过程
  113. plot(BestCost);
  114. xlabel('Iteration');
  115. ylabel('Best Val');
  116. grid on;
  117. %% 利用回归预测分析最佳的参数进行SVM网络训练
  118. cmd_cs_svr=['-s 3 -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];
  119. model_cs_svr=svmtrain(output_train,input_train,cmd_cs_svr); % SVM模型训练
  120. %% SVM网络回归预测
  121. [output_test_pre,~]=svmpredict(output_test,input_test,model_cs_svr); % SVM模型预测及其精度
  122. test_pre=mapminmax('reverse',output_test_pre',rule2);
  123. test_pre = test_pre';[/color]
复制代码

  1. [color=darkgreen]%% SVR_fitness -- objective function
  2. function fitness=fobj(cv,input_train,output_train,input_test,output_test)
  3. % cv为长度为2的横向量,即SVR中参数c和v的值

  4. cmd = ['-s 3 -t 2',' -c ',num2str(cv(1)),' -g ',num2str(cv(2))];
  5. model=svmtrain(output_train,input_train,cmd); % SVM模型训练
  6. [~,accuracy]=svmpredict(output_test,input_test,model); % SVM模型预测及其精度
  7. fitness=accuracy; % 以平均均方误差MSE作为优化的目标函数值[/color]
复制代码

  1. [/color]
  2. [color=darkgreen]function x=init_individual(xlb,xub,dim,sizepop)[/color]
  3. [color=darkgreen]% 参数初始化函数
  4. % lb:参数下界,行向量
  5. % ub:参数上界,行向量
  6. % dim:参数维度
  7. % sizepop 种群规模
  8. % x:返回sizepop*size(lb,2)的参数矩阵
  9. xRange=repmat((xub-xlb),[sizepop,1]);
  10. xLower=repmat(xlb,[sizepop,1]);
  11. x=rand(sizepop,dim).*xRange+xLower;[/color]
复制代码




de-svm.rar

4.84 KB, 下载次数: 34

新手

5 麦片

财富积分


050


1

主题

5

帖子

0

最佳答案
 楼主| 发表于 2018-9-27 22:11:25 | 显示全部楼层
求各位大佬帮忙呀

新手

10 麦片

财富积分


050


0

主题

1

帖子

0

最佳答案
发表于 2019-1-22 16:41:01 | 显示全部楼层
那个SVMPredict差一个参数[output_test_pre,~,~]=svmpredict(output_test,input_test,model_cs_svr);

新手

5 麦片

财富积分


050


0

主题

5

帖子

0

最佳答案
发表于 2019-5-21 13:00:49 | 显示全部楼层
楼主你好,请问您的这个,问题找到了吗?

新手

5 麦片

财富积分


050


0

主题

5

帖子

0

最佳答案
发表于 2019-5-21 14:02:17 | 显示全部楼层
榴殇 发表于 2019-1-22 16:41
那个SVMPredict差一个参数[output_test_pre,~,~]=svmpredict(output_test,input_test,model_cs_svr); ...

你好,这样改了之后好像还是有问题,系统提示svmtrain这个地方出错了,能帮忙看一下吗?谢谢!

新手

5 麦片

财富积分


050


1

主题

3

帖子

0

最佳答案
发表于 2019-9-29 16:03:53 | 显示全部楼层
引用了不存在的字段 'Position'。

出错 my_DE_SVR (line 112)
bestc=BestSol.Position(1,1);
这个是什么问题啊

新手

5 麦片

财富积分


050


0

主题

1

帖子

0

最佳答案
发表于 7 天前 | 显示全部楼层
wx_ht3LJ771 发表于 2019-9-29 16:03
引用了不存在的字段 'Position'。

出错 my_DE_SVR (line 112)

你好,问题得到解决了吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表