%使用用输入输出数据(inputData、outputData)建立网络,
%隐节点个数设为3.其中隐层、输出层的传递函数分别为tansig和purelin,使用trainlm方法训练。
net =newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');
%设置一些常用参数
net.trainparam.goal =0.00001; %训练目标:均方误差低于0.0001
net.trainparam.show =400; %每训练400次展示一次结果
net.trainparam.epochs =15000; %最大训练次数:15000.
net.divideFcn = '';
[net,tr] =train(net,inputData,outputData);%调用matlab神经网络工具箱自带的train函数训练网络
其中,隐藏层节点是3,我选取较简单的输入层节点为2,输出层节点是 1来构建网络。
训练好网络后,可用sim函数来运行Simulink模型,可通过输入预测输出,例如:
input=[4000;20]
simout =sim(net,input); %调用matlab神经网络工具箱自带的sim函数得到网络的预测值
当然,input可以是多组数据组成的矩阵,也可以是一组数据组成的向量,如此便可得到预测值。
有的时候,我们需要提取已训练好的神经网络,我们可以把它的权值,阈值导出,如下代码,可提取出权值阈值的值。
w12 = net.iw{1,1} %第1层(输入层)到第2层(隐层)的权值
b2 = net.b{1} %第2层(隐层)的阈值
w23 = net.lw{2,1} %第2层(输入层)到第3层(输出层)的权值
b3 = net.b{2} %第3层(输出层)的阈值
结果如下:
得到权值与阈值的值后,我们要代入表达式中,
由于之前构建网络选用的激活函数是tandig ,purelin,预测结果的数学表达式如下:
代表这个权值是第2层的第1个节点到第3层的第1个节点的权值。
在MATLAB中,我将上式整理为如下形式:
simy=purelin(w23*tansig(w12*[a;b]+b2)+b3)
其中a,b是输入的两个数。
w23 ,w12 ,b2,b3为上边提取的权值阈值矩阵。
因为版本问题,newff函数有不同的用法,区别如下:
net =newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');% 新
net =newff(minmax(inputData),[3 1],{'tansig','purelin'},'trainlm'); %旧
上边两种用法,新用法自带归一化,构建网络时,自动根据输入输出归一化了,旧用法需要手动归一化。
因为新版本自带归一化,新版本网络中的权值和阈值都是对于归一化后的数据,因此,在运用神经网络数学表达式时,需要在之前把输入归一化,在之后把输出反归一化。
归一化方法为
y=(ymax-ymin)*(x-xmin)/(xmax-xmin)+ymin
y是归一化后数据,x是归一化前数据,反归一化公式为:
x=(y-ymin)*(xmax-xmin)/(ymax-ymin)+xmin
因为神经网络选择的是归一化到(-1,1),所以,ymin=-1.ymax=1,输入和输出都是如此。
可写成如下,便可得到数学表达式用输入预测输出,结果与sim函数一致。
a=2*(a-amin)/(amax-amin)-1;
b=2*(b-bmin)/(bmax-bmin)-1;
simy=purelin(w23*tansig(w12*[a;b]+b2)+b3)
simy=(simy+1)*(simymax-simymin)/2+simymin
为何要提取表达式呢,有的时候,在MATLAB上很方便的训练好网络后,可直接利用训练好的权值阈值在其他工具上使用。