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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
用matlab进行PSO优化BP时,出现了下面的错误,求帮忙!
8 w' C- K& }9 o: f7 E% e下面是程序运行出错结果:
# L6 @" R) G$ x2 Q& J索引超出矩阵维度。
4 F( k0 [! W6 e: Z" k
6 |5 H2 O# G, ]8 _" S; v% U5 _6 }$ u5 g" Q
出错 fun (line 13), W* v; S& {% }) |# D* y
w1=x(1:inputnum*hiddennum);: b2 E5 j4 u* z' C
- ]+ L. O& R/ F, d% p* Q; m5 ^

8 M( U6 N0 {/ V/ U出错 PSO (line 43)7 x, q* y0 w6 ~0 T7 F
    fitness(i)=fun(pop(i,,inputnum,hiddennum,outputnum,net,inputn,outputn);3 h6 k: Y1 {5 p5 F

- o3 _4 ~9 ~  O0 R- t% O7 I
9 u7 Q1 l/ k+ M" T

" R. h. d: K4 x& w! T: Ufun函数:
4 y3 @8 |5 \2 [( k8 c& ~function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)
9 y" ?' W2 c& V%该函数用来计算适应度值
5 E" Y4 ]3 [) j  a, N0 b%x          input     个体
6 C! D+ Y, R5 z" F2 h$ ~' \%inputnum   input     输入层节点数
7 g2 b, z+ N6 U$ z%outputnum  input     隐含层节点数% G# C& v/ E/ J) ^+ }! s" Z6 ~  p
%net        input     网络
' P' l+ g/ @( d" ], B! ?7 \%inputn     input     训练输入数据9 O9 u7 y, a/ c* V
%outputn    input     训练输出数据# L4 t/ C7 r/ ^6 f& l; J1 m" {  o

& a) @' R* q/ P' ]$ C) W1 s+ r%error      output    个体适应度值: z- }# f4 O8 g

" n. Y7 U9 O. A/ f8 `% R%提取+ ]: `2 j8 A, _) `' [. X
w1=x(1:inputnum*hiddennum);  这是出错的13行
/ O# w* ?4 f+ L3 }) k9 jB1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
( J' D& I7 ~9 Z( Q$ `% G' ?w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
5 e# T/ I" g5 z# _5 V, d- mB2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
9 v% Q6 V5 _/ S
8 t( ^6 x/ n/ {$ A2 I1 @
- O& a, W  g9 |%网络进化参数
$ }: V3 g  V" {$ y, Lnet.trainParam.epochs=1000;
" E  O6 H  @# q1 ^% h+ U( wnet.trainParam.lr=0.1;5 [3 X1 ]3 Z- r
net.trainParam.goal=0.00001;' y  j+ E: D6 M1 K5 I/ Y+ x
net.trainParam.show=100;
2 u: J+ C4 e# t. Q! G* Y. |) B/ wnet.trainParam.showWindow=0;2 m  z  v$ L; u8 c- v) l" B5 V

! \- `( @$ b( _%网络权值赋值9 L8 d5 I2 b# c7 E
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
' R! ]7 V9 R5 U$ W& ^net.lw{2,1}=reshape(w2,outputnum,hiddennum);1 q: t; `# w5 T/ I" |
net.b{1}=reshape(B1,hiddennum,1);
# ]  t+ g2 u5 ~7 vnet.b{2}=B2;" P' y2 n8 O9 ]5 s/ C, a3 A

" g( ~& E9 s8 }+ _; ]+ Z8 d( e& S% u%网络训练' y; y9 T, T6 i* f6 ]3 U
net=train(net,inputn,outputn);
5 E2 {4 {0 Y7 |. a4 }
. v$ V% ?2 ^! w( E5 W$ Gan=sim(net,inputn);
, x  r) ^) B! z+ c- j5 P9 U4 n# L* g+ w  F2 ^: ^2 I
error=sum(abs(an-outputn));, l! n- j3 Z7 T  c/ c. k* @
1 p4 c4 a6 @+ V) B7 t0 y
主函数:/ k' C- ~8 M8 Y( r* t' ?9 O* x
%% 清空环境
9 u  N- Z" G5 q7 k$ |) ]clc
: g: C# T9 m& U: J' ]clear9 L9 _: m0 [+ |4 N% @
; w! Y/ D+ S: O! o3 h* [1 \
# Q9 s/ M/ Y4 g  m0 T' T# X9 v
%读取数据
4 q+ H9 t' B) a+ {+ F1 gload input
3 v/ Q1 u, k# lload output( S! c/ v1 X  i; ]5 S0 E
; t5 j% K* ?( F$ s' Q8 G- e- ]
- A9 R. e$ x- O, _
%节点个数
( V7 B7 h2 V3 Q+ ]+ `! B0 Vinputnum=34;" G' v4 R- W7 y
hiddennum=7;
0 [8 \0 f" n2 c% j4 Q0 C/ r  `; ioutputnum=2;5 h9 D9 q& U2 r/ r! \

1 i$ A2 z0 O6 P

* j6 ]! d& ~! ]' z( ?%训练数据和预测数据3 S4 D( ]. j' p2 ]0 E) j0 m0 o! a
input_train=input(1:800,';, @7 n1 T* o4 d3 }
input_test=input(801:1000,';4 F4 Y6 |6 |/ N# K: j3 B
output_train=output(1:800)';1 N# j# f7 Y, E5 t5 l/ C9 h6 b
output_test=output(801:1000)';
5 y! `# Z  ]3 o. Z3 L9 |2 D6 k5 j" I, Z0 p% V0 |7 M

/ F3 A# j7 c! b. \% B0 p( }%选连样本输入输出数据归一化3 M( Q# j6 c  J, p) V2 V9 ^" z9 _
[inputn,inputps]=mapminmax(input_train);
/ t# I* V! r+ W! E$ h& P  x% ^[outputn,outputps]=mapminmax(output_train);
0 V  l* D! L6 a1 x; e
2 {1 ]$ m9 u4 S

. F6 q" u+ ?& |0 ~; h- Q& @%构建网络( `0 i4 H: F+ `& X0 g: p
net=newff(inputn,outputn,hiddennum);
+ K, j* W9 J( ~0 P  F# S! z1 t) w' ~% W; s- ?) \1 p4 p7 g* v+ k# [  `

3 V8 ^- T' E( T% v$ \! T+ x8 U% 参数初始化
1 I$ |* s! s0 Z4 h%粒子群算法中的两个参数; n0 `# z+ J# \
c1 = 1.49445;
; o% j6 m6 @. V) h6 h0 z, ^c2 = 1.49445;* j1 z% r( }3 `* b8 l- P! A
8 d- e! ?2 z: |, b

; @5 [& x9 z; Cmaxgen=100;   % 进化次数  1 t  Q& a$ N: _" ]$ E6 b
sizepop=20;   %种群规模  N* G/ }# E; {( E

3 ]: G% X, p0 q1 w$ s! P
" W0 D+ l0 @  f6 |5 ]4 @- Z
Vmax=1;
+ Z% S$ s/ }. s8 xVmin=-1;# }6 M: [4 m. r, i8 m
popmax=5;, K$ Z( w0 t, Y. }/ {8 N
popmin=-5;
: y* e# P/ c" G! s/ R% r1 b6 ]! I% n! |) R7 o$ \

: h; [0 s$ `. J$ H0 s, Lfor i=1:sizepop
  {: P# R5 ]1 J# K    pop(i,:)=5*rands(1,21);8 U. L  w$ V+ S6 b8 N* q& e8 R! X; y* F
    V(i,:)=rands(1,21);
- @3 p/ w, C- J: J0 N9 Y1 i, i    fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn);  这是出错的43行& j" R, w# i; I* C4 s: w9 d
end
$ _7 G- V: o  u# S
6 ]5 B! [' J9 q5 ~: S
" m. H9 f. N( x

0 y) m4 O& k! g' Y( y' S9 Z1 f

' F+ V- T2 A0 y! Y) M3 a% 个体极值和群体极值
  n5 ~7 J) Q4 e2 i* _, b! g[bestfitness bestindex]=min(fitness);
/ [$ q6 y, {* G. S3 ~zbest=pop(bestindex,:);   %全局最佳' r8 \0 r' V0 m7 O) g  G
gbest=pop;    %个体最佳
& L( Y! K0 ~% N$ Y- a# @& I- Yfitnessgbest=fitness;   %个体最佳适应度值
! @9 t9 s1 b! [5 F; P$ d5 rfitnesszbest=bestfitness;   %全局最佳适应度值
/ ^% A9 l9 J* X& ~" e/ v
/ m/ t2 r$ u2 Q; N% r# H0 M( F7 |$ A
& W2 G. F5 X5 \. N. o2 S
%% 迭代寻优
2 ~4 s3 w' F: b0 }for i=1:maxgen
1 z) q% P: O: w9 N/ |" O6 ?    i;8 c& q2 Q* B. h& {0 T
   7 H, z! u0 P3 i4 p4 X( {, T7 f; c
    for j=1:sizepop- `: A% s& z5 T2 e
        - i" T/ {; b: x! n
        %速度更新
' S& ?& }9 B! r, E& B. K        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
- k2 Y5 x2 @/ R- ]4 Q. i        V(j,find(V(j,:)>Vmax))=Vmax;
; `8 q: c  n9 i" F) V0 u        V(j,find(V(j,:)<Vmin))=Vmin;: K. o) V, }, B6 s
        6 |; t4 L- W4 L6 O4 X- F& _" s
        %种群更新4 ~3 l- g* ?5 U8 z4 n; \8 m
        pop(j,:)=pop(j,:)+0.2*V(j,:);
! C3 H# @: Y: d        pop(j,find(pop(j,:)>popmax))=popmax;
9 ]! b: j2 v/ Y/ H; J% D4 M$ J        pop(j,find(pop(j,:)<popmin))=popmin;
1 H8 b  N% v% p2 ?9 {+ q# e2 ~6 }        
6 j1 n" t" }8 m" _        %自适应变异5 E; {4 V2 S6 k5 j
        pos=unidrnd(21);
2 m+ G; d3 X. ~) K: O, f        if rand>0.95
" c' u' U  _, F% [$ h0 a9 y            pop(j,pos)=5*rands(1,1);1 A1 |& s5 ?/ L
        end& c; X% Z9 D6 c( A- @
      
  b) q( S+ g: Y5 m7 J) R6 f2 v        %适应度值
( S; U2 n- t* G: T, u3 `& G        fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);
$ X, W, _, U9 l6 K- s, @# Q7 {    end( h# w3 n$ _; j) c4 n$ c
   % r& d; y$ j' F" q
    for j=1:sizepop
  v8 h6 S: v" Z4 v    %个体最优更新7 e- G7 E; H1 ]
    if fitness(j) < fitnessgbest(j). b" G3 P! X4 Q. V
        gbest(j,:) = pop(j,:);
: ?8 m" u( T& q; H. A* w        fitnessgbest(j) = fitness(j);
# \6 {* K7 J# S3 O    end3 c) a4 G9 ~& W5 C2 i0 K$ P
   1 ~# I/ R3 N! r3 h3 M1 G
    %群体最优更新$ y8 f1 e+ a2 P2 t; ^
    if fitness(j) < fitnesszbest: D4 e  m2 C* {# |- S6 }
        zbest = pop(j,:);  m1 i: j% u  x. D' [
        fitnesszbest = fitness(j);' l& N% I5 u+ B1 `+ k3 Z
    end0 U$ z1 A- O# Y: R3 f4 W4 s. [
   
) M( j) G: q6 K3 r# A    end) J2 D; B% j% x" b3 p5 z
   " T" o% ^% w9 e
    yy(i)=fitnesszbest;   1 Q/ ?/ u9 t6 Y! ^' u
        2 z7 X4 x& B2 T) _) d3 C
