最大的可能性是没有归一化。具体原因见下:
下面这个是经典的Sigmoid函数的曲线图:
如果不进行归一化,则过大的输入x将会导致Sigmoid函数进入平坦区,全部趋近于1,即最后隐层的输出全部趋同。输出层是个purelin,线性组合后的输出层输出当然也全是几乎相同的了。
使用matlab进行归一化通常使用mapminmax函数,它的用法:
[Y,PS] = mapminmax(X,YMIN,YMAX)——将数据X归一化到区间[YMIN,YMAX]内,YMIN和YMAX为调用mapminmax函数时设置的参数,如果不设置这两个参数,这默认归一化到区间[-1, 1]内。标准化处理后的数据为Y,PS为记录标准化映射的结构体。我们一般归一化到(0,1)区间内。希望采纳哦!
谷歌人工智能写作项目:小发猫
下列代码为BP神经网络预测37-56周的销售量的代码:
% x为原始序列
load 销售量.mat
data=C
x=data';
t=1:length(x);
lag=2;
fn=length(t);
[f_out,iinput]=BP(x,lag,fn);
%预测年份或某一时间段
t1=fn:fn+20;
n=length(t1);
t1=length(x)+1:length(x)+n;
%预测步数为fn
fn=length(t1);
[f_out,iinput]=BP(x,lag,fn);
P=vpa(f_out,5);
[t1' P']
% 画出预测图
figure(6),plot(t,x,'b*-'),hold on
plot(t(end):t1(end),[iinput(end),f_out],'rp-'),grid on
xlabel('周数'),ylabel('销售量');
str=['BP神经网络预测',num2str(length(x)+1),'-',num2str(length(x)+20),'周的销售量'];
title(str)
str1=['1-',num2str(length(x)),'周的销售量'];
str2=[num2str(length(x)+1),'-',num2str(length(x)+20),'周的预测销售量'];
legend(str1,str2)
运行结果
%画出预测输出结果和期望输出结果图
figure;
plot(output_fore,':og');
hold on;
plot(output2_lianghua','-*');
legend('预测输出','期望输出');
title('BP网络预测输出','fontsize',12);
ylabel('函数输出','fontsize',12);
xlabel('样本','fontsize',12);
%画出预测结果误差图
figure
plot(error,'-*')
title('BP网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)
用matlab求预测一组数据的bp神经网络模型,可以分
1、给定已经数据,作为一个原始序列;
2、设定自回归阶数,一般2~3,太高不一定好;
3、设定预测某一时间段
4、设定预测步数
5、用BP自定义函数进行预测
6、根据预测值,用plot函数绘制预测数据走势图
其主要实现代码如下:
clc
% x为原始序列(行向量)
x=[208.72 205.69 231.5 242.78 235.64 218.41];
%x=[101.4 101.4 101.9 102.4 101.9 102.9];
%x=[140 137 112 125 213 437.43];
t=1:length(x);
% 自回归阶数
lag=3;
%预测某一时间段
t1=t(end)+1:t(end)+5;
%预测步数为fn
fn=length(t1);
[f_out,iinput]=BP(x,lag,fn);
P=vpa(f_out,5);
A=[t1' P'];
disp('预测值')
disp(A)
% 画出预测图
figure(1),plot(t,iinput,'bo-'),hold on
plot(t(end):t1(end),[iinput(end),f_out],'rp-'),grid on
title('BP神经网络预测某地铁线路客流量')
xlabel('月号'),ylabel('客流量(百万)');
运行结果:
从图中Neural
Network可以看出,你的网络结构是两个隐含层,2-3-1-1结构的网络,算法是traindm,显示出来的误差变化为均方误差值mse。经过482次迭代循环完成训练,耗时5秒。相同计算精度的话,训练次数越少,耗时越短,网络结构越优秀。达到设定的网络精度0.001的时候,误差下降梯度为0.0046,远大于默认的1e-5,说明此时的网络误差仍在快速下降,所以可以把训练精度目标再提高一些,比如设为0.0001或者1e-5。
建立BP神经网络预测 模型,可按下列步骤进行:
1、提供原始数据
2、训练数据预测数据提取及归一化
3、BP网络训练
4、BP网络预测
5、结果分析
现用一个实际的例子,来预测2015年和2016年某地区的人口数。
已知2009年——2014年某地区人口数分别为3583、4150、5062、4628、5270、5340万人
执行BP_main程序,得到
[ 2015, 5128.呵呵3946380615234375]
[ 2016, 5100.5797325642779469490051269531]
代码及图形如下。
plot(x1,x2,'DisplayName','x2 vs. x1','XDataSource','x1','YDataSource','x2');figure(gcf)
x1,x2就是2组数据。
我觉得一个很大的原因是你预测给的输入范围(2014-)超出了训练数据的输入范围(2006-2013),神经网络好像是具有内插值特性,不能超出,你可以把输入变量-时间换成其他的变量,比如经过理论分析得出的某些影响因素,然后训练数据要包括大范围的情况,这样可以保证预测其他年份的运量的时候,输入变量不超出范围,最后预测的时候给出这几个影响因素的值,效果会好一点。
预测的话,规律应该包含在训练数据里面,让神经网络去学习,如果你都不知道变化规律,怎么能指望神经网络预测未来?
有关时间序列的问题也有其他的方法
BP神经网络预测的步骤:
1、输入和输出数据。
2、创建网络。fitnet()
3、划分训练,测试和验证数据的比例。net.divideParam.trainRatio; net.divideParam.valRatio;net.divideParam.testRatio
4、训练网络。 train()
5、根据图表判断拟合好坏。ploterrcorr();parcorr();plotresponse()
6、预测往后数据。net()
7、画出预测图。plot()
执行下列命令
BP_prediction
得到结果:
[ 2016, 14749.呵呵6798210144042969]
[ 2017, 15092.847215188667178153991699219]
[ 2018, 15382.150005970150232315063476562]
[ 2019, 15398.85769711434841156005859375]
[ 2020, 15491.935150090605020523071289062]
plot(x1,x2,;DisplayName;,;x2 vs. x1;,;XDataSource;,;x1;,;YDataSource;,;x2;);figure(gcf)x1,x2就是2组数据。