EDA365电子论坛网

标题: 我在做PSO优化BP时,出现索引超出矩阵维度,请指教 [打印本页]

作者: zaiyiaaaa    时间: 2020-7-6 13:33
标题: 我在做PSO优化BP时,出现索引超出矩阵维度,请指教
用matlab进行PSO优化BP时,出现了下面的错误,求帮忙!
8 |- o, p$ s# l5 |, j, L: D4 M8 U. D下面是程序运行出错结果:6 `: K" f' Y+ F' v) \
索引超出矩阵维度。; H9 r& I. `: g$ T8 e* T
) \; Y$ ]4 d3 G3 {

6 p% K7 l5 w% I( ~, e+ u: L6 K7 F出错 fun (line 13), t. u+ l+ Q+ D) d
w1=x(1:inputnum*hiddennum);
" |( |' O- F) f! t6 R
5 s9 e* `, l# z8 y' j
$ o8 ?% Q5 B4 |出错 PSO (line 43)& z( R! x$ Q! Z7 m4 k: S. a
    fitness(i)=fun(pop(i,,inputnum,hiddennum,outputnum,net,inputn,outputn);& V0 D. d5 F! B: ]$ E* j# l
$ j$ m& a, L, o! L

4 V7 @! ~, o2 _0 o

! \& L$ q& D& u: |: k% hfun函数:+ H; ^0 x7 ^: `2 z5 A8 l
function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)2 h6 N/ S  Z7 x8 h# M
%该函数用来计算适应度值1 ^- j! Y* x! M5 k
%x          input     个体, q' x8 [, b; Q+ \9 ?% A0 Z( M5 M( M4 _
%inputnum   input     输入层节点数
% M& T$ c; M7 q9 |; Z# q" R%outputnum  input     隐含层节点数' o  r  W2 ?/ b* x! y; h  M8 f
%net        input     网络; G. }* n4 W* H8 F& x
%inputn     input     训练输入数据
5 K' Q& J) |: i( E%outputn    input     训练输出数据4 a- ~! \# M" e* x) O

0 f( t. R8 d" s%error      output    个体适应度值6 u1 Z& @9 O5 Q. m, j8 r: i

4 X2 F3 p/ i* B5 m# g+ ~& K4 ]%提取
+ T+ j0 w; J- ^$ x3 x3 kw1=x(1:inputnum*hiddennum);  这是出错的13行2 Z6 E# H9 E% |( i. n1 y$ h
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);( Z! ?4 W0 L: G5 p. B, D" v3 J6 R( P
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
$ P; K9 L4 n* ~0 \) i7 T/ ]7 F' ~- CB2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
4 V3 S" P+ d3 R$ Z% F1 O6 \6 z7 I. W7 {2 _& c/ E
+ D* \- X+ U: d5 w2 K; l) i
%网络进化参数
! t- f& _0 k' L1 M4 _0 U3 inet.trainParam.epochs=1000;. T5 F* |; F% S/ t" ]  `7 @
net.trainParam.lr=0.1;6 z( r) @( Q9 c( \5 k
net.trainParam.goal=0.00001;3 P6 @5 v2 m  x3 c- ?
net.trainParam.show=100;
; V: R& k. V2 i: _1 q. R4 p' L* ^net.trainParam.showWindow=0;
9 y, X. t, x- t6 \5 d! G/ N+ V. O7 K% \0 v, G5 I3 g1 Y
%网络权值赋值
1 a2 ]( m6 j) H% J6 g" _net.iw{1,1}=reshape(w1,hiddennum,inputnum);
7 d1 |2 \, r4 Z" G5 ?net.lw{2,1}=reshape(w2,outputnum,hiddennum);- ~# _( i9 I1 S' B- q0 p
net.b{1}=reshape(B1,hiddennum,1);
; [% s# Y8 f  o2 @* g% onet.b{2}=B2;
4 m' ^5 P+ |( J6 }5 a# T
  M$ {* S# O* N4 f/ x/ z%网络训练
, \& W# O4 ]; Y* tnet=train(net,inputn,outputn);5 k  }* ~' |. t( t

; H+ U& y. J4 m0 F8 Fan=sim(net,inputn);/ u0 X& z6 F9 P0 |

$ U% e) G4 a  ^2 q) j! P6 ~error=sum(abs(an-outputn));
7 Q6 Q( y8 y- U+ G
9 [( [6 n7 U# ?" q主函数:% A, _' j0 q- Q, J
%% 清空环境
4 M8 \8 O8 n+ R1 wclc
% s) ]8 ]. Z7 E. `# \clear
( W2 `; q# M& c  Z2 j. x( I
5 p, v7 T9 ?6 g/ V- }

; ]1 `' A; X% X; T%读取数据
( L1 q- C3 t- t1 a- r  J# P) qload input
9 t! b% p/ ?5 e4 J6 H" yload output  M- ?7 e/ D  V, k+ ~( O# t+ g

6 Z, s7 `% |9 k5 r1 B) l, c
0 u8 {/ S& H! \% |
%节点个数! M  D. \5 K9 {# V6 Q- `
inputnum=34;2 z6 B7 L- s5 I) l
hiddennum=7;: t) ]7 ]3 g/ e8 Q# ~* ]
outputnum=2;
3 d/ b2 @8 m9 n' o
4 O0 k" x# P  o7 t" P6 M* ]* \5 o

