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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
用matlab进行PSO优化BP时,出现了下面的错误,求帮忙!
0 l  v, j! V, ]# ~8 P下面是程序运行出错结果:4 a- _! _3 n  T7 z; ^
索引超出矩阵维度。
+ M3 |, y* L1 b1 F3 a2 f% G+ {* B* b6 R/ T! B2 W
- h1 M9 q" i3 z' t3 B/ k
出错 fun (line 13)
7 B3 a/ T: V6 i1 F. aw1=x(1:inputnum*hiddennum);
( f( D4 v" r; l0 {0 I  ~! a0 ^- Z* q( ]3 I# j
* e5 U9 Z  O1 k1 V+ W6 E
出错 PSO (line 43)
& i  M+ p7 p8 }) u    fitness(i)=fun(pop(i,,inputnum,hiddennum,outputnum,net,inputn,outputn);2 j% D; ]( g& Y! I
( P9 N- R9 G/ P( v# Y
) X! M! w) a6 o5 y' q" Q$ Y# b

8 v2 j# J& I& g) T" E% Pfun函数:; R: g, D3 h% u) l/ X: i  h, ?
function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)
9 @1 r2 N4 r1 \+ S: c* D- [8 y%该函数用来计算适应度值4 p, [. ?; @) S( I$ R1 v- k
%x          input     个体. X- [+ ^* D# Y3 P
%inputnum   input     输入层节点数
) D3 {) ]7 M3 l& c%outputnum  input     隐含层节点数! r: D2 {! e. l9 U$ Z0 c* U
%net        input     网络4 h* A/ C+ y1 I7 b4 S5 W
%inputn     input     训练输入数据3 k! ~8 d8 H) X' N/ b1 a4 ~
%outputn    input     训练输出数据
- D) `* T' `8 |
& k# O7 n2 d/ w& w  |; T%error      output    个体适应度值
- u# j, f* D4 K9 {5 [7 M4 q" Z. U! f3 W' \) C
%提取
* Q! b4 Q) A: Y& @$ U& X% }! W6 vw1=x(1:inputnum*hiddennum);  这是出错的13行# W/ t) j" x: S: z% i/ G
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);6 f/ R$ Q) H" m$ {6 N
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
/ I. L  C1 J1 b/ p  r6 \8 D0 \B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);/ v) w6 \4 q3 s. {, K+ N
8 O7 V- H( v; l

0 o$ }* H* b$ k- C( `7 p( h0 G0 q%网络进化参数
( b$ Z& ~% ^( |" [# [+ A% R+ cnet.trainParam.epochs=1000;
' r; y6 ~& w: S4 I6 j+ Hnet.trainParam.lr=0.1;4 Q+ C; l( L$ F/ T( }& S
net.trainParam.goal=0.00001;/ ^* Z. t" b/ h, h( Z9 _  d+ _
net.trainParam.show=100;
# u/ d% v8 ^0 L7 e3 ^8 f# M/ Vnet.trainParam.showWindow=0;, v2 N* `  X8 D3 Y3 g! L- y( M% C
4 _* |  a% Y' N
%网络权值赋值
8 q$ e0 o+ @+ \- V1 Wnet.iw{1,1}=reshape(w1,hiddennum,inputnum);
: q! d- b. x  ^% f8 Ynet.lw{2,1}=reshape(w2,outputnum,hiddennum);
5 l5 E! p; g' |4 E% k4 ~net.b{1}=reshape(B1,hiddennum,1);
" S' k* o" ~; h4 n5 l# dnet.b{2}=B2;4 `; I0 S2 ]3 {, c" t8 a7 B& q+ L

6 i3 }" N0 E' [%网络训练
. Y- n0 E2 K- x6 k. \6 T" anet=train(net,inputn,outputn);
$ @. ~6 C! B0 ~
1 \* w  p* e( {7 d3 N" j3 U: Wan=sim(net,inputn);9 z6 w1 j5 s$ z% |; r1 u
9 {' C2 e) S% d( P, K5 g
error=sum(abs(an-outputn));8 x5 W3 u- Z) k6 d) _' g4 [
8 t8 N5 {: g% T; ?
主函数:- H) S8 O7 `% m0 K6 I2 f! }3 G
%% 清空环境$ M, z! M* j* n7 q, u: E
clc
8 c1 g4 p3 [: G/ ?% L" Kclear, v, q9 \, [1 V' G2 y. H

9 s& R- i0 Y; ^* f

! E6 u5 C6 F5 `: g5 Z1 s9 Q! W%读取数据+ c+ [3 O' S6 Y( U/ b3 d& Q
load input
' i& d; O8 O7 h: s& }/ Bload output
% L: I- e5 Q% P  ~& m: J, ~: q: v* S# ?: y. ^

5 V: `. ~4 _. ]- R%节点个数
/ e" |  r: I) a% O5 ?) _) V7 Yinputnum=34;
/ L1 [/ \2 m  b0 }- y3 Ohiddennum=7;- B/ M% z; u3 y: @% X
outputnum=2;
9 y! S7 I  N: X4 l; _2 a
# V" h4 g5 D( m; \1 V

, H+ O8 M) J( k- [: i  a0 Y; H- n2 x) Y%训练数据和预测数据
" s7 M% w  H! _" ^" Linput_train=input(1:800,';
% L4 W% H9 \" P1 ^8 n3 b1 M, ?input_test=input(801:1000,';
" Q# {6 W/ `- |. T: toutput_train=output(1:800)';
! j% `, o6 n8 l5 U" Voutput_test=output(801:1000)';# m8 f- K6 i. c9 J7 S7 ]: O

2 ~3 Y8 e) D5 y* b- [( c

: v9 R& K8 f+ B/ U5 m) z0 l/ [% s%选连样本输入输出数据归一化" w8 u: F) _! j- d' P2 X) l% j5 v
[inputn,inputps]=mapminmax(input_train);
* p. k% X9 r  j4 p" K[outputn,outputps]=mapminmax(output_train);
2 |. y& L) k3 o! N9 ?* g2 R( J, h  w

! \# `; i4 ^, B' }$ w5 u9 J%构建网络
9 z& j) c* T! Anet=newff(inputn,outputn,hiddennum);
1 u9 H+ P' [6 v6 R, y1 J! L8 s0 D5 e0 D% M% V- u3 E1 [
2 p4 E" j* \( r$ _0 ]
% 参数初始化
2 t) R9 W. m; P6 Q3 X%粒子群算法中的两个参数3 L* V# q. `% J! J
c1 = 1.49445;
8 e& T9 X% t3 Q: ]: n2 B" A! jc2 = 1.49445;
7 q, ^3 I$ s1 ?% P9 G/ y/ Z1 P/ N7 h  N  f! S5 G2 _$ D( u2 K9 {

8 d4 y6 [- K; j4 ?6 }* m8 X: _1 J& [maxgen=100;   % 进化次数  
9 O' Q9 s5 G& Z. esizepop=20;   %种群规模
0 V" G3 K3 n, {4 V1 _4 O) C
* W% D0 h/ J9 T7 f
+ q+ R$ j5 F1 R
Vmax=1;5 s$ _! V9 Z& k' m% V6 x9 K
Vmin=-1;
4 Y$ y3 h; W$ Q0 R: ?& [popmax=5;
3 @0 X" M8 p' t# E- m4 S7 hpopmin=-5;# @9 F( z. T" k

' I/ O2 A' d4 u2 N$ i" U% ^/ R* J+ J
( N' a4 K7 n& x7 {7 r- Z/ h
for i=1:sizepop
; ?* t4 ], h* a9 p0 U    pop(i,:)=5*rands(1,21);6 ~/ ~1 |& Y* A5 S& U2 A+ M
    V(i,:)=rands(1,21);
2 K, F4 |7 r* O" c- @  W6 ]    fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn);  这是出错的43行
# e+ v# c) h% wend% v# \0 n) n( d9 r
) L: }) o: J( k5 X) Z7 [( @

% |  S2 W# b- |
) R3 U) W, \3 r

, o" p6 J( y* {) {  b% 个体极值和群体极值0 d8 V- f% U+ K& t  y1 A4 ^
[bestfitness bestindex]=min(fitness);/ C( D" J; ~- o! f5 ]+ l9 [# C9 y
zbest=pop(bestindex,:);   %全局最佳9 A  ]  g( [9 R
gbest=pop;    %个体最佳
' J, P2 _! b( r3 i9 hfitnessgbest=fitness;   %个体最佳适应度值9 T$ \% J4 z3 j  W
fitnesszbest=bestfitness;   %全局最佳适应度值1 _1 Y3 i+ n1 K- q

- w. J8 D, H8 p' a4 q4 _+ e

8 E. m4 I3 `; D& S%% 迭代寻优1 d: q* M, T0 o0 A
for i=1:maxgen
- o% b0 d+ M1 V' Z+ \    i;
3 h+ U* E! s  h5 z+ L0 @* i   " k  w5 U& t0 C" ~
    for j=1:sizepop
  ?5 n( `  a# y        3 P5 F5 k' G8 `
        %速度更新- @* h; j, A+ Y( q3 F- S+ I
        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));6 U  z# ]  p# b: M
        V(j,find(V(j,:)>Vmax))=Vmax;0 M/ t& {% _: p) i# `
        V(j,find(V(j,:)<Vmin))=Vmin;
3 Z2 T" a8 t  x9 J        . n' ?- }. Q! |3 l
        %种群更新( m( ?0 b7 X2 f7 b  B2 r" N7 r
        pop(j,:)=pop(j,:)+0.2*V(j,:);9 o$ c7 a0 `9 v
        pop(j,find(pop(j,:)>popmax))=popmax;. L" Y- X) n8 q9 v* ]. u, t. b* q2 R
        pop(j,find(pop(j,:)<popmin))=popmin;
% V9 I+ m' V+ L# C0 U        
" i9 z$ j; M; ]# {7 ^7 j        %自适应变异
2 x) [4 ^; J$ _) W/ K3 ~. W* X8 _        pos=unidrnd(21);
# E7 w6 g& P) m/ ~! D. o1 R        if rand>0.95
# r" }( y2 \1 a            pop(j,pos)=5*rands(1,1);
( @4 P' q2 x/ c- q9 X        end: r$ _& g0 k1 c; k
      
1 t4 ^7 S' N5 Y$ O        %适应度值
" i7 D2 x' a0 i3 v/ X        fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);: p7 A6 R* S0 z( Z" Z' U' N  O
    end
% Z) P& V  S1 h! c; G* X9 e& \+ O2 c   ; _; }6 y$ z$ I5 e! }4 e
    for j=1:sizepop8 y" A6 i# E( v0 V; a3 ?' G
    %个体最优更新
  y0 W, e9 c/ x2 W, I    if fitness(j) < fitnessgbest(j)
3 J  Y0 R. B* |6 H+ x8 l        gbest(j,:) = pop(j,:);
0 ^6 U0 o: h1 A, S  A9 t        fitnessgbest(j) = fitness(j);$ Z+ ~7 j3 G$ H2 R+ e9 c
    end
4 s" W2 g) z4 F* H/ T: f0 H   
" C/ |/ W8 X# G: |% M2 p    %群体最优更新
( d9 G: {+ x- [+ ?    if fitness(j) < fitnesszbest
  q' m' u5 b7 E        zbest = pop(j,:);
! @( ~9 S# b% g( _4 Z. w        fitnesszbest = fitness(j);% i* d' M4 d5 N: H
    end
0 U+ n) w' A! Y   : B8 F# h0 _2 s
    end' @, X9 Z  |9 N) U
   ( G9 H& z6 `3 M" R& h6 J
    yy(i)=fitnesszbest;   2 h5 B" r% \3 [! d3 u
        
/ `+ U7 V  n+ Q+ U/ |! g2 aend" Z3 o/ t5 U3 @7 @8 O& L
# T7 M6 W/ K) x, k% x
( h% n5 {) K; Q+ X' L
%% 结果分析1 b  T/ j( m; V6 b7 X) v1 A( g7 o
plot(yy)* h$ p# ]5 G1 T4 o
title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
9 b$ b3 ~3 ~8 e0 S& `xlabel('进化代数');ylabel('适应度');3 C  M2 @' d) k1 ]1 h
5 o& L8 J4 r; F1 t

* H- x1 b: [: Q6 @; K' U( ux=zbest;
  c: Y% K- l+ y; }5 n%% 把最优初始阀值权值赋予网络预测
7 M, E; d0 s: T9 T6 A4 c2 r% %用遗传算法优化的BP网络进行值预测
5 u% Z+ r) J8 y: `; qw1=x(1:inputnum*hiddennum);6 B2 M* O+ \" N) l& {+ J
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);; [: s0 A( i/ K4 Q: L$ M
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);8 {( _& r) y' U; a( k! z, ?. x
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
- s4 V& Q' q, T- g1 k! E6 \- j& r# |, {+ `* b9 t+ G* ~

0 U6 d  w' K* y! @+ L$ Qnet.iw{1,1}=reshape(w1,hiddennum,inputnum);: a# D# a! ^9 H; D8 R9 v
net.lw{2,1}=reshape(w2,outputnum,hiddennum);) O# z! F* ~, y* @, A7 c; E' M( j1 ]" z
net.b{1}=reshape(B1,hiddennum,1);5 o) |  t3 n' ~* e: F
net.b{2}=B2;. ?5 z9 p" L1 _% r6 A
) Q8 k' ~9 P$ J3 j

) t8 F. x; s1 z; b$ u2 A6 h4 k1 c# z) b%% BP网络训练2 P" w- A. b% i! r2 u4 c7 Q& o
%网络进化参数
" M$ a( f) {1 v" [% x# H# znet.trainParam.epochs=1000;
2 _2 P3 m; `2 fnet.trainParam.lr=0.1;* r1 b% f  X1 i  F3 ~
%net.trainParam.goal=0.00001;
) x! ]- C  p1 y
3 r& t. _8 C- d7 K7 G

5 {( w% j6 q* N& _* ~' ]4 {%网络训练; U- G/ }. A# v1 D
[net,per2]=train(net,inputn,outputn);5 ]# ]4 X& u- {) w4 @
: R; ]5 F) J, K

2 w  t2 }# p1 U  w) B+ S%% BP网络预测
$ _2 L& n; _5 K%数据归一化
9 q- ~' H0 Z( n3 ~1 uinputn_test=mapminmax('apply',input_test,inputps);
8 `2 R) d+ D2 ~2 y9 R! uan=sim(net,inputn_test);- `+ C8 l$ W4 ?9 K! |
test_simu=mapminmax('reverse',an,outputps);
8 b7 Y! M8 b4 A/ v# c6 D/ Jerror=test_simu-output_test;: a$ f2 i$ R6 s
# V4 J$ w8 Y' P7 P: N/ u

该用户从未签到

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

该用户从未签到

3#
发表于 2020-7-7 10:09 | 只看该作者
个人认为三处有误  R! R8 d  l" W+ J! B; ^% b1 V6 |
一、 pop(i,=5*rands(1,261);随机取值维度过小,正常维度应等于inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum
3 V; t0 j/ Z+ q  R二、设置标签矩阵时存在问题,output_train=output(1:800,1)';* {0 w8 C: {" ^% X+ c9 c
output_test=output(801:1000,1)';索引有误
5 |" H+ g) p! T三、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 22:30 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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