找回密码
 注册
关于网站域名变更的通知
查看: 631|回复: 4
打印 上一主题 下一主题

我在做PSO优化BP时,出现索引超出矩阵维度,请指教

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-7-6 13:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
用matlab进行PSO优化BP时,出现了下面的错误,求帮忙!
1 _6 ]; i8 z+ a% T: \& t9 [下面是程序运行出错结果:
* [/ e2 _+ x2 d* i* O  ^+ s索引超出矩阵维度。0 s. [  K* Y; {

) @* f3 v5 ~/ q- ~2 f1 h
( r9 y$ [! Q$ l4 \出错 fun (line 13)& g( a+ ?* S0 h$ ], f$ S
w1=x(1:inputnum*hiddennum);
7 p; A4 {/ a' ^. V6 S) E; b
9 j+ Z3 P" t9 E3 _
6 o8 F, I6 b/ Z$ k9 I) y- v出错 PSO (line 43)
- {1 |5 X7 |4 @( c* V' w    fitness(i)=fun(pop(i,,inputnum,hiddennum,outputnum,net,inputn,outputn);) q6 A  Y' r, n" N, J& ?
: w7 v3 W( }! b, T  c5 T7 e
  O  t$ F& G7 I5 V0 _, J. `

; C; n$ h. k. K, ~8 a; Lfun函数:
- a' n  I: ^3 f( F1 jfunction error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)" v/ [8 y+ Y9 ^; x
%该函数用来计算适应度值
7 Q! c/ M/ t/ d* B%x          input     个体! V; V4 x* Y* Z  n3 S
%inputnum   input     输入层节点数
* t+ f) }; X! P7 S4 ~+ T; F%outputnum  input     隐含层节点数7 f1 ]2 a  C0 W5 g0 n% M
%net        input     网络
1 W7 v$ H+ e' m& C/ D9 w%inputn     input     训练输入数据
4 G9 \' C4 ~2 p%outputn    input     训练输出数据
3 u! Z' \* i. A
- ?6 o& m$ U3 Y- ^& H" ?%error      output    个体适应度值
3 Z  L1 R7 A& s( R6 N8 N% p
6 B! ?+ [# i6 F) H%提取' |0 H' C0 Y! X
w1=x(1:inputnum*hiddennum);  这是出错的13行
3 u0 _: \0 S  e2 K( _$ r6 RB1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
- n/ e% e" K  t7 O- Y! Mw2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);2 a: k  a3 n7 C. a! B- }6 k
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);8 e7 G8 Z0 W0 P& a- J

$ K* l# j5 ?: U9 ~2 i& d
5 J/ Q( P2 S% T$ C4 {' B%网络进化参数
  x9 o% V" L' inet.trainParam.epochs=1000;
; [7 L0 i' [+ T6 S% l* ^5 z. Vnet.trainParam.lr=0.1;% U) q. J+ E6 f" d4 d! m) C
net.trainParam.goal=0.00001;2 q2 x; F( s. X
net.trainParam.show=100;
8 y' ?5 e3 q. Z: w9 T+ xnet.trainParam.showWindow=0;1 o4 L+ H$ g( W% N: J. I

, P# r6 u2 i! r- D  e%网络权值赋值; V, R$ K' O! F  X( D
net.iw{1,1}=reshape(w1,hiddennum,inputnum);6 l' l( E, ~% b
net.lw{2,1}=reshape(w2,outputnum,hiddennum);+ L3 d) w+ y" Q7 U" R. @
net.b{1}=reshape(B1,hiddennum,1);" g' ]; W5 N; E! Q
net.b{2}=B2;
) K, g& \4 ]' E4 [% v# v8 |# s( n( `4 g
%网络训练
, [. J6 ]4 d! p4 _net=train(net,inputn,outputn);* N6 ~1 V8 T/ h( \

$ \( o: r5 p% N1 @  Nan=sim(net,inputn);
) Z$ V1 U5 P* f; z8 N* q
5 b) y( g/ R3 Z: y- l  cerror=sum(abs(an-outputn));3 g7 N; u6 H! s7 ?
' p; o2 x) Z- ^. i+ Z- |( k
主函数:
& Q5 ?* f4 }5 L6 U" n- @0 |%% 清空环境
' g, a* g8 X$ p  nclc
% H2 |7 M& _% ?* m" Kclear* I% I: o5 S& [

1 c, }! R' n7 S* @

1 ^  @4 c% z4 B% W0 e%读取数据6 H% r- B5 G/ f, s
load input% U0 Z7 s1 w3 ^3 Y. t$ {& T$ R* R
load output
  |) I( u5 U8 T2 m8 w8 Q- W' W, D1 J8 ^% Y* b5 P  y
# @% p& k- G! F) l9 J2 v' i
%节点个数
' p5 P" n7 ?* K/ e/ hinputnum=34;
/ T  Q$ b$ s  n. U/ Xhiddennum=7;
9 V5 e9 Z, t4 y, H4 o; toutputnum=2;
- ^5 j5 @+ t/ A
) T5 U4 w7 p3 l8 B8 A

* ]2 y2 K, i, y' P: g2 T%训练数据和预测数据
/ y7 U5 F; w9 d  dinput_train=input(1:800,';: K8 n, B$ ^2 y$ N
input_test=input(801:1000,';
8 x& |/ x0 r- p/ V' Toutput_train=output(1:800)';/ t1 T% n/ i2 `0 V
output_test=output(801:1000)';- [/ _, U+ }7 S: r# s
2 t+ Q9 T( v" n

1 ]2 |3 D) p- c0 r%选连样本输入输出数据归一化6 G# j. [; X9 t/ q$ h
[inputn,inputps]=mapminmax(input_train);& E/ [4 H7 y5 b$ v
[outputn,outputps]=mapminmax(output_train);( k0 e8 y/ C) f9 B2 x& F

5 m! P3 {  T8 ^2 S2 w5 v( ?
2 K. k; g8 O7 r0 n+ ~% j
%构建网络3 l$ b" }, {4 n  A) o
net=newff(inputn,outputn,hiddennum);$ C! ]& M) ?* e4 o& m6 c

4 w8 |0 F2 L2 V+ X

3 s& ]# P0 j# O, l4 a& W* a% 参数初始化9 z. k( H* Y; i: |7 m% K
%粒子群算法中的两个参数2 t! r& h/ ~0 z) W$ X5 `3 Z
c1 = 1.49445;
: r' q  d7 A  W3 zc2 = 1.49445;
* Q+ U% l" v% u8 F
. v4 S+ d7 ~: N

, b9 v3 q/ l+ ^maxgen=100;   % 进化次数  
2 \4 Y8 }$ i7 J3 K8 xsizepop=20;   %种群规模$ P& ~# ]* @) X: B' }, W

. M* N1 X" p$ g3 j3 J

/ a. Y+ n1 K- m, L2 w+ a6 xVmax=1;! X  P" A( {( D0 i' L* M) O0 g* y
Vmin=-1;
' u; H( p  f+ U% C# L* mpopmax=5;
- r& i" P9 W9 P+ o* Y. epopmin=-5;* N6 i( F4 S1 X; Q! j
$ l5 @$ N. a. Q' }* |  L8 x
( B0 B0 b7 h3 G4 ^1 D5 `  l6 e
for i=1:sizepop
# @7 Q/ D  ^& P: M; y" v8 H    pop(i,:)=5*rands(1,21);
8 a9 y/ I& p5 e+ K# t1 K    V(i,:)=rands(1,21);4 g! f3 t* ?0 W
    fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn);  这是出错的43行
+ H; d7 _/ k& y$ `- t& A! B: Dend/ ?2 F( }0 y# t

% w. A2 n( a) K, A0 f' f# N# G# @* Q7 m

1 j% l" n1 B) n# q* l& [. }& X
' K4 U, y6 Z4 {$ G2 H( Q! O

4 ?7 @9 l; M& @% 个体极值和群体极值
2 G1 P+ v2 k) w7 M- s5 ~, H' p7 q[bestfitness bestindex]=min(fitness);. n4 W9 M; I  i3 p0 B
zbest=pop(bestindex,:);   %全局最佳% {! D+ f( R5 E5 o5 G
gbest=pop;    %个体最佳
* c+ o6 |# X' x5 Y, ^+ Rfitnessgbest=fitness;   %个体最佳适应度值8 t8 B- Y% B8 ^2 ~$ F
fitnesszbest=bestfitness;   %全局最佳适应度值) p' r7 _; V, u2 e

& O; \! K9 E$ z/ }( T5 q

, u0 u4 p7 `; t7 d% a%% 迭代寻优6 Q# _8 M4 y% V. F% h
for i=1:maxgen
9 [. x, Q7 `% @. W    i;
4 b( `1 ]4 z* o8 X% A* e   
% D9 X) m  Y3 D4 e1 a+ |* M8 R0 r+ f    for j=1:sizepop
- R! u5 n) R, C0 h        
/ M' s* Q( \' K  N( V' ]; X; y) K        %速度更新% B% O; W; }  k$ d
        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
: T6 m' v; c0 }: ?        V(j,find(V(j,:)>Vmax))=Vmax;
& N3 N5 K0 |# G. X( J& W/ _        V(j,find(V(j,:)<Vmin))=Vmin;
3 p6 G9 r/ Q" `        : Y1 y, b3 e5 n0 M" Y
        %种群更新. l" q1 L9 A$ y+ U9 L+ j) @
        pop(j,:)=pop(j,:)+0.2*V(j,:);
- ~9 l" @1 L* r/ a  G        pop(j,find(pop(j,:)>popmax))=popmax;
! Q( d) T% _. d0 X& `        pop(j,find(pop(j,:)<popmin))=popmin;
: M: T! @! N! q$ w        * f5 A( @' O* |/ f3 I- b  M
        %自适应变异
: Q  d! O, ^2 q2 M0 N+ L0 e        pos=unidrnd(21);
4 s1 n0 w6 h, I* c        if rand>0.95: l9 i$ v! D& j/ P0 O
            pop(j,pos)=5*rands(1,1);
8 o' x8 ^/ c. ^4 Y4 a1 H2 L0 T6 X        end
' |1 h/ `: J8 x' }5 r9 V      
4 ~) U! r5 @  ]5 }( l" m! z        %适应度值
0 g$ t9 ~8 ~6 n% W5 }1 q! x        fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);
- M9 a' B# Z4 L. O/ p. _  P    end" P1 a3 k% f# \) @- D+ P( ]/ e7 V
   , G+ y9 P$ S# p% s+ F; U' w' k
    for j=1:sizepop: }* f4 T. M& f& b
    %个体最优更新
# T$ I0 M: N. C9 Y  z% G    if fitness(j) < fitnessgbest(j)
! O/ T4 Z% W# u2 L7 c' b        gbest(j,:) = pop(j,:);) A! T) h' ]+ h/ T
        fitnessgbest(j) = fitness(j);4 T* _+ I) G$ k0 Y& o4 K
    end+ k8 P) ]) {( g# r( j0 w8 _
   
" K- B: y: j! Q. N7 J' s  \    %群体最优更新
7 D" e2 K$ {5 V& X    if fitness(j) < fitnesszbest
' q! ]+ m1 o3 ~$ D        zbest = pop(j,:);
2 Z7 a- N6 Q$ W9 ]" z5 c        fitnesszbest = fitness(j);' ~6 `1 g7 }; s2 m* k" G
    end8 g  D) l0 @' _! \2 n
   
