1、样本数据太少,用BP网络预测可能并非好选择。说不定用一般的回归分析效果更好。
2、要对Y进行预测,需要知道2015年的影响因素X1~X7才行吧?
BP神经网络的参考程序:
data = [ ...2009 2102.13 108.69 1104.99 888.45 700.6 64.28 8204.5 17502.1
2010 2701.61 132.74 1456.64 1121.64 839.02 99.58 9100 20760.52
2011 3636.62 208.22 2002.1 1426.29 1111.12 123.09 10086.88 29286.8
2012 4164.32 229.05 2303.9 1631.37 1293.62 176.42 12005.115 33720.1
2013 4672.91 247.21 2583.75 1841.95 1480.84 181.9 13136.77 39131
2014 5157.97 257.63 2872.01 2028.33 1666.75 200.87 15110 42194
]
year = data(:,1)
p = data(:,2:8).'
t = data(:,9).'
net = newff(p,t,10)
net = train(net,p,t)
y1 = sim(net,p(:,end))
由于没有2015年的X1~X7数据,最后一句用2014年的数据进行测试。
如果用多元线性回归:
c=regress(t',p')y2=c'*p(:,end)
由于样本数量太少(少于影响因素的数量),这种情况下,实际上回归的结果可以几乎没有误差(只有数值误差)。当然,用于预测是否准确要另当别论。
问题:
1:隐含层的节点数应该小于训练样本数(你这里et_1=newff(minmax(P),[150,1],{'tansig','purelin'},'traingdm')中的150远远大于训练样本数10个(1989:2003))
2:如果把时间当做样本输入的话,这是不太合适的。如果那样还不如用时间序列求解。而且在现在的这个程序中还会会出现ynhj88311说的那种情况。(这里还应该做归一化处理更好)
clc
clear
date=1988:2003
P0=[ 0.1093 0.1110 0.1127 0.1141 0.1154 0.1164 0.1171 0.1175 0.1178 0.1179 0.1179 0.1178 0.1179 0.1180 0.1182 0.1186]% 样本数据这里数据在0~1之间就不用归一化处理了
plot(date,P0,'b+') %原数据随时间变化的曲线
hold on
title('原数据曲线图')
for i=1:13
P(:,i)=P0(i:i+2)
T(:,i)=P0(i+3)
end
% 创建一个新的前向神经网络
net_1=newff(minmax(P),[10,1],{'tansig','purelin'},'traingdm')
% 设置训练参数
net_1.trainParam.show = 1
net_1.trainParam.lr = 0.2
net_1.trainParam.mc = 0.9
net_1.trainParam.epochs=10000000
net_1.trainParam.goal = 1e-10
% 调用 TRAINGDM算法训练 BP 网络
[net_1,tr]=train(net_1,P,T)
% 对 BP 网络进行仿真
A = sim(net_1,P)
E = T - A
MSE=mse(E)
P2001=sim(net_1,[0.1179 0.1178 0.1179 ]')
P2002=sim(net_1,[0.1178 0.1179 0.1180 ]')
P2003=sim(net_1,[0.1179 0.1180 0.1182 ]')
p2=P0(14:16)'
yuce2004=sim(net_1,p2)
figure
Y=[A(1,:),P2001,P2002,P2003,yuce2004]
Date=[date,2004]
plot(Date,Y,'r+')
P=[。。。]输入T=[。。。]输出% 创建一个新的前向神经网络
net_1=newff(minmax(P),[10,1],,'traingdm')
% 当前输入层权值和阈值
inputWeights=net_1.IW
inputbias=net_1.b
% 当前网络层权值和阈值
layerWeights=net_1.LW
layerbias=net_1.b
应该没问题吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)