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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
用matlab进行PSO优化BP时,出现了下面的错误,求帮忙!
6 Q9 ]6 i( Y# o' u下面是程序运行出错结果:
6 \1 n. \) J7 h索引超出矩阵维度。3 \& w7 S$ A" w" Y, u% [2 i0 {3 u+ i

$ Y3 k4 j+ M1 o4 m" h1 F3 G& G' q
出错 fun (line 13)
/ v" p3 a" o# A6 n+ `. y6 Qw1=x(1:inputnum*hiddennum);9 q- H( {# |3 {" S
; G7 s8 Q/ X; S1 {

" d) Z9 F3 E% U# `2 ~) w: S: ?出错 PSO (line 43)' V  B& m  G- c  W. \
    fitness(i)=fun(pop(i,,inputnum,hiddennum,outputnum,net,inputn,outputn);
; }* m0 i( m) i7 n
/ u! x) |) ^  F! b' R3 d8 B* y2 w# S5 f2 y4 \7 Q
& t% J" \' [* g# z5 o* h& w2 x
fun函数:7 Y8 P/ ^5 {8 E' A' C) O
function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)  v9 t& U* f: m1 r8 U; G) D
%该函数用来计算适应度值
( q" x8 B' E7 S%x          input     个体3 C% o8 q) q: c3 u8 ^( I& m5 F0 C
%inputnum   input     输入层节点数/ ]4 c+ s5 Q4 J/ E! }
%outputnum  input     隐含层节点数
, q  }0 o# {! h# J" V1 o1 I  v* p! z! Q%net        input     网络/ F, Q# E  X, Q. S6 c' T6 f/ b
%inputn     input     训练输入数据, K( u( N  J7 m2 M' F
%outputn    input     训练输出数据" ?" p4 q1 a5 @3 P8 d

6 z! F# o- O- `5 X. }%error      output    个体适应度值
4 B+ a! t  P! Z) M% M; z$ ?
' M  g& k2 }  [% l%提取
( j( q% I4 G7 T  r/ ~: k& Qw1=x(1:inputnum*hiddennum);  这是出错的13行( k9 D  y4 @6 J/ g" m
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);8 `9 f+ I4 k/ a7 ]8 O# H! p' k
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);2 O! e4 H4 |- p+ k9 y8 P
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
7 p" X$ }2 u1 ^. R
8 Y0 `% x7 v9 B2 _/ ?9 Y8 v. a  U9 v9 L
%网络进化参数1 Y5 N( p+ R8 e. X' ~0 E) b
net.trainParam.epochs=1000;- [9 U) i6 N: n) t0 u5 C, |
net.trainParam.lr=0.1;- q! ]' L- s8 E# Q3 r* V/ s
net.trainParam.goal=0.00001;5 C  u( K; l; D, q" h
net.trainParam.show=100;
4 v2 E& P6 m" @9 X) P, r2 Dnet.trainParam.showWindow=0;
2 W0 Y7 ?1 |) f4 w9 h- x& f* [% A. n3 e) a! [) i
%网络权值赋值
! F# A) H" E1 |& T1 m# ~1 Hnet.iw{1,1}=reshape(w1,hiddennum,inputnum);
6 G  p& k6 {9 P) hnet.lw{2,1}=reshape(w2,outputnum,hiddennum);
, g( J3 P4 [9 a# rnet.b{1}=reshape(B1,hiddennum,1);8 x4 R5 Q* A6 C% g  }$ e% r
net.b{2}=B2;
+ l  c/ h. s* X1 K* Q$ w. _! P( c& D& O, o9 O
%网络训练; F9 ^7 G; X( r% J, w  c# |
net=train(net,inputn,outputn);
5 X1 A9 m( Z6 _9 ~1 i
' V/ b  X, T  S! o  Van=sim(net,inputn);0 I6 u. e" ]2 W! S% B: K
  _, a: v' d7 z- X) }9 f
error=sum(abs(an-outputn));
3 }/ g3 C, g$ ]$ P9 v; R2 [+ L8 y: p! [4 i  a- x+ ?" \8 Z1 {
主函数:* t# z  P% b# F/ `
%% 清空环境" I; N( S- ~/ ]. c
clc
4 Z5 C2 c' L, L1 ^+ d+ Aclear
1 _. E# }, w! h& K; q5 |, N1 m
- T7 h: y1 |8 s) A, x
%读取数据
, P2 m- C  Y9 O) }0 N: z: `8 l3 ~- i& o9 Vload input2 q! V' R- N2 d  C1 H- k/ ?
load output8 J+ b2 r2 k( @. Z) f
. M6 e9 s- G7 p5 }. ~; E
& u6 d/ ]3 d$ A  N$ _1 ^4 t/ c
%节点个数
  k% U, J2 z) O, minputnum=34;2 q5 Q2 R. |' f" f: O/ r& _
hiddennum=7;
: M1 I$ A9 V, c; y! Voutputnum=2;7 o1 N2 x$ z* ~! D, _7 K
9 e% U: Y* ?" h  v; W3 C/ i2 k

3 g( z7 M) w; f6 y  U# j+ T%训练数据和预测数据
& s7 t! \: U1 w' W0 P. iinput_train=input(1:800,';
! s0 h2 g! a, W4 v- N/ Cinput_test=input(801:1000,';
0 a( r+ A0 D5 {# T( M$ ]" S1 W9 @output_train=output(1:800)';
1 B: o& y- \: V2 a' A1 h) v  Boutput_test=output(801:1000)';
1 l2 `! `& S) T, H4 p/ N# b* m/ K# c. h9 M. a

- m2 v6 \) |& i: Z3 w%选连样本输入输出数据归一化. }5 `6 b2 B0 W0 O; y
[inputn,inputps]=mapminmax(input_train);9 N4 @/ A" M  W9 s) D+ B4 f
[outputn,outputps]=mapminmax(output_train);8 x9 J3 u8 k8 \( L1 N- |

3 s8 I) t2 M. P: n

2 z$ ]4 y- H: ^* g3 Q/ j: F0 ?, t%构建网络: `$ B* f% G/ {; j( s
net=newff(inputn,outputn,hiddennum);
0 {' R- `  p, A" h) e* R, F! m
. D' K6 s3 A/ v' W# a2 w

+ Q1 D: s1 [+ L( C% 参数初始化
- |: _* H: ~# l3 Q+ p2 t%粒子群算法中的两个参数2 @9 v. l* a4 h$ h; j
c1 = 1.49445;
/ c- f$ n+ G" jc2 = 1.49445;
3 o& e0 p# |& i8 x! N1 I) v  W
& K1 h& [' L: \, [

; |* J  ^7 u, xmaxgen=100;   % 进化次数  
& D8 i, V) W" q4 ^) w& g0 fsizepop=20;   %种群规模
2 V  L# U2 Q* ^4 P8 U4 M( q5 A1 ^' H4 \  }

1 Q2 q& k& X/ TVmax=1;
" x9 j" N1 {( x. ZVmin=-1;% V2 g% K- K8 V$ ^- l
popmax=5;+ ]3 @* H3 G& |$ ~
popmin=-5;
8 t  `" a9 A/ E, o& K9 k
" r& v, ]7 ~* U  [

! H' z8 c: r* d$ L2 {2 o4 |9 n- O, ffor i=1:sizepop; S) b- T. N/ F  j0 ?. A& c
    pop(i,:)=5*rands(1,21);
( z% C% o' |0 n* a6 A' _9 q    V(i,:)=rands(1,21);$ ]' e- E) ~: a* r0 O
    fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn);  这是出错的43行. x5 z8 X/ `# E0 L' ]: ~5 z' }' Z
end( f8 k1 T$ y9 ?1 u5 D
2 ^% d6 |" R. M# u

6 ]0 o* Z9 {, k7 t, y" P
% ^: O8 l8 w; A. S, l$ m& j, j1 V' v9 y

8 s( l! J9 F7 [2 k; a# J% [% 个体极值和群体极值6 H/ W1 x+ B3 t
[bestfitness bestindex]=min(fitness);
" v, ]# r- a! q! ]0 p2 Lzbest=pop(bestindex,:);   %全局最佳
0 S3 L. C' t5 a0 i" }gbest=pop;    %个体最佳
* v( C2 {. u6 f; h# x, ]fitnessgbest=fitness;   %个体最佳适应度值
4 c5 {1 H0 O6 t5 q1 x  Yfitnesszbest=bestfitness;   %全局最佳适应度值  n' ~5 }& U2 A3 P* w/ x
. m& `- {& {: b
& Q) j$ E" ?# D, f2 m* @) }0 A
%% 迭代寻优
5 k. d2 y" M& E3 i% G- `( Vfor i=1:maxgen
8 Q4 U* H" k" F6 r% p. V- q    i;
0 l( ]: u3 g, S9 U  M1 r# E   0 x' V6 _  b# _  V3 @
    for j=1:sizepop9 w5 w" z# z4 H7 }& J2 b+ T
        
! Y" ?/ K: [2 X% H  J0 B        %速度更新7 Q! R6 Z" r1 J! A# t9 ?
        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));. S* n8 L  P: w' q* K% ?
        V(j,find(V(j,:)>Vmax))=Vmax;
+ e; x% _+ m; D+ z8 ]        V(j,find(V(j,:)<Vmin))=Vmin;' }! {0 C8 \0 X2 _& t7 j3 }
        5 x# D6 G8 Z0 I6 G
        %种群更新! D: M" x' q3 ]1 ^7 Z, x
        pop(j,:)=pop(j,:)+0.2*V(j,:);  P( b( F1 G; t( `7 L2 O
        pop(j,find(pop(j,:)>popmax))=popmax;* q; C+ u0 ~7 j3 {3 n( Z
        pop(j,find(pop(j,:)<popmin))=popmin;3 y& _, Y) C5 |1 d" q% U5 K
        
6 p! [5 P2 z: F7 \6 o        %自适应变异& t2 H4 J! L6 j  |: Q
        pos=unidrnd(21);4 X4 c& t. |' ^- q$ h% q) {
        if rand>0.95  T2 }+ d% X  O0 n( z7 E" W
            pop(j,pos)=5*rands(1,1);
* }' a( W8 u  o! O9 Z: W" c        end
% D" c9 a8 T/ j( |3 ~      
+ u2 Z8 ~5 D, u' s  o% U; |        %适应度值
6 X1 o4 `+ P* }3 _" T4 Z        fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);5 S3 V: b3 J0 g3 c: r) F- i! P* ^
    end
# f3 M9 ~/ B) t- j  l   3 [+ M2 ^* D. n2 E6 p9 U
    for j=1:sizepop( ^/ |2 r, Y9 b9 i8 R. q: ^. F
    %个体最优更新
  Y" {- U- }  F    if fitness(j) < fitnessgbest(j)
4 H' {6 c+ U; Q        gbest(j,:) = pop(j,:);
& q2 S9 {( S3 x  f        fitnessgbest(j) = fitness(j);' m! ~7 O: R% o  y4 Y" X# B- h
    end) e" y! c: X6 J& a* J1 ?6 ?' A
   
2 H4 w# y2 v( X, E! C    %群体最优更新6 U" H: S2 Z. L  N
    if fitness(j) < fitnesszbest
7 z4 L4 ]% Q# C# `/ t6 N        zbest = pop(j,:);6 ^6 k3 z5 C$ \+ N# X; k+ t% L
        fitnesszbest = fitness(j);
1 M: g4 M5 L  I/ N4 g, G5 t    end- G9 `' J9 K) C  U# C( j9 z& G
   
' X( ~' }% P3 g8 S5 O9 D$ L    end
2 K: z+ |5 w- K* C+ w2 p   
' N9 b% r1 |. \3 _) }6 H0 \    yy(i)=fitnesszbest;   
7 G4 p& I" z0 a8 O4 P        ) y0 G6 q! b7 Q" o1 A2 w' E
end
0 P4 }' S+ x. ^1 E7 H" x4 H7 [; Z. |$ A

! T! w8 P+ i* q5 Q* ^, y' T%% 结果分析) D3 w$ t8 L0 G) o! n
plot(yy)
3 h5 }' _1 B) A* C# m! ~title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
1 z' V+ j. E% e& t3 fxlabel('进化代数');ylabel('适应度');# y3 V$ F4 l6 c) l3 U" e: J
6 X0 I( x4 _4 U) [

3 w9 y! A( m8 z. c+ z0 \5 i4 z" f' e: Hx=zbest;
" L- [: w2 Z0 O# S4 u: S( w0 Q%% 把最优初始阀值权值赋予网络预测4 M( @1 E4 w, j+ s7 Y
% %用遗传算法优化的BP网络进行值预测2 _/ J" x6 G( `6 E8 Q
w1=x(1:inputnum*hiddennum);
/ ]  Q+ r" G6 M! UB1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);$ j. C9 V- g3 I
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
& h+ X* V' K& ]; a2 V* F- n- pB2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);7 V8 y9 D1 H5 K; {3 o9 q

( @  ?$ r0 W4 h: d% e! m1 A: M

/ n; F8 |/ w, X( Hnet.iw{1,1}=reshape(w1,hiddennum,inputnum);
- r2 ?  L0 v: nnet.lw{2,1}=reshape(w2,outputnum,hiddennum);, V2 E7 a4 z# w/ O* x) q8 s
net.b{1}=reshape(B1,hiddennum,1);( N8 c& D2 j5 `2 q
net.b{2}=B2;
6 ^! V+ g9 w# c6 e0 f- G. e: w4 X- d. [% Y# k
$ |: ]+ Z# w4 O7 r! {* N' g! _
%% BP网络训练$ f. D. D- l3 L6 Y1 D7 P! I3 L
%网络进化参数
/ W4 u% C9 ^8 p# ^4 R: r, Onet.trainParam.epochs=1000;
" X& e# j' W0 Y4 F2 E. q) Dnet.trainParam.lr=0.1;
, @' h6 A  K( A: l. b. P9 N%net.trainParam.goal=0.00001;
3 x) T% h" {" k9 U6 Y
8 d" Q% e2 C# Q, `

; F" f- V# ~' _% P%网络训练6 n. [/ H. @: M+ Q
[net,per2]=train(net,inputn,outputn);
. E; r# m5 w2 N  P" T# n  q; w! x. v* w# Y

% S  _1 A' P4 G: F/ ~%% BP网络预测
1 I" X( h- s& u5 w( `# ~. @%数据归一化) h& e7 V; [, U' \
inputn_test=mapminmax('apply',input_test,inputps);
# ~" {0 L; s8 X5 s& f$ Van=sim(net,inputn_test);7 v2 J6 C! J( Z
test_simu=mapminmax('reverse',an,outputps);( |& f/ r7 D+ |# s7 h+ K, s# a
error=test_simu-output_test;+ A! O7 l; {- l$ O/ k
" T/ \  H7 q% O/ m& ~

该用户从未签到

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

该用户从未签到

3#
发表于 2020-7-7 10:09 | 只看该作者
个人认为三处有误
1 _& @, ^7 e4 T, g) s9 |. t6 g一、 pop(i,=5*rands(1,261);随机取值维度过小,正常维度应等于inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum. e& L- u$ p) g/ ~# f$ e7 P) e6 d" D
二、设置标签矩阵时存在问题,output_train=output(1:800,1)';& P2 o$ J$ {* x$ e8 ?; B! N
output_test=output(801:1000,1)';索引有误- {# K/ K: l) X, i( J" N/ O; ^
三、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-7-26 10:06 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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