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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
用matlab进行PSO优化BP时,出现了下面的错误,求帮忙!) [. G# ]. B9 d; H7 _) a
下面是程序运行出错结果:
2 d; F8 C3 L$ t6 j索引超出矩阵维度。( |+ E6 y& y/ y0 h

- G+ z% E4 ]( C/ U8 o0 R# t! m: \# N- p6 j: _( S2 }6 @7 |& L/ ^' z0 V
出错 fun (line 13)
4 p& n; {9 n' x& T- ]5 X- O; pw1=x(1:inputnum*hiddennum);
* [; W' |! @: M4 b) w) V9 z  r; `$ P& T# Q/ j* K9 y

) I7 K: Z2 l+ _$ m% N. ?6 O  @7 H, U出错 PSO (line 43)  R) |# q5 A  o2 W) S9 H3 z
    fitness(i)=fun(pop(i,,inputnum,hiddennum,outputnum,net,inputn,outputn);
0 b! J8 x  g. n# D- M# Z& h$ B/ O6 A7 B, ~& v5 `( \

- x0 p. o" K! D* G
! k& \# x) V; z/ P
fun函数:
8 f5 j7 c+ B3 e0 @7 ^' zfunction error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)6 g; q/ d, V- P4 J* @: G/ q/ z
%该函数用来计算适应度值. w8 I! D! q" l4 K3 E
%x          input     个体
! ~9 g1 n: t  d$ ~5 J6 a%inputnum   input     输入层节点数
; u8 O9 D$ ^9 p( X%outputnum  input     隐含层节点数
* q7 b5 t# B3 u" A# D) k%net        input     网络
4 D' a. T4 _; T0 p' g8 Z7 T( F8 E%inputn     input     训练输入数据
0 W! w% H& o; Z%outputn    input     训练输出数据7 k# a& t/ \4 ~7 E( t/ q

! q7 ?7 i: q4 l0 f%error      output    个体适应度值3 W; h' u# p' {! [# r

4 o5 D( L+ o( |5 j%提取! U3 G) x, B1 Z
w1=x(1:inputnum*hiddennum);  这是出错的13行. d$ r7 ]* A! [7 ~! H
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);' X" u2 J( }- e+ n* d' I
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);+ S) a9 e; t8 o5 z& A. x: b
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
% [9 z8 w: e$ M3 ]7 x" y6 N$ \6 g9 e0 l; X

" [" y& X7 ], L/ K9 q( J* E%网络进化参数+ E$ }1 V6 u! d
net.trainParam.epochs=1000;+ j. V6 V$ R" T
net.trainParam.lr=0.1;
8 ^2 {/ F0 M7 H0 h3 T$ P$ [net.trainParam.goal=0.00001;, _/ U7 s" \* o; y
net.trainParam.show=100;" s$ o8 |" j7 u, e9 i4 d
net.trainParam.showWindow=0;4 {6 |/ ~3 f$ K( B% s" V6 _* Z8 L

: D, [$ E& n! H& j! h7 M: f8 {" y%网络权值赋值
7 S% N. `* \& N9 @net.iw{1,1}=reshape(w1,hiddennum,inputnum);
* S/ [& R. ?% d$ [+ mnet.lw{2,1}=reshape(w2,outputnum,hiddennum);
0 y4 W  f0 g- I0 X8 ^" U! anet.b{1}=reshape(B1,hiddennum,1);" E- K3 |" @- x4 S" }2 h
net.b{2}=B2;
* n  g; D% X  _" B2 b; [, l# T6 F6 \& R7 q5 ]9 ]' Z! L2 h
%网络训练
  L- O+ K( G5 H' M, g) s& u: Vnet=train(net,inputn,outputn);2 Q8 k3 J# h6 b
- u" p1 A: ~  M+ }  t9 ^) F
an=sim(net,inputn);! l2 @$ J- X9 ?% p  j* ~" D

3 Q' N& j- r0 Eerror=sum(abs(an-outputn));. G, ?* s6 E+ N, [- C/ o
% y! ]! i0 Q9 B  g$ m
主函数:& s  `4 y/ ?4 V$ u0 o2 q  [: n4 y
%% 清空环境
; E+ l/ R$ S- ^- t0 E* G8 Hclc% N) X8 n4 T0 D: Y
clear0 T! A5 f' v* N0 I6 M
7 s3 J0 \) c- L1 q; C! x
0 W% G! Z) m+ o: r9 N% o
%读取数据
: O5 n+ j+ i% P+ W6 V0 d$ \$ W+ Lload input' q1 L! F( c: K5 e$ c
load output, M" r+ x6 w1 I' L
9 X9 U9 y7 q( A( M. b( P* l

) H2 L% l2 i/ h%节点个数
+ ~4 u& h. n% q) j* X, k& Qinputnum=34;  B* o* G- M& u) f
hiddennum=7;  `. D7 a0 k6 }4 Z; e% P1 j7 ?
outputnum=2;
1 @+ j2 X( h; n0 Y" n
( p4 v  f! F, c! E8 k! J. ~% ^

* W$ ?( Z9 l# V9 K4 m%训练数据和预测数据1 I9 }# y" [6 p$ d
input_train=input(1:800,';
& [3 ?8 i% Z3 f" Oinput_test=input(801:1000,';
9 F% h/ G2 z( m: youtput_train=output(1:800)';
  t: B( S/ ^8 k! T# L8 S0 b& P# S# toutput_test=output(801:1000)';
) d9 U) m) }0 ^3 `1 V. K/ ]6 m1 Y/ b9 p; }3 O  E+ @; i- S

. T% U5 \+ W& j& P$ f& J/ L%选连样本输入输出数据归一化
9 A6 k7 f5 \9 A9 w) @+ t[inputn,inputps]=mapminmax(input_train);) P( p7 i# s. u- ^
[outputn,outputps]=mapminmax(output_train);+ E" I( ]  I/ g- N, V3 U; Z% E

- o/ |/ H/ l. y' b3 Q
4 A( M2 j1 K1 i. J: D
%构建网络- R) q6 s% a  U5 D* O, Y
net=newff(inputn,outputn,hiddennum);
/ S8 l- H; s, O* _' Q
6 |9 q% k  m" F6 q) x
% a+ t" x6 v" d% \0 P) q
% 参数初始化
. q; C' C1 I- p- u%粒子群算法中的两个参数
2 [$ s. ~" V# C$ Tc1 = 1.49445;
& t7 j; Y  \; a- h. [: n, G& nc2 = 1.49445;" A9 l& G$ ^( Q
- J, y& K3 x* j
% ?! u4 X4 T4 v1 z) Z' n! X; t" ]
maxgen=100;   % 进化次数  , j" e  x5 K4 @' y
sizepop=20;   %种群规模
4 z! c: p6 A' ^+ P9 G
" K  c$ r4 v+ ~: ?* j

& E5 J0 W, d+ x! W8 F# F5 vVmax=1;
7 ~" q: a1 \5 k1 ]1 l/ U5 I; F# A; ZVmin=-1;
# E" i0 j# P. f' o$ L' ipopmax=5;1 x, O( q0 N# [* t, l
popmin=-5;. L0 f1 j9 P6 \2 @& w

  p& T1 Y; R) t% a
. r+ o) f) h8 F+ `
for i=1:sizepop( k+ }; b6 P7 h
    pop(i,:)=5*rands(1,21);& L6 O! n+ R" a9 \% |/ m
    V(i,:)=rands(1,21);
- e$ K+ n! H( i6 M7 @    fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn);  这是出错的43行
( e$ G2 U0 b# ~0 Iend6 c9 o+ k0 l7 w$ o/ S* }. P
4 |0 }& n7 S  i
. f' w, B  F8 s+ n- o7 t
( v/ r4 S# V$ p1 o
9 b/ U  z( G& U; o
% 个体极值和群体极值
1 Q4 |* y/ L) L  `  Z; a[bestfitness bestindex]=min(fitness);' T$ j+ |/ ^5 ]# \/ s) K" A
zbest=pop(bestindex,:);   %全局最佳
8 L. H/ c/ G* o1 d0 C1 \gbest=pop;    %个体最佳  Q) }; ]3 X7 F# [. U  u1 N
fitnessgbest=fitness;   %个体最佳适应度值
) ?6 V% c8 ^* I" Mfitnesszbest=bestfitness;   %全局最佳适应度值
7 Z5 p, H0 K: e7 }
# {. U( ^. h: G9 P2 K" V
, D: f: h  k3 J5 l- [' v
%% 迭代寻优! a2 W4 F' T9 l9 @
for i=1:maxgen* j. V% v# m4 d
    i;' ]) ^5 U8 h0 h
   2 \% I+ g7 g: ]4 s
    for j=1:sizepop