end. v: X/ `3 \  N& c) B( U
, y6 T  G* c4 v0 Y; x

# t5 S( C3 k" e9 p8 c1 _%% 结果分析2 a7 J1 T$ `/ F! }' S9 |
plot(yy)) w0 n; i! I( M/ B! d
title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);; R+ [  c) f+ C: ^  [7 `
xlabel('进化代数');ylabel('适应度');6 y5 q/ j1 V  {' D8 F9 ~7 B1 h
/ U% |9 j" W- W) X: k0 m
8 Q  s! O% e# ?/ T/ M
x=zbest;
, s2 v7 }6 q* Z%% 把最优初始阀值权值赋予网络预测" q$ f8 V2 O; e  y% D# b; h  v
% %用遗传算法优化的BP网络进行值预测
9 N% y. D0 ~2 bw1=x(1:inputnum*hiddennum);+ L) w  Y, o( m" U( J
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
" m( \- k# a6 d) u0 S6 nw2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
1 t0 l8 g& F* U0 T7 K, |! NB2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
: o$ }' A& l1 x0 J( @" ~- [- |& i7 ^# g* G
) @# m. N! C6 S( e9 B  d5 C4 X
net.iw{1,1}=reshape(w1,hiddennum,inputnum);; P+ R+ X+ `; z7 }# l7 s
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
( }5 U' }- C, Z7 k9 T/ o0 x; h: Vnet.b{1}=reshape(B1,hiddennum,1);
, \2 r: t" f" x6 \5 q- u" Dnet.b{2}=B2;
3 ]  t2 ~4 B  ~3 K
! h5 b) f' L& z/ ?3 p

