matlab的matlab BP神经网络络,请问输入节点是302个吗

最近一段时间在研究如何利用预測其销量个数在网上搜索了一下,发现了很多模型来预测比如利用回归模型、时间序列模型,GM(1,1)模型可是自己在结合实际的工作內容,发现这几种模型预测的精度不是很高于是再在网上进行搜索,发现神经网络模型可以来预测并且有很多是结合时间序列或者SVM(支持向量机)等组合模型来进行预测,本文结合实际数据选取了常用的matlab BP神经网络络算法,其算法原理因网上一大堆,所以在此不必一┅展示并参考了这篇博文,运用matlab 2016a,给出了下面的代码并最终进行了预测

%保存数据到matlab的工作路径里面

%赋值给输出p和输入t

%数据的归一化处理,利用mapminmax函数使数值归一化到[-1.1]之间

%ymin,ymax为需归化到的范围不填默认为归化到[-1,1]

%返回归化后的值y,以及参数psps在结果反归一化中,需要调用

%确萣训练数据测试数据,一般是随机的从样本中选取70%的数据作为训练数据

%15%的数据作为测试数据,一般是使用函数dividerand其一般的使用方法如下:

%建立反向传播算法的BP神经网络,使用newff函数其一般的使用方法如下

%net = newff(minmax(p),[隐层的神经元的个数,输出层的神经元的个数],{隐层神经元的传输函数輸出层的传输函数},'反向传播的训练函数'),其中p为输入数据,t为输出数据

%tf为神经网络的传输函数默认为'tansig'函数为隐层的传输函数,

%purelin函数为输絀层的传输函数

%一般在这里还有其他的传输的函数一般的如下如果预测出来的效果不是很好,可以调节

net.trainParam.lr=0.01;%学习率设置,应设置为较少值太夶虽然会在开始加快收敛速度,但临近最佳点时会产生动荡,而致使无法收敛

% (大型网络的首选算法)

% (大型网络的首选算法)

% (中型网络的首选算法)

%计算仿真其一般用sim函数

%将所得的结果进行反归一化,得到其拟合的数据

%正常输入的数据的反归一化的处理得到其正式值

%做预测,輸入要预测的数据pnew

%误差值的正态性的检验

运行之后的结果如下:

matlab BP神经网络络的结果分析图

训练数据的梯度和均方误差之间的关系图

验证數据的梯度与学习次数

残差的正态的检验图(Q-Q图)

在网上,发现可以通过神经网络工具箱这个GUI界面来创建神经网络,其一般的操作步骤如下:

1:在输入命令里面输入nntool命令或者在应用程序这个选项下找到Netrual Net Fitting 这个应用程序,点击打开就能看见如下界面

2:输入数据和输出数据的导叺(在本文中选取了matlab自带的案例数据)



3:随机选择三种类型的数据所占的样本量的比例,一般选取默认即可


5:训练算法的选取一般是选擇默认即可,选择完成后点击<train>按钮即可运行程序


6:根据得到的结果一般是MSE的值越小,R值越接近1其训练的效果比较,并第二张图给出了鉮经网络的各参数的设置以及其最终的结果其拟合图R越接近1,模型拟合的更好

7:如果所得到的模型不能满足你的需求则需重复上述的步骤直至能够得到你想要的精确度

8:将最终的得到的各种数据以及其拟合值进行保存,然后查看就可以得到所要的拟合值


本例中的数据来自于Matalab提供的内置數据可以通过代码

获得,为方便其他软件读取已经将数据复制粘贴到Excel中

本例中,1至13列为输入变量第14列为输出变量,即输入层包含13个鉮经元输出层又一个神经元。另外设定一个隐含层包括20个神经元

每个神经元包含252个数据点,其中最后一个点不参与训练留作测试最終的模型,即利用前251个数据点训练模型利用最后一个点检验模型

1、点击打开 Matlab ,确保保存的Excel文件和软件路径一致

3、利用 xlsread 函数读取数据其Φ第一格单引号内是文件名称,第二格是工作表位置第三格单引号内是数据范围

执行代码后,新的变量出现在 Workspace 页面中其中,矩阵列表礻各变量行表示各数据

数据录入完成后,继续在Editor界面进行操作

1、首先利用feedforwardnet函数建立模型20表示隐含层包含20个神经元,输入层至隐含层的傳递函数为Hyperbolic tangent函数隐含层至输出层的传递函数为Sigmoid函数

2、对原始数据进行拆分,前251个数据用来训练最后一个用来测试

3、利用train对模型进行训練,遵循反向修改权重的原则

在跳出的训练图中可以看出该模型输入层个神经元,隐含层20个输出层1个。模型训练17次就达到预期要求

4、朂后利用留置的数据进行测试,输出值与目标值的偏差

重复运行代码可以发现每次的结果并不相同,这是因为初始权重是随机设定嘚

由于初始权重是随机设定的,所以每次运行的结果可能有所不同这也体现出神经网络模型的局限性,模型训练找出的误差最小权重可能只是局部上使误差最小的权重这样的权重可能有很多个,所以结果有很多种解决这种问题的一个方法是,留一部分数据不参加训练而是用来测试模型的输出结果,当输出与目标值较为接近时再利用模型进行预测

5、在代码前添加rng(0),则限定了初始权重重复运行代码,将得到相同的结果

在MATLAB中我们可以如此构建一个神經网络 

%隐节点个数设为3.其中隐层、输出层的传递函数分别为tansig和purelin,使用trainlm方法训练

其中,隐藏层节点是3我选取较简单的输入层节点为2,输絀层节点是 1来构建网络

训练好网络后,可用sim函数来运行Simulink模型可通过输入预测输出,例如:


当然input可以是多组数据组成的矩阵,也可以昰一组数据组成的向量如此便可得到预测值。

有的时候我们需要提取已训练好的神经网络,我们可以把它的权值阈值导出,如下代碼可提取出权值阈值的值。



得到权值与阈值的值后我们要代入表达式中,

由于之前构建网络选用的激活函数是tandig purelin,预测结果的数学表達式如下:


代表这个权值是第2层的第1个节点到第3层的第1个节点的权值

在MATLAB中,我将上式整理为如下形式:


其中a,b是输入的两个数

因为版本問题,newff函数有不同的用法区别如下:


上边两种用法,新用法自带归一化构建网络时,自动根据输入输出归一化了旧用法需要手动归┅化。

因为新版本自带归一化新版本网络中的权值和阈值都是对于归一化后的数据,因此在运用神经网络数学表达式时,需要在之前紦输入归一化在之后把输出反归一化。

y是归一化后数据x是归一化前数据,反归一化公式为:

因为神经网络选择的是归一化到(-1,1)所鉯,ymin=-1.ymax=1,输入和输出都是如此

可写成如下,便可得到数学表达式用输入预测输出结果与sim函数一致。





 

 


 
为何要提取表达式呢有的时候,在MATLAB上佷方便的训练好网络后可直接利用训练好的权值阈值在其他工具上使用。

加载中请稍候......

我要回帖

更多关于 matlab bp神经网络 的文章

 

随机推荐