* A% ]; k  ?8 g, y%训练数据和预测数据) S' y% ]6 n! z6 R) G) g
input_train=input(1:800,';
0 M: D9 c/ u0 w- Finput_test=input(801:1000,';/ |& Z2 i; O7 Z4 M, {' h' l5 ^; S6 D
output_train=output(1:800)';
6 G5 J, C. c) `7 M! P+ y2 y% Eoutput_test=output(801:1000)';* Q. G$ O# r+ q, p' N

3 d2 U8 I% Z8 y# I9 W) `. C7 g
4 [: ?" _% x, j4 J. h8 E6 v; _
%选连样本输入输出数据归一化) w/ \3 Z. w! n% }
[inputn,inputps]=mapminmax(input_train);
$ g3 ~! R( C. G6 [9 o+ ?[outputn,outputps]=mapminmax(output_train);" q6 F3 J) v) p- O: Y0 ], L' w
1 t2 R. z2 ^8 l% E7 p
/ k7 G; e0 d. v& W0 v
%构建网络
0 a7 [" q. Y  inet=newff(inputn,outputn,hiddennum);
  p; ?7 K) K0 r7 e, j
' b+ n! Q5 i$ o6 q2 Y

& d) l7 l4 L& L# m6 Z% 参数初始化% ]! ~$ f7 Z  k# o8 n: K3 x
%粒子群算法中的两个参数
) R; E8 U; Q# Y1 \c1 = 1.49445;3 j* j' {# Y0 C$ M& W# M7 Q9 F
c2 = 1.49445;" @! @; U) f6 S

! q- P9 W. A0 o

. O' ?, c1 M. o. H% X6 Zmaxgen=100;   % 进化次数  
0 ~: L( V( K" ~" t* K0 G( Y2 E# m/ esizepop=20;   %种群规模
7 R, c1 k/ P; Q1 c
7 H( I0 D# u3 H( _, W$ Y
  Z/ e/ R7 m* o6 q; z- N
Vmax=1;
- m6 z. S4 Z0 y2 YVmin=-1;
/ I( ]3 f2 ]4 }" a6 e( Jpopmax=5;  q2 c- [4 m$ m
popmin=-5;
9 E6 m1 l% M" y+ B3 r; ]* c( ?% X1 s6 E
! \0 H, ~" i. P
for i=1:sizepop
1 S, W0 c+ ]: G' J$ q  V2 n    pop(i,:)=5*rands(1,21);
6 u* D, P! \. L( A, B" G5 D  J    V(i,:)=rands(1,21);* t# N0 M: J, S4 A/ o6 ?
    fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn);  这是出错的43行4 Q* }1 T! Q5 Z) K+ W% Z8 m- J1 H
