数学建模社区-数学中国
标题:
BP神经网络预测遇到一个疑问,麻烦过来看看
[打印本页]
作者:
数学不烦
时间:
2013-9-8 17:22
标题:
BP神经网络预测遇到一个疑问,麻烦过来看看
本帖最后由 数学不烦 于 2013-9-9 21:56 编辑
4 A; ]: c5 Z* c
2 r: g$ y0 n( ~9 E' F; n/ a
各位朋友,有一个问题请教你们。 我用BP神经网络做预测的时候(下面是我的代码)遇到一个问题。 首先我尝试在代码里面不把数据归一化,这样的出来的结果很差(R=0.46).但我把数据作归一化 与 反归一化 之后 确实R提高了很多(R=0.99),这时问题就来了,请看最下面的测试结果代码,那里只有输入(没有输出,因为是预测),premnmx 归一化要有输出的变量T,但我只有输入数据,没有输出数据,因此反归一的结果(最后的预测结果)也无法做到。那么我的预测就不是做不了吗? 很纠结,查了很多资料了,还是不知道怎么解决。
4 x) z. J' j. Z6 X9 n
国赛准备到了,希望热心的朋友懂的不吝赐教,我把问题写得很认真,希望各位能帮我解决这个问题,谢谢了。
2 U3 s. t0 A* `- T3 C
# |/ M+ T2 z- w/ T" d& D
clear
% l$ y L1 y& E& ~( e) L7 M
clc
$ I1 [0 m/ a( s# `) g; ~% ]! H
%输入数据--以一列作为一个输入数据
0 H. c( ^/ P3 E1 \: e4 w
x1=[227.5 286.9 236.3 300.6 243.0];
" W6 G6 Q$ Q9 R- c+ B! ?% `
x2=[286.9 236.3 300.6 243.0 354.1];
+ S4 x+ B! W" T+ E9 Y& d! t9 H
x3=[236.3 300.6 243.0 354.1 294.1];
/ e; t3 l' Q$ J& m" M
x4=[300.6 243.0 354.1 294.1 361.4];
4 ^! b7 i6 X& T# o S/ ?% Y( O
x5=[243.0 354.1 294.1 361.4 333.7];
& }& L4 g5 Z1 K# | h. x; Z' `; E/ T
x6=[354.1 294.1 361.4 333.7 426.4];
* P2 v7 c: r/ e( O
x7=[294.1 361.4 333.7 426.4 434.4];
- H- b0 f% n0 W! \
x8=[361.4 333.7 426.4 434.4 449.9];
' p: P( P7 |: @; Q8 L" f$ @
x9=[333.7 426.4 434.4 449.9 431.9];
! ~# C+ J; _+ o2 x. ^
9 g' Z: c4 q$ d1 D7 z0 T8 _" [: o& T4 L
P=[x1;x2;x3;x4;x5;x6;x7;x8;x9]';
/ i$ P$ b7 t z8 b2 f1 ]
%输出数据--以一列作为一个输出数据
, ^& r* |, W' |8 d# A
y1=[354.1 294.1 361.4 333.7 426.4];
9 g+ C, @8 [7 P
y2=[294.1 361.4 333.7 426.4 434.4];
4 C9 Y' X1 x5 ]3 i9 N3 f, @6 q
y3=[361.4 333.7 426.4 434.4 449.9];
5 B3 V) Q% X6 h% f- i/ w6 `
y4=[333.7 426.4 434.4 449.9 431.9];
( C2 ?4 q) Q' H: T
y5=[426.4 434.4 449.9 431.9 454.0];
9 I. G; t- W1 T, C0 O" b W
y6=[434.4 449.9 431.9 454.0 655.6];
$ f# t, O+ o9 m% A
y7=[449.9 431.9 454.0 655.6 907.0];
* o& b4 J* B: U5 e' A+ h; U
y8=[431.9 454.0 655.6 907.0 1112.5];
: j* w, n' B9 E3 n& c- z; D( M. `
y9=[454.0 655.6 907.0 1112.5 1401.1];
# C- L- q0 U, R4 O+ j
1 _# _6 O8 L' ?% f0 n& Q: d
T=[y1;y2;y3;y4;y5;y6;y7;y8;y9]';
9 l3 j. p. M5 |- S" @$ s3 P/ X2 t
1 B7 C3 ]9 i8 N1 y8 u) B
%归一化
6 |! S" ^, c; O1 F4 g
% [P,minp,maxp,T,mint,maxt] = premnmx(P,T);
, T9 u! o9 H, \' i7 }8 a$ Q( H7 S6 v9 D
%建立网络
9 n; m$ k3 e$ G" Y
%其中[10,3]代表有一个隐含层,里面有10个神经元;“3”代表有三个输出数据
% U8 m1 b& y/ x$ d
%{'tansig','purelin'}与[10,3]对应,意思为隐含层 与 输出层
, P6 Z5 O d. A J& b5 M
%'traingdm' 表示调整权重,缩小误差的数学函数
" N y! W" a* F
%↓创建一个新的前向神经网络
# I& d2 C* a8 Y4 { m) U* n
net = newff(minmax(P),[6,5],{'tansig','purelin'},'traingdm')
+ C7 z$ r2 f5 P* G& w
% R c" O, k. X% F/ K
% 当前输入层权值和阈值
6 B5 O& a* u6 l' s* Y' |5 m7 K h7 ]
inputWeights = net.IW(1,1)
/ i3 p2 b) k$ h9 `( P* ^; p) L
inputbias = net.b(1)
9 h) q3 y* ^ B
/ b. H }3 k9 s2 u' Z/ S. P
% 当前网络层权值和阈值
' c( P W, M" j2 r& l
layerWeights = net.LW(2,1)
6 J$ C& w9 @, k, S$ I
layerbias = net.b(2)
4 t: l! G. m; ~6 i9 p5 l
0 a! I6 S+ F0 Z7 i
% 设置训练参数
$ j/ [* U; {: X; Z, k& N
net.trainParam.show = 50;
' G/ M7 v* y5 j, C9 @) p9 W
net.trainParam.lr = 0.05;
6 s# z* [6 o' N0 K3 C
net.trainParam.mc = 0.9;
7 N, c7 x; r, y, J+ p
net.trainParam.epochs = 10000; %每计算10000次出一次结果
4 N: R3 G' v% ~$ D: k: l j5 z
net.trainParam.goal = 1e-6; %期望达到的误差(认为是合适的误差)
) g0 Q! p) j# a7 `7 B7 D$ v' [
+ P% d3 l, ~! v
% 调用 TRAINGDM 算法训练 BP 网络
9 Y9 Q& y) E- ]4 d: E( n9 K
[net,tr] = train(net,P,T);
5 V2 n" I8 d% G
; ?; }* |! Y' d
% 对 BP 网络进行仿真
4 p( p% R9 N1 [
A = sim(net,P); %A为输出结果
8 F( D6 Z: U Q( h, Z* N! o7 L
: h! W9 Q J) [8 a* m5 J( o) t
%反归一化
" ]. U) X' Z$ o- r$ ^
% A = postmnmx(A,mint,maxt);
# j4 U' I1 K' v% J) R" k
7 ]/ q5 k# @# m+ O
% 计算仿真误差
/ P6 D$ {2 @* W: I8 s$ A6 G, g
E = T-A; %原来的输出 - 训练输出 = 误差
; U3 z V- Z, x: X9 s
MSE = mse(E) %输出误差
9 T, N+ f' i+ S6 m- a" g& N
; V! H* Y' m4 Y, h' Y3 _- Y' H, Z; _ z) r
%下面是输入数据,测试结果
5 g: e9 h4 C- D& }5 t# D- W4 o
x=[454.0 655.6 907.0 1112.5 1401.1]';
. ?5 R5 a5 L/ e( D$ G6 e& L2 q
Y = sim(net,x)
8 \# F5 t, m4 ^+ a# n) c
作者:
magic2728
时间:
2013-9-9 13:06
要进行预测,必须有对应的新的输入量,你的在哪里?
作者:
kaito1412
时间:
2013-9-9 18:51
用mapminmax可以对P,T分别归一化
作者:
狼之魂汪洋
时间:
2014-8-11 09:51
不知道你最后是怎么解决的,感觉你最后预测的时候没有把输入数据进行归一化,即要对x进行归一化,再对y进行反归一化,这是我的看法,不知道对不对
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5