4 \) H4 ^! J# y( T' G, I' E%% BP网络训练
6 w3 A$ v# P" k. ]- G- D9 U%网络进化参数
* k9 i/ P" |; L% xnet.trainParam.epochs=1000;7 N/ m4 G4 q" O% ?  q/ W1 D6 m, B6 ?
net.trainParam.lr=0.1;  }, _# J  \( ]0 {, u7 J; t
%net.trainParam.goal=0.00001;
7 S6 n  p5 w, v6 t% I1 t6 r- ]7 |/ A, \3 o% u4 L
8 s* e* @6 p1 l
%网络训练$ S5 K) m+ i( M) U8 Q4 y# D0 n
[net,per2]=train(net,inputn,outputn);2 b. O: p+ S' {' L- L, I

% E' S* o7 u3 c

- Y3 k6 P' H/ W. u$ c5 K/ s%% BP网络预测
: l  n* w5 k' Q8 H%数据归一化
4 n. g2 [: K# \' Q. ^; @' Kinputn_test=mapminmax('apply',input_test,inputps);7 U3 p1 [) Q: Q4 v! F! I) v
an=sim(net,inputn_test);
$ M  H# y3 W5 H8 Q. F3 E+ atest_simu=mapminmax('reverse',an,outputps);& ]; n& R. |! L9 A$ h# Z% Q7 v
error=test_simu-output_test;
: W4 L9 u4 B( A3 h+ O3 S
' R8 Y2 O& Y% b: g

该用户从未签到

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

该用户从未签到

3#
发表于 2020-7-7 10:09 | 只看该作者
个人认为三处有误. t% T8 P6 ?( ~; u: l& `
一、 pop(i,=5*rands(1,261);随机取值维度过小,正常维度应等于inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum
, G4 I0 J' Y! L$ O二、设置标签矩阵时存在问题,output_train=output(1:800,1)';" P( [! y% q, ~: V6 z* Y$ w
output_test=output(801:1000,1)';索引有误
) S* [6 O1 h' D. q; I. v5 }  M三、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-8-20 17:57 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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