end
, f! n, N# V4 y& a0 r4 Y
" N  q2 f3 L$ l3 X' O9 `1 j& b

/ L4 T/ Z/ ^' u; r" @. H3 w5 K, B9 c/ F( \$ y: A& q) X# r0 M
7 G- Z! D. V+ Q; e; v
% 个体极值和群体极值
0 w* G' X0 [" I2 f2 _" F[bestfitness bestindex]=min(fitness);
5 U" j/ S, Y+ |+ ~& R. Izbest=pop(bestindex,:);   %全局最佳. a1 C" X' h/ Z/ L4 n
gbest=pop;    %个体最佳
! V' U+ ], a0 F+ N$ c( o% R; Vfitnessgbest=fitness;   %个体最佳适应度值
  l$ b1 l3 X6 Vfitnesszbest=bestfitness;   %全局最佳适应度值
$ r6 H0 L$ z6 h/ x3 Z* S" @6 s3 k& Q! V0 g9 z. n

9 u) t, u* M4 B! s( [9 _# k4 X%% 迭代寻优- M+ A, k. I: h; V, o! O1 J
for i=1:maxgen
& S0 [4 D# q6 w    i;) p% v3 F7 ?2 |: B& D# \
   6 G4 G+ Y' g7 B8 s
    for j=1:sizepop/ E0 i7 T* d5 v) w! j
        0 e1 L! D; A. E+ S
        %速度更新5 p4 ^& @: Z0 [5 u7 }
        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));  c3 z/ u" M4 K3 W& h
        V(j,find(V(j,:)>Vmax))=Vmax;
3 F9 ^9 B; s+ n3 B( M9 v        V(j,find(V(j,:)<Vmin))=Vmin;
9 t1 J- O2 h; b: i* q        
: U) L: y+ s/ e( @4 G0 T: T3 h, j0 P        %种群更新
: s4 z! J9 ~& ?4 J6 y# x        pop(j,:)=pop(j,:)+0.2*V(j,:);, v, y, L. A% R$ ^% ^
        pop(j,find(pop(j,:)>popmax))=popmax;
* ^  n4 l+ k' K- u5 d6 z4 m        pop(j,find(pop(j,:)<popmin))=popmin;
2 d) E+ z4 ?+ M( K' `2 z8 z        
+ Y3 E! C+ l  m( O3 ?5 E        %自适应变异; F; {9 ?0 U% P
        pos=unidrnd(21);
5 J2 W: e1 V. @9 g* I        if rand>0.95. ~4 P9 Q) k- f' K, N
            pop(j,pos)=5*rands(1,1);6 A' S3 P" r1 C
        end; j, D$ n4 z2 Z, W
      
& V2 R0 w! h' M1 r        %适应度值# L- D1 B9 E5 J* Y
        fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);4 g1 y5 ~$ \* `6 X& |! `- X
    end
% z! g9 x' b, P   & g+ ~4 {# v4 D8 T. B
    for j=1:sizepop  L4 O4 ^$ e( w
    %个体最优更新
) _; s$ v1 m) g# |    if fitness(j) < fitnessgbest(j)- T% L; {9 L4 T, f
        gbest(j,:) = pop(j,:);
3 k9 r) R! _6 W% s; b        fitnessgbest(j) = fitness(j);7 ?3 U, m- S6 v  g
    end