! V5 h$ Y& L% M$ l$ L        
2 G' O1 p( i# c* z) y( p        %速度更新
' Y, k" V) W0 h& ~        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
) f0 ^8 l8 ~% ^* m) w) O        V(j,find(V(j,:)>Vmax))=Vmax;; ?# C- q9 O/ m& y/ u8 z
        V(j,find(V(j,:)<Vmin))=Vmin;
' z: _& f6 ?0 D' V8 V        
2 }1 C- q1 _4 E        %种群更新& F6 t% F$ f% |
        pop(j,:)=pop(j,:)+0.2*V(j,:);1 U) D  H. C  O+ b
        pop(j,find(pop(j,:)>popmax))=popmax;  D9 O: r# |1 K* x
        pop(j,find(pop(j,:)<popmin))=popmin;( x( V0 R( R+ _. h
        
5 J2 z1 s, C& Z8 u        %自适应变异$ `& O$ ~7 H* M- d0 e
        pos=unidrnd(21);6 ^' d5 f$ Q( R, p* U$ M
        if rand>0.952 W9 \; \: r9 `& u, f
            pop(j,pos)=5*rands(1,1);
" z- ~7 [  v+ B  S- w" r        end# t9 D% F9 g& U5 Q
      7 v0 O  X1 S: |& e# F* u
        %适应度值
: G# k+ p/ @3 ^! O        fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);
( z" F* I5 Q8 w- ]    end
7 B/ Z  F4 w( L7 f2 a8 |3 J# e   
( |# q. ?% i) W; g% U    for j=1:sizepop" h: P- B( a+ D/ K! M+ i
    %个体最优更新
  J$ }4 x, f0 K6 w    if fitness(j) < fitnessgbest(j)4 E4 P* ?$ v- V! E
        gbest(j,:) = pop(j,:);
0 ^; D8 \' ^% Y' _. z        fitnessgbest(j) = fitness(j);# Q9 k4 P0 r/ F
    end) l; E! s  N$ k0 S8 y$ J
   
) G0 g1 ~( S$ Z7 I3 j* p9 O0 O    %群体最优更新+ o; Y8 S. v9 L# _& g" ~
    if fitness(j) < fitnesszbest
+ \9 w- G  O: G& X& s$ J4 N        zbest = pop(j,:);6 |8 P5 v9 z" d, a
        fitnesszbest = fitness(j);
% \) [& V' j1 ~  O. t2 w$ d! Y    end8 ?! a# ~9 h7 F, C* a
   ! ^  b2 B7 p* K! \* U
    end. u  }4 Z  s' Y) x. i+ D
   
' c+ P1 u% J2 u    yy(i)=fitnesszbest;   
$ ^5 t3 \- @* z8 w/ \8 T        
  y( B2 E/ s! l7 B$ `7 s; Lend$ z; `4 I: g) g, Q( A

9 z9 h7 s1 c; K, V' ~

1 p, H8 p6 B) J/ G%% 结果分析
+ ~! v/ `& L" ?1 G- pplot(yy)
1 J; o% e4 q$ u7 Q' l8 Ctitle(['适应度曲线  ' '终止代数=' num2str(maxgen)]);4 M8 w$ A: t: ~  m& {
xlabel('进化代数');ylabel('适应度');" X& U; {, K4 d! h1 i( n5 @1 P
9 d6 O& o( O* S' h
: |+ `6 m/ X; d6 Q7 @0 T
x=zbest;
& S; K: ]+ ?% d# x%% 把最优初始阀值权值赋予网络预测
3 q1 ^  O& T9 c$ `% %用遗传算法优化的BP网络进行值预测
* _1 G% y) q! m; ?8 K4 M2 ?w1=x(1:inputnum*hiddennum);
$ F3 F# f0 S* _7 L$ \B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);2 f  u4 r+ L5 y3 {2 I
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);8 k( I( d( N% g4 h; I$ p0 o- o# [. `
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);( y9 t( S4 y# B# q
6 @! y5 j+ L- Y2 Y: l" d/ h
$ f8 h% u2 @7 l( G& Q
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
4 ^# I3 @2 u5 Z* Qnet.lw{2,1}=reshape(w2,outputnum,hiddennum);/ Q6 ?9 X8 o7 v2 u4 G( r
net.b{1}=reshape(B1,hiddennum,1);. S2 f$ s0 J* j% n: w9 y# O( z
net.b{2}=B2;
/ D' N8 Q2 ]3 r2 Y3 Y, P. u+ h
# U5 T4 p5 n9 n% ^  z' o

& ^' a' _# x' ]# T" j& W4 `& e%% BP网络训练
8 B1 k) [- H1 W%网络进化参数$ G3 a+ |- [- R$ _
net.trainParam.epochs=1000;3 b, t& |$ S* [" O2 F$ w! H* P6 Z2 k
net.trainParam.lr=0.1;
8 f, {) i3 C6 P6 T%net.trainParam.goal=0.00001;' g3 G# h3 J  ?; ~' K/ M% k

- d8 i7 f) z( @4 q- W: q0 r
3 B5 ]6 Q# l+ k9 Q1 z2 u2 K( M% b
%网络训练
4 T3 E- k  \3 P' a+ {4 J3 u[net,per2]=train(net,inputn,outputn);
( B- h% Y9 T+ x% A  P' }6 E( W; c; k( J# X8 C
8 F) T! R- @) N6 ?0 I/ C  t: j4 I; b
%% BP网络预测7 f; V# \+ o( P2 g2 J4 G0 P" n0 B
%数据归一化0 B6 k7 }7 e- \. a% J- E0 i/ N- m6 C
inputn_test=mapminmax('apply',input_test,inputps);. T& g+ j! H( b# X2 E
an=sim(net,inputn_test);
' ?+ S( s" Z, o; G& u! {5 w0 q) btest_simu=mapminmax('reverse',an,outputps);- B. p0 _2 @/ t; J% g
error=test_simu-output_test;
4 c+ [+ H# B) Y3 Q" p
4 m& a, C! Q# N& n, c" q; y

该用户从未签到

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

该用户从未签到

3#
发表于 2020-7-7 10:09 | 只看该作者
个人认为三处有误
# {7 D' i: |2 X# O; F2 o一、 pop(i,=5*rands(1,261);随机取值维度过小,正常维度应等于inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum
5 h7 S1 r! v- g1 u1 c* `  `二、设置标签矩阵时存在问题,output_train=output(1:800,1)';1 W; p, v: w/ N5 p1 {* a  X! g
output_test=output(801:1000,1)';索引有误
( F3 l% T' D6 E1 C2 u3 A$ W三、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-11-24 14:52 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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