" W* e# M  a6 m/ d& I& k( {    end
3 K$ q. A8 u9 N3 i7 I, @' c/ [   
9 p9 _; l4 V% A    yy(i)=fitnesszbest;   9 s6 N$ ?9 @3 z5 z6 d4 C! P- t" O
        $ ~6 @! M9 G$ H9 Q
end6 O  b% A3 u, z
/ U6 P: c3 E2 t3 B

# h0 r% h% ]" E( n% M7 x%% 结果分析
, s1 t$ s' ?' `! xplot(yy)
6 D. ^  c1 m' Y9 {. s+ Rtitle(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
" G" h2 C! F3 P  }; Z8 j! Uxlabel('进化代数');ylabel('适应度');
" I+ A' i5 ?+ |6 T, w
, p, \$ q- i% c& m* Q7 N

+ I8 h" z# h/ v& Fx=zbest;
2 V. v5 p( i" z! T0 q- N0 P%% 把最优初始阀值权值赋予网络预测
" p5 L. ]/ R* P% %用遗传算法优化的BP网络进行值预测
1 ~" x  N/ A$ V4 F$ X% r8 s5 xw1=x(1:inputnum*hiddennum);
. r- Q1 V4 m+ PB1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
0 J" e2 G: `: P' \w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
+ U  G- h# ^' U9 E2 H. O$ rB2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
: G3 h( ]0 N5 E4 w3 f# [, g# {2 ]' j# ?) F2 i" B
1 E, f& C: e+ Q3 o1 c- J
net.iw{1,1}=reshape(w1,hiddennum,inputnum);+ _! Z/ ^, Y" ?+ V2 S1 n4 W8 C
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
/ P1 v# K# o7 s2 enet.b{1}=reshape(B1,hiddennum,1);+ W0 J* |' {2 m# v* R( |& u: H
net.b{2}=B2;
8 C, O! m- Z3 T
  c) `" r. W  W) t! y
0 C  ?9 g4 x4 {
%% BP网络训练
- |, \( N9 F, K; C) j2 O/ _%网络进化参数
5 Q/ t6 h' O0 E8 h& |5 `net.trainParam.epochs=1000;
5 M2 b2 {2 J: S5 W7 ]# Wnet.trainParam.lr=0.1;
# E" _2 a4 d1 n) p%net.trainParam.goal=0.00001;
* Z7 r2 t7 t. M& w) v$ y) ^( T; F( g
  y" Z) w6 l6 x/ R# t* W# ?* g
+ k/ \) I( K6 n
%网络训练
1 F. ~1 j* o* M$ B[net,per2]=train(net,inputn,outputn);+ u0 B% S/ ]2 U! H

, z9 B. B  S- d4 y- V

+ ^+ d# u6 q7 v3 b8 F, X%% BP网络预测
  O+ W) g% p. B9 O/ N6 c. I; o%数据归一化
