[已答复] MATLAB 使用PSO优化LSSVM的程序

[复制链接]
brahman 发表于 2012-11-16 15:31:48
  1. %% 清空环境
  2. clc
  3. clear

  4. %%导入训练数据和测试数据
  5. train = [3000 0.176 0.2 0.2 113.04;6000 0.181 0.2 0.2 226.08;9000 0.186 0.2 0.2 339.12;12000 0.193 0.2 0.2 452.16;
  6. 15000 0.198 0.2 0.2 565.2;18000 0.202 0.2 0.2 678.24;21000 0.208 0.2 0.2 791.28;24000 0.216 0.2 0.2 904.32;
  7. 22000 0.05 0.2 0.05 828.96;22000 0.15 0.2 0.15 828.96;22000 0.1 0.2 0.1 828.6 ;22000 0.2 0.2 0.2 828.96;
  8. 22000 0.25 0.2 0.25 828.96;22000 0.3 0.2 0.3 828.96;22000 0.35 0.2 0.35 828.96;22000 0.4 0.2 0.4 828.96;
  9. 22000 0.45 0.2 0.45 828.96];
  10. train_out = [5.387 2.824 3.414 3.051 2.515 3.312 3.084 4.137 1.519 1.284 2.413 2.012 1.815 2.512 2.914 3.224 5.671];
  11. test = [4500 0.179 0.2 0.2 169.56;7500 0.184 0.2 0.2 282.6;10500 0.189 0.2 0.2 395.64;13500 0.195 0.2 0.2 508.68;
  12. 16500 0.2 0.2 0.2 621.72;19500 0.205 0.2 0.2 734.76; 22500 0.212 0.2 0.2 847.8];
  13. test_out = [3.8237 2.9526 3.3824 2.8132 2.1938 2.816 3.0887];

  14. %%数据归一化
  15. %%归一化方法1(利用libsvm工具箱函数归一化)
  16. [train_data,test_data]=scaleForSVM(train,test,0,1)
  17. [train_result,test_result,pstrain1]=scaleForSVM(train_out',test_out',0,1)

  18. %%归一化方法2(利用svm自带mapminmax函数归一化)
  19. %[train_data ,pstrain0] = mapminmax(train',0,1);
  20. %[test_data] = mapminmax('apply',test',pstrain0);
  21. %[train_result,pstrain1] = mapminmax(train_out,0,1);
  22. %[test_result] = mapminmax('apply',test_out,pstrain1);

  23. %train_data = train_data'
  24. %train_result=train_result'
  25. %test_data = test_data'


  26. %% 参数初始化

  27. %粒子群算法中的两个参数
  28. c1 = 1.5; % c1 belongs to [0,2] c1:初始为1.5,pso参数局部搜索能力
  29. c2 = 1.7; % c2 belongs to [0,2] c2:初始为1.7,pso参数全局搜索能力

  30. maxgen=300; % 进化次数
  31. sizepop=30; % 种群规模

  32. popcmax=10^(3);% popcmax:初始为1000,SVM 参数c的变化的最大值.
  33. popcmin=10^(-1);% popcmin:初始为0.1,SVM 参数c的变化的最小值.
  34. popgmax=10^(2);% popgmax:初始为1000,SVM 参数g的变化的最大值
  35. popgmin=10^(-2);% popgmin:初始为0.01,SVM 参数c的变化的最小值.
  36. k = 0.5; % k belongs to [0.1,1.0];
  37. Vcmax = k*popcmax;%参数 c 迭代速度最大值
  38. Vcmin = -Vcmax ;
  39. Vgmax = k*popgmax;%参数 g 迭代速度最大值
  40. Vgmin = -Vgmax ;

  41. eps = 10^(-8);

  42. %%定义lssvm相关参数
  43. type='f';
  44. kernel = 'RBF_kernel';
  45. proprecess='proprecess';
  46. %% 产生初始粒子和速度
  47. for i=1:sizepop

  48. % 随机产生种群
  49. pop(i,1) = (popcmax-popcmin)*rand(1,1)+popcmin ; % 初始种群
  50. pop(i,2) = (popgmax-popgmin)*rand(1,1)+popgmin;
  51. V(i,1)=Vcmax*rands(1,1); % 初始化速度
  52. V(i,2)=Vgmax*rands(1,1);

  53. % 计算初始适应度
  54. gam=pop(i,1)
  55. sig2=pop(i,2)
  56. model=initlssvm(train_data,train_result,type,gam,sig2,kernel,proprecess);
  57. model=trainlssvm(model);
  58. %求出训练集和测试集的预测值
  59. [train_predict_y,zt,model]=simlssvm(model,train_data);
  60. [test_predict_y,zt,model]=simlssvm(model,test_data);
  61. %预测数据反归一化
  62. train_predict=mapminmax('reverse',train_predict_y',pstrain1)%训练集预测值
  63. test_predict=mapminmax('reverse',test_predict_y',pstrain1) %测试集预测值
  64. %计算均方差
  65. trainmse=sum((train_predict-train_out).^2)/length(train_result)
  66. testmse=sum((test_predict-test_out).^2)/length(test_result)
  67. fitness(i)=testmse %以测试集的预测值计算的均方差为适应度值
  68. end

  69. % 找极值和极值点
  70. [global_fitness bestindex]=min(fitness); % 全局极值
  71. local_fitness=fitness; % 个体极值初始化

  72. global_x=pop(bestindex,:); % 全局极值点
  73. local_x=pop; % 个体极值点初始化

  74. % 每一代种群的平均适应度
  75. avgfitness_gen = zeros(1,maxgen);

  76. tic

  77. %% 迭代寻优
  78. for i=1:maxgen

  79. for j=1:sizepop

  80. %速度更新
  81. wV = 1; % wV best belongs to [0.8,1.2]为速率更新公式中速度前面的弹性系数
  82. V(j,:) = wV*V(j,:) + c1*rand*(local_x(j,:) - pop(j,:)) + c2*rand*(global_x - pop(j,:));
  83. if V(j,1) > Vcmax %以下几个不等式是为了限定速度在最大最小之间
  84. V(j,1) = Vcmax;
  85. end
  86. if V(j,1) < Vcmin
  87. V(j,1) = Vcmin;
  88. end
  89. if V(j,2) > Vgmax
  90. V(j,2) = Vgmax;
  91. end
  92. if V(j,2) < Vgmin
  93. V(j,2) = Vgmin; %以上几个不等式是为了限定速度在最大最小之间
  94. end

  95. %种群更新
  96. wP = 1; % wP:初始为1,种群更新公式中速度前面的弹性系数
  97. pop(j,:)=pop(j,:)+wP*V(j,:);
  98. if pop(j,1) > popcmax %以下几个不等式是为了限定 c 在最大最小之间
  99. pop(j,1) = popcmax;
  100. end
  101. if pop(j,1) < popcmin
  102. pop(j,1) = popcmin;
  103. end
  104. if pop(j,2) > popgmax %以下几个不等式是为了限定 g 在最大最小之间
  105. pop(j,2) = popgmax;
  106. end
  107. if pop(j,2) < popgmin
  108. pop(j,2) = popgmin;
  109. end

  110. % 自适应粒子变异
  111. if rand>0.5
  112. k=ceil(2*rand);%ceil 是向离它最近的大整数圆整

  113. if k == 1
  114. pop(j,k) = (20-1)*rand+1;
  115. end
  116. if k == 2
  117. pop(j,k) = (popgmax-popgmin)*rand+popgmin;
  118. end


  119. %%新粒子适应度值
  120. gam=pop(j,1)
  121. sig2=pop(j,2)
  122. model=initlssvm(train_data,train_result,type,gam,sig2,kernel,proprecess)
  123. model=trainlssvm(model)
  124. %求出训练集和测试集的预测值
  125. [train_predict_y,zt,model]=simlssvm(model,train_data)
  126. [test_predict_y,zt,model]=simlssvm(model,test_data)
  127. %预测数据反归一化
  128. train_predict=mapminmax('reverse',train_predict_y',pstrain1)%训练集预测值
  129. test_predict=mapminmax('reverse',test_predict_y',pstrain1) %测试集预测值
  130. %计算均方差
  131. trainmse=sum((train_predict-train_out).^2)/length(train_result)
  132. testmse=sum((test_predict-test_out).^2)/length(test_result)
  133. fitness(j)=testmse
  134. end

  135. %个体最优更新
  136. if fitness(j) < local_fitness(j)
  137. local_x(j,:) = pop(j,:);
  138. local_fitness(j) = fitness(j);
  139. end

  140. if fitness(j) == local_fitness(j) && pop(j,1) < local_x(j,1)
  141. local_x(j,:) = pop(j,:);
  142. local_fitness(j) = fitness(j);
  143. end

  144. %群体最优更新
  145. if fitness(j) < global_fitness
  146. global_x = pop(j,:);
  147. global_fitness = fitness(j);
  148. end

  149. if abs( fitness(j)-global_fitness )<=eps && pop(j,1) < global_x(1)
  150. global_x = pop(j,:);
  151. global_fitness = fitness(j);
  152. end
  153. end
  154. fit_gen(i)=global_fitness;
  155. avgfitness_gen(i) = sum(fitness)/sizepop;

  156. end

  157. toc

  158. %% 结果分析
  159. plot(fit_gen,'LineWidth',5);
  160. title(['适应度曲线','(参数c1=',num2str(c1),',c2=',num2str(c2),',终止代数=',num2str(maxgen),')'],'FontSize',13);
  161. xlabel('进化代数');ylabel('适应度');

  162. bestc = global_x(1)
  163. bestg = global_x(2)

  164. gam=bestc
  165. sig2=bestg
  166. model=initlssvm(train_data,train_result,type,gam,sig2,kernel,proprecess)
  167. model=trainlssvm(model)
  168. %求出训练集和测试集的预测值
  169. [train_predict_y,zt,model]=simlssvm(model,train_data)
  170. [test_predict_y,zt,model]=simlssvm(model,test_data)
  171. %预测数据反归一化
  172. train_predict=mapminmax('reverse',train_predict_y',pstrain1)
  173. test_predict=mapminmax('reverse',test_predict_y',pstrain1)
  174. %计算均方差
  175. trainmse=sum((train_predict-train_out).^2)/length(train_result)
  176. testmse=sum((test_predict-test_out).^2)/length(test_result)
  177. besttestmse=testmse
复制代码
通过pso获得的c g 进行建模得到的测试集mse=0.0856,(可能每一次运行数据不一样 但是好像差不多)
为什么不如我自己尝试的c=500,g=0.45 精度高下面是c=500  g=0.45 的lssvm程序
  1. %% 该代码为基于lssvm的预测算法
  2. %% 清空环境变量
  3. clc
  4. close all
  5. clear

  6. %%%% 训练数据预测数据提取及归一化
  7. load data0.mat

  8. %归一化
  9. [train_x,trps]=mapminmax(train_data',0,1)
  10. [test_x]=mapminmax('apply',test_data',trps)

  11. [train_y,tr1ps]=mapminmax(train_result',0,1)
  12. train_x=train_x'
  13. train_y=train_y'
  14. test_x=test_x'
  15. bestmse=0.1
  16. %%建立lssvm模型
  17. type='f'
  18. gam=500
  19. sig2=0.45
  20. kernel = 'RBF_kernel'
  21. proprecess='proprecess'
  22. model=initlssvm(train_x,train_y,type,gam,sig2,kernel,proprecess)
  23. model=trainlssvm(model)
  24. %%求出训练集和测试集的预测值
  25. [train_predict_y,zt,model]=simlssvm(model,train_x)
  26. [test_predict_y,zt,model]=simlssvm(model,test_x)
  27. %%预测数据反归一化
  28. train_predict=mapminmax('reverse',train_predict_y,tr1ps)
  29. test_predict=mapminmax('reverse',test_predict_y,tr1ps)
  30. %%计算均方差
  31. trainmse=sum((train_predict-train_result).^2)/length(train_result)
  32. testmse=sum((test_predict-test_result).^2)/length(test_result)
复制代码

29 条回复


edisonbaby 发表于 2012-11-25 20:55:09
提示: 作者被禁止或删除 内容自动屏蔽

brahman 发表于 2012-12-10 10:24:37
本帖最后由 brahman 于 2012-12-10 10:34 编辑
edisonbaby 发表于 2012-11-25 20:55
PSO优化的时候,你最好加入交叉算法,cross-validate,这样精度可能会高一些


谢谢了 我再试试。但是lssvm中的交叉验证时用哪个命令得到的?trainlssvm、还是tunelssvm?能不能把命令写一下

小岛 发表于 2013-5-6 08:17:38
超隔离啊  楼主

brahman 发表于 2013-5-6 09:46:51
小岛 发表于 2013-5-6 08:17
超隔离啊  楼主

什么意思:)

ciwei1988 发表于 2013-5-19 12:44:32
edisonbaby 发表于 2012-11-25 20:55
PSO优化的时候,你最好加入交叉算法,cross-validate,这样精度可能会高一些

你好 具体怎么加入交叉验证呢  麻烦你了

dingdangmao616 发表于 2013-5-31 16:51:17
brahman 发表于 2012-12-10 10:24
谢谢了 我再试试。但是lssvm中的交叉验证时用哪个命令得到的?trainlssvm、还是tunelssvm?能不能把命令 ...

大侠,能不能给我你的联系方式?有问题想请教一下~~~十分感激

myglock 发表于 2014-3-2 21:10:50
楼主,我是一小菜鸟,请问下关于不等式约束问题在程序中如何解决呢

hust767967540 发表于 2014-3-22 16:42:51
提示: 作者被禁止或删除 内容自动屏蔽

wadesun3 发表于 2014-4-22 19:46:42
为什么你的粒子数为30?

七号的日子 发表于 2014-6-28 18:32:52
您好,为什么你的程序在我电脑上matlab里面运行不了啊?提示函数出现错误?是不是matlab运行lssvm时需要下载什么附件啊?

trueJQ2010 发表于 2014-9-26 15:44:24
同学问一下,你的交叉算法加了吗?怎么加的啊,我想学习一下

meaw 发表于 2015-1-6 13:29:25
请教,pstrain1没有定义,能作为mapminmax的输入参数吗?正在处理一个类似的程序,运行时总是报错,说pstrain1没有定义……

xiaoyuzhouing 发表于 2015-3-23 10:42:55
楼主您好,请问您加交叉算法了不?能否给我共享一下,非常感谢!另外您可否分享一下如何对参数进行调优?

annaries 发表于 2015-3-26 10:12:34
厉害,不明觉厉啊,我是新手

小梨子 发表于 2015-8-24 10:08:50
brahman 发表于 2012-12-10 10:24
谢谢了 我再试试。但是lssvm中的交叉验证时用哪个命令得到的?trainlssvm、还是tunelssvm?能不能把命令 ...

tunelssvm,这个用于确定调整参数

糊涂仙 发表于 2016-3-4 17:06:58
这个程序没有问题吗?出错 psolssvm (line 18)
[train_data,test_data]=scaleForSVM(train,test,0,1)是什么原因啊

赵美珍 发表于 2016-3-9 14:43:09
您好,我是用最小二乘支持向量机做需求预测,用改进粒子群做参数优化,但程序出现了问题,麻烦帮看看!
未定义与 'char' 类型的输入参数相对应的函数 'Kernel'。

出错 Untitled2 (line 58)
Kernel parameter 'sig2' needs to be a (array of) reals or the empty matrix.
未定义函数或变量 'pstrain1'。
出错 Untitled2 (line 271)
train_predict=mapminmax('reverse',train_predict_y,pstrain1)%训练集预测值

caokang 发表于 2016-3-14 22:16:45
楼主您好,请问一下,你的适应度函数是用的预测集的均方差值,但是在实际运用的过程中是不知道测试机的标签值得,请问您怎么解决这个问题的?

baqixiaoying 发表于 2016-11-30 18:05:45
糊涂仙 发表于 2016-3-4 17:06
这个程序没有问题吗?出错 psolssvm (line 18)
[train_data,test_data]=scaleForSVM(train,test,0,1)是什么 ...

因为你的matlab中没有scalForSVM函数

yaohong311 发表于 2016-12-15 20:58:45
hust767967540 发表于 2014-3-22 16:42
改进PSO 、GSA优化的lssvm参数代码,用来做预测,亲手写的代码。写个代码不容易,非诚勿扰,童嫂无欺,有意 ...

傻逼 ,打广告来错地方了,这是交流平台,你他妈缺钱买屎吃啊

cymaxim 发表于 2017-2-15 11:16:25
楼主,小弟现在遇到了和你同样的问题,请问你的问题解决了吗?这个交叉验证应该放在在哪里,具体的语句又是怎么写的呢?还望不吝赐教!

justin0626 发表于 2017-3-12 22:28:00
借楼问一句 按照楼主的程序 试了一下 为什么我的会有报错Undefined function or variable 'initlssvm'. 我有安装的libsvm工具包啊 求楼主和各位大神解答啊 万分感谢  有偿也行啊:Q

yaoxinruzhishui 发表于 2017-3-26 22:22:06
本帖最后由 yaoxinruzhishui 于 2017-3-26 22:23 编辑

if rand>0.5
k=ceil(2*rand);%ceil 是向离它最近的大整数圆整

if k == 1
pop(j,k) = (20-1)*rand+1;
end
if k == 2
pop(j,k) = (popgmax-popgmin)*rand+popgmin;
end
这个程序中rand大于0.5,那k一定是2啊,这段程序的作用是什么啊,求解

CrocodileFlying 发表于 2017-7-19 14:21:03
老师您好,您能把“initlssvm.m"文件给学生分享一下吗?想学习一下,谢谢您
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表