7 \4 D2 m( \% o3 d" O; I   * V8 S7 B9 A& G2 x8 u4 e7 ?+ e
    %群体最优更新0 s: G) N; k( a
    if fitness(j) < fitnesszbest+ B! _. i2 x8 k, x6 F4 t
        zbest = pop(j,:);
6 t2 e( e* s1 A        fitnesszbest = fitness(j);2 o( F4 a) q! B
    end9 [) @5 t" q' r3 `7 P& Z
   & }' M& u  u" I* d2 Z! P; _4 V4 Q; V
    end/ G: X& a* r/ J: ?& u- j
   ( b1 ^2 o- Q! O6 @
    yy(i)=fitnesszbest;   ; ?0 \+ s- X- M! n/ k" z
        
; b1 \5 E5 |6 H( hend  b9 z6 U* V" }$ P! C  |8 L& t. t

1 G9 |3 M. Y# Y2 |  o* V0 \

+ @) p7 s0 G) N6 e1 t* ~2 \1 b! o3 u%% 结果分析
6 c; N7 n8 Z+ ?. s: y) z) ~! kplot(yy)
8 K" h5 z! Y' Utitle(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
9 e9 C2 k6 N2 C: E3 pxlabel('进化代数');ylabel('适应度');3 m, o5 y7 J& H% E) h; A
# l! }! i* p, u1 z/ H
' l. Z. m+ |; x1 s' u
x=zbest;
& p! r3 s0 L! n: h%% 把最优初始阀值权值赋予网络预测( n- {0 E4 [" {% @% Z7 u
% %用遗传算法优化的BP网络进行值预测! m1 R! \5 ~7 x$ [
w1=x(1:inputnum*hiddennum);. C# w  l+ K1 e
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);. e' ?4 x( N# @. }/ }
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);5 v, s6 E& |  G: b! g
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
8 S# {2 y, w0 @5 Z7 f# Z
  z3 f2 N+ C3 o; U: s  j% d7 E5 s

- k- L& s8 G6 N5 Znet.iw{1,1}=reshape(w1,hiddennum,inputnum);9 _5 O1 f) H( m% M
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
/ S7 R/ n% @! z$ R& x* Nnet.b{1}=reshape(B1,hiddennum,1);( H" X; z, @+ L
net.b{2}=B2;
1 Y- g. p: ^  `: {) v
  y6 ]: q& V+ g& w, ~7 l

( H! Y1 `+ m4 C- d8 X%% BP网络训练5 j: v& T; v" v% v* f- o
%网络进化参数1 a! x- @0 E, N8 S6 u
net.trainParam.epochs=1000;- e; Z, }, X1 C4 L$ f! F$ a
net.trainParam.lr=0.1;, t  t/ z6 T$ m* G
%net.trainParam.goal=0.00001;6 p0 l. j7 x$ l% ^4 v1 P) {5 h8 [

5 i3 V! p; h# V% _7 T* ^" Q
9 y1 y7 ?2 K) @4 F" C$ B5 W
%网络训练
' n2 \6 @0 `, v3 c/ C[net,per2]=train(net,inputn,outputn);
0 T% J6 G) w6 p8 w# s, Q& `
0 o0 N. F0 }5 C- G  K: l$ h/ }6 [
6 G8 H9 d; o& [4 M" U: ]' z
%% BP网络预测/ c7 a& R+ u7 d) n4 @/ u- v8 x* K
%数据归一化
! t3 O1 p* J. O  H$ p5 Q( Sinputn_test=mapminmax('apply',input_test,inputps);1 t  T( E: X" a
an=sim(net,inputn_test);
( l$ P& B: @0 j/ p; Itest_simu=mapminmax('reverse',an,outputps);5 G$ \" H2 Q" Y4 Z0 F  K
error=test_simu-output_test;. Z( ?9 L; k/ N- |
: k3 b; u# E( B/ {3 Z6 _

作者: IBB-EUT    时间: 2020-7-6 13:55
帮你顶一下
作者: shuddkk    时间: 2020-7-7 10:09
个人认为三处有误' }0 F1 b8 S$ |/ v
一、 pop(i,=5*rands(1,261);随机取值维度过小,正常维度应等于inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum) J# P2 u. ~) G! g
二、设置标签矩阵时存在问题,output_train=output(1:800,1)';
: W) N# ]# ^( i! D+ `2 G* Foutput_test=output(801:1000,1)';索引有误
6 B: Y& s( C' D9 m- z0 k: \3 u/ z三、fun函数的net.b{2}=B2;和error=sum(abs(an-outputn));两处也需修改
作者: 勇往直前11    时间: 2020-7-7 14:58
二楼正解。
作者: shuddkk    时间: 2020-7-8 13:56
来学习一下




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2