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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
用matlab进行PSO优化BP时,出现了下面的错误,求帮忙!# f& V" {) }( P
下面是程序运行出错结果:" H8 p  B' \0 r: X1 y' d$ J
索引超出矩阵维度。
8 W* M4 m7 L; k8 g$ y
; F7 w6 A7 \7 R
3 m% Z) s, @9 A2 A& s出错 fun (line 13)
  X) b5 {- Z4 e' E2 z! jw1=x(1:inputnum*hiddennum);
# F7 Z  \) ]# T1 s/ i; i4 c% X+ x" ?/ O; p6 h0 a: ^

0 [1 m0 M! W7 R7 E出错 PSO (line 43)
) }9 k' j& j; U$ K3 |/ f    fitness(i)=fun(pop(i,,inputnum,hiddennum,outputnum,net,inputn,outputn);! u3 M6 m5 H$ A; G- U. _6 R
; E% R6 N( \5 [
( k, ?0 o3 g$ X6 S

! w- K& B( u2 \) Q( sfun函数:
6 F, y" w4 A8 }2 j- lfunction error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)
  X% r3 {/ R" c, g/ [6 ]2 c2 b* A6 |%该函数用来计算适应度值9 s' J$ p9 X( m! X: g
%x          input     个体
9 V# b7 I8 x$ E" Y9 k* b%inputnum   input     输入层节点数
+ G5 }+ r" y8 W3 U' ?) \%outputnum  input     隐含层节点数
& R7 g1 ^/ i: Z- l7 H( P%net        input     网络) r1 N' u6 |; q9 |' Q/ _. J
%inputn     input     训练输入数据
. \! Q2 A/ A1 D( h& V%outputn    input     训练输出数据  i( I  b* a) u; z0 m9 j5 u

, ^/ V: q4 V4 E/ }( R4 T0 A%error      output    个体适应度值
' q; k' u2 i: a) _+ n" h
- G) X) J; Y( p4 I%提取8 U: d1 Y# u5 i6 N
w1=x(1:inputnum*hiddennum);  这是出错的13行
* _. s( j: C: |$ Q) b5 a, k6 kB1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);: d& l: @9 D' v( o
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
: L! Z4 V0 o1 s& z8 jB2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
2 p  e( S( b3 j! d( ?6 l& m! e4 \0 l' X
. n5 g8 k$ L: c! S" s2 f7 y8 M
%网络进化参数: Q2 H( d) ~, h! I% k- B9 O
net.trainParam.epochs=1000;$ d! G: s6 v7 Q8 }/ M
net.trainParam.lr=0.1;+ s" G- V" a3 \2 v: W
net.trainParam.goal=0.00001;; K* A$ _7 k" b2 ^
net.trainParam.show=100;. J' M8 L% `( c' U, y3 n
net.trainParam.showWindow=0;
% _( ^' ?" O2 y* W
3 {& a* i9 R4 P( [! ^  u0 u7 M%网络权值赋值( a6 C1 ]0 h; ]% `6 V% d- t. J
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
: b9 k0 P/ W+ `" nnet.lw{2,1}=reshape(w2,outputnum,hiddennum);1 K1 W6 V* {% Z7 R! \( _) u. j
net.b{1}=reshape(B1,hiddennum,1);. V: \+ Y9 Q( ?
net.b{2}=B2;
& E+ ^0 j  }5 W4 O; s+ a9 O) }2 E! d3 A' k: J
%网络训练* e/ \- H3 ?' s( q6 V! ~
net=train(net,inputn,outputn);
' L4 _% t& y: F8 ^' d. m1 \0 V$ e/ F; w
an=sim(net,inputn);! _* B: W. [! d6 i- g0 B" ^

$ ^) {$ k3 P  ~+ [' n; Berror=sum(abs(an-outputn));
" H. a5 U; y6 O0 z; \! X7 b" Y; c
  n% a) S# C  V# G  t1 m主函数:
0 G. D& [9 r2 Q; k%% 清空环境
% c' a6 t  h$ `/ G+ f9 G7 [& nclc
8 L" @4 C% @4 B" c8 @5 xclear1 `# I) R( s  m! w

* h% |+ p" y: {% \5 F  Z

& i- |- [4 S$ K%读取数据1 y3 ~% y% x5 ^. r1 R
load input# n; Y6 G, A9 P+ ]/ [& e
load output" Q5 N! ]9 e( U8 Q9 W, W* o: J

, j- S$ U& U4 E6 }* ]

7 N+ H9 \' D4 R/ C& y%节点个数( h0 U  S9 s8 H- q$ Z
inputnum=34;4 W- a$ v8 Q9 z- }  W" R1 O2 c
hiddennum=7;' p! \) ^' b/ f1 x$ q* m3 U
outputnum=2;
% ~2 H* x% m, \3 u5 B' w- [9 \
) g6 x, m8 O+ A. K" T, o# p
$ u5 Z# f; ?2 Y# _. ~1 x
%训练数据和预测数据
, m  W9 Q- X+ Z- |input_train=input(1:800,';8 H- L4 r8 {1 s8 y9 i' T
input_test=input(801:1000,';$ j2 W8 t; @# \& m7 A
output_train=output(1:800)';7 a( G# D6 h) m% z2 k0 {7 p
output_test=output(801:1000)';% ~, Q. d2 e/ e  e6 z
" S. R2 n3 R6 ?

% G9 K  E' `/ Q9 E' q2 s  r%选连样本输入输出数据归一化
1 v9 g+ A" D& H6 x! j) Z[inputn,inputps]=mapminmax(input_train);
6 s# _5 s+ p+ |1 h6 U1 }[outputn,outputps]=mapminmax(output_train);
& I# a5 y# C3 k2 y, T2 r5 I) k  e* P

$ M* b2 s, j! n/ N& c%构建网络
, y1 Q8 q" c( N3 W7 Cnet=newff(inputn,outputn,hiddennum);
# s% v3 T" t7 e7 E4 ^0 [3 V: l" G2 d( q0 d: ?- w4 Z
  X) F" Z6 [0 a
% 参数初始化
" o; u( o* h/ d4 S" H%粒子群算法中的两个参数  R( V4 u6 p+ D+ {7 H* Q! D% T5 x
c1 = 1.49445;" P" K2 ?+ T4 y, P+ S2 N6 P/ P
c2 = 1.49445;2 v: o/ W# u; M! f

0 Q/ a( Y8 \3 ~; t

* g/ `. F% F5 c' h1 j9 v- rmaxgen=100;   % 进化次数  4 ?. {& ~) m$ n4 I" }& W
sizepop=20;   %种群规模( U: h. S; i4 K7 v+ S' C1 |
1 G" V4 E- @0 j: K5 `+ A9 {
2 F( j  [; c% p" @$ O3 I1 e' f
Vmax=1;- B$ o5 |! B9 T2 V
Vmin=-1;
) `0 v0 E$ o* npopmax=5;, Y! i& h$ o* l4 p
popmin=-5;9 z' r) ^! }0 Y0 N: [( O5 G
# `! w. u; L; F7 g" i& n- T2 Z
9 C* A$ A$ [( w1 c4 h: @, w
for i=1:sizepop! L# Y0 q! R5 N5 C+ @& s
    pop(i,:)=5*rands(1,21);  E$ Z( \5 R" l6 l  M8 B
    V(i,:)=rands(1,21);* Y& w7 q/ c2 P- V. |0 k5 b! H
    fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn);  这是出错的43行6 n$ ~- O! t* t& N8 g
end
  I7 o2 k" Y# S& Q2 i# v8 k; f' }
6 o0 j. d# I5 o( P! P& j

  I( |( \  X& |$ g8 b& L. ]! y( i( `& [- d& C

: U3 }. m  t% d& A- S1 w' \% 个体极值和群体极值0 @# [' A- G: r" W$ w5 O, G* n  i
[bestfitness bestindex]=min(fitness);6 i# ]0 ]4 h/ ^7 c# y& i$ y
zbest=pop(bestindex,:);   %全局最佳
5 d- Q7 B' q% E+ Lgbest=pop;    %个体最佳# ]6 }7 M# a( v0 `6 s
fitnessgbest=fitness;   %个体最佳适应度值2 B. v( X$ i; @
fitnesszbest=bestfitness;   %全局最佳适应度值$ E# N& V. B) F

* V* K3 ]' T$ n* x; n" A/ E

" @" {. {, M, I7 `9 _%% 迭代寻优
' M- y  Y+ v" t% k+ n. Cfor i=1:maxgen
4 Y. e  H$ j. U. J) _8 C! ^' s3 A    i;
2 H6 H  M! a  J5 X3 h1 x   
% T) u4 a+ C. a( R. _    for j=1:sizepop4 M- W( c3 h, ~) |4 q9 g5 E" G
        ; `, i6 [2 f: _9 l5 Y3 ~, B9 ?. }
        %速度更新( H8 ~/ ~8 b: {7 M; j
        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
: }6 c7 N  O6 T* I5 |! o, o0 \- D        V(j,find(V(j,:)>Vmax))=Vmax;+ j5 T$ t6 \9 }  D
        V(j,find(V(j,:)<Vmin))=Vmin;/ k/ L. d& B' h5 Z1 c* l; E* Z$ E
        $ g: S' \9 Q3 R' b5 b; e! K
        %种群更新
9 k/ c: K  E, g; M        pop(j,:)=pop(j,:)+0.2*V(j,:);7 l; c0 E5 o& a7 ^( y  O9 Y0 a1 W
        pop(j,find(pop(j,:)>popmax))=popmax;9 l, d* R7 c* S5 [
        pop(j,find(pop(j,:)<popmin))=popmin;
& G3 |* Q8 g' u5 b8 k& q0 F        4 T( E, f4 O" d( _0 o" x3 Z, a; {
        %自适应变异
1 N! b- F3 n6 t; F6 N0 L3 P$ D        pos=unidrnd(21);
' x7 J. |" q0 X- k3 c3 x* u! U+ o        if rand>0.95
. W$ j; i. X0 D$ W* ]5 l# e: b            pop(j,pos)=5*rands(1,1);6 U* N& F4 I, s- u" ]6 a: l3 [
        end, H5 _. z) H( ~% S' D. E. R
      % Z/ a8 w! W& }" c. g% \- l
        %适应度值# G+ Q* a& ^2 @* E7 j* ~) N
        fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);
$ e% z+ t2 X$ w: E7 w! j    end$ H* o$ L: U: t; u
   . B  c$ n6 `# ^9 L7 U# H
    for j=1:sizepop& N: u7 P# B+ {+ S" m: Y
    %个体最优更新
: L, X0 z$ |/ K) C' u& e' Z    if fitness(j) < fitnessgbest(j)
+ B1 i$ q' M( o  Y* ~        gbest(j,:) = pop(j,:);
$ Y3 V0 O8 a: y9 _7 i" ]        fitnessgbest(j) = fitness(j);
- E& I7 R( J% n! F4 r7 L    end
4 [: R- m) ?8 \& ~, e8 @9 w$ v   
  {% ]6 J; a5 s  x- W1 L    %群体最优更新. R4 b) r: h  H  l) o8 t" O
    if fitness(j) < fitnesszbest
" _/ `9 b5 P9 K        zbest = pop(j,:);
% c" ^5 C$ r* l7 G        fitnesszbest = fitness(j);5 L4 h- G% F$ L2 j$ t+ ?- j
    end
7 w% M7 X4 M5 Q' x; L8 I& z   ( i; \0 Z2 r9 u, }1 _
    end
+ r* n8 W) m8 `1 v   7 w8 \& ^% X. W6 @: A8 U
    yy(i)=fitnesszbest;   
6 [3 {; s% `6 N0 n  c1 g        
6 \2 N: q6 l" t% |: V- @end
# D4 u1 X* ^' @, O  F! S  |+ F  ~( x, `( e* k( t
6 p4 z4 o5 w: `6 u' R. e
%% 结果分析6 r9 D& T' t3 d0 t
plot(yy)2 }* z3 Z9 n$ T$ p
title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);7 S  x0 F9 \8 w% }4 o7 R; ^
xlabel('进化代数');ylabel('适应度');
6 d! U# N' W" a9 Z9 |8 }4 o; ~+ Y) f' I( t6 B* a4 |' X4 Y6 k
( ]$ Q: w+ i" T: M0 r+ e
x=zbest;" ]- T& p- @8 C3 N% {9 j
%% 把最优初始阀值权值赋予网络预测
6 o; P& q7 [# U2 ^% %用遗传算法优化的BP网络进行值预测
, U/ @8 i& p5 O! O5 H6 c* Pw1=x(1:inputnum*hiddennum);' ^9 l7 T  p6 D# ]4 n% Y  I
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);6 M" M% i6 D( c) X4 y, {
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);2 Y. k+ S- c, z. J8 _* s
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);3 S; n% v! P6 k! W8 Q; Y2 g: L. H6 e
' t9 k5 C9 ^0 Q3 B
6 }1 H( B; Q& p6 [0 |; f) c
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
. i8 L, c. H. z: Unet.lw{2,1}=reshape(w2,outputnum,hiddennum);
* x9 }$ X  v8 j$ _& knet.b{1}=reshape(B1,hiddennum,1);
) w7 H7 B. u0 h; z; s' W* R1 a+ jnet.b{2}=B2;
/ N; u3 [/ K  \! }. z. P2 U7 a" L3 A3 l0 S" G

3 V/ h. H" z- n5 E3 ]%% BP网络训练
& Z, {; G7 k8 r" p% Q%网络进化参数0 E! D' i% D$ y+ D$ Q8 C
net.trainParam.epochs=1000;' T. V/ ~  b1 i
net.trainParam.lr=0.1;
' H0 X+ {& P9 n/ Z%net.trainParam.goal=0.00001;
- f5 j1 x) _# l/ }0 d
* @6 ]4 A" q. H+ ?+ ^. r* w2 ^

7 H' }3 ?; e$ i* [) N%网络训练% U7 |0 W* s+ B, O
[net,per2]=train(net,inputn,outputn);+ Z8 v7 A( `6 t

( v' y: I: s  Q2 V9 G3 h

+ R/ K+ A$ R5 J0 |( S2 k1 Q%% BP网络预测2 ?' ]' B" O% z3 @! a
%数据归一化3 m+ _' S& v2 O. Z4 ]8 V; {
inputn_test=mapminmax('apply',input_test,inputps);
- s. m9 G3 _3 Van=sim(net,inputn_test);
/ z. b. v$ M8 O, itest_simu=mapminmax('reverse',an,outputps);
3 y5 W" Z7 [# A4 Derror=test_simu-output_test;
/ b/ ~( l  S/ @6 o. [% w/ _
( ]! r% v8 |/ I" w# `" n

该用户从未签到

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

该用户从未签到

3#
发表于 2020-7-7 10:09 | 只看该作者
个人认为三处有误
8 t6 c2 m+ X0 R8 A$ u6 m8 [" f一、 pop(i,=5*rands(1,261);随机取值维度过小,正常维度应等于inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum
1 f3 X( s( o$ C1 h二、设置标签矩阵时存在问题,output_train=output(1:800,1)';. [, r9 J8 Q! C3 `
output_test=output(801:1000,1)';索引有误
! k) o: i0 y5 P5 [; N0 A" N" x三、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-24 17:41 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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