5 w# e' F- X3 W, U% `+ p. q% Iinputn_test=mapminmax('apply',input_test,inputps);7 v  a. B* E* B6 a3 G, |% Q
an=sim(net,inputn_test);
( d6 j9 c0 E: Ptest_simu=mapminmax('reverse',an,outputps);
, {4 v6 Y/ ?# y$ M" K, H6 ^error=test_simu-output_test;
, D' H  O3 G6 w' ]8 Q2 I
8 b* o. K& r- D: p8 y( b; u6 f9 L

该用户从未签到

2#
发表于 2020-7-6 13:55 | 只看该作者
帮你顶一下

该用户从未签到

3#
发表于 2020-7-7 10:09 | 只看该作者
个人认为三处有误5 }/ u' r- Y+ V; e. j5 S
一、 pop(i,=5*rands(1,261);随机取值维度过小,正常维度应等于inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum/ P9 L# ]5 {- B- T7 l* V, d
二、设置标签矩阵时存在问题,output_train=output(1:800,1)';3 d0 ?" g7 y' ?, A) d
output_test=output(801:1000,1)';索引有误
; e: U, g  Y) k" U7 O# `( q三、fun函数的net.b{2}=B2;和error=sum(abs(an-outputn));两处也需修改

该用户从未签到

5#
发表于 2020-7-8 13:56 | 只看该作者
来学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-26 19:03 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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