小弟不才,最近在学神经网络用于我们实验室的一款机器人的动力学辩识,由于最终的程序需要用C/C++编写,另外为了更加深入了解MATLAB神经网络工具箱的原理,因此花了一点时间研究了一下静态神经网络与动态特别是时间序列的神经网络的net数据的提取,与大家分享。

每个神经网络都需要一个network这么一个数据,一般MATLAB给出的变量名为net. 要想将这个net包含的数据提取出来并且用于另外的数据拟合或者控制算法程序,就需要知道net的运算方法与其包含的数据的内容。

重点:1.数据的配置

net的输入与输出数据都会调用一个processFcns(默认为mapminmax函数),正则化以后的数据才会视为net的输入和输出,比如net.inputs{1}.processFcns会返回第一个输入向量的正则化函数。

2.processFcns的参数

以mapminmax函数为例,参数设置processSettings是一个与之对应的结构体,比如mapminmax('apply',data,processSettings)会返回在processSettings下的data正则化后的数据。

3.输入与输出的权值矩阵

比如net.IW{1,1}代表第一个输入向量的权值矩阵,net.LW{2,1}一般为第一个输出向量的权值矩阵(只有一个隐藏层的情况),net.LW的第一行一般为隐藏层的权值矩阵

4.输出的反正则化

就像第一条说的那样net接收的是正则化以后的数据,因此最后的输出需要反正则化,比如mapminmax函数需要调用mapminmax('reverse',output,processSettings)进行反正则化。

掌握以上4条基本上静态的神经网络就没有什么问题了。

以一个简单例子比如MATLAB自带的nnstart fitting app 里房价的那个程序(13个输入1个输出)

如果你想知道houseprice的第9列对应的数据的输出,直接用MATLAB指令是net(houseprice(:,9))即可,但是从上面的理论应该是:

首先正则化所有输入数据:

data=mapminmax('apply',houseprice(:,9),net.inputs{1}.processSettings{1});

其次带入到隐藏层的函数里(默认为tansig)

A=tansig(net.IW{1,1}*data.'+net.b{1});

然后将A带入到output层函数里(默认为purelin)

B=purelin(net.LW{2,1}*A+net.b{2});

最后反正则化

B=mapminmax('reverse',B.net.outputs{2}.processSettings{1});

这个B和net(houseprice(:,9))应该是相等的。

对于时序的动态神经网络,小弟主要学习了open与close两种

以MATLAB自带的一个PH 的例子说明

首先是open的情况(open一般以MATLAB的定义输入one-step ahead,也就是它只能预测下一个时间点的结果,不像close理论上可以预测后面无穷多个时间点结果)

这个例子输入是两个一个是x(t)时序,一个是输入y(t)时序,输入x(t)是一个二维向量,因此对于静态神经网络有些特殊的情况:

1.x(t)与y(t)正则化以后,假设delay设置为3,隐藏层神经元数量为10,则net.IW应该包含两个权值矩阵一个,10X6,和一个10X3,

另外一点权值矩阵与输入相乘时是先乘后面的时间的数据,因此x(t)需要倒序排列,一般可以这么处理:

xt_new=flipud(x(t));

xt_new=flipud(xt_new(:));

因此A=tansig(net.IW{1,1}*xt_new+net.IW{1,2}*y(t)+net.b{1});

后面类似,需要注意的还有一点,假设你的delay设置为2,总共有1000个时间点,则你的数据在一开始需要调用preparert进行拆分,成2个与998个,最后net拟合出来的数据也是998个,这不是与前面拆分的998个相对应的,而是超前了一个时间点,比如y(3)=f(y(1),y(2),x(1),x(2))

2.对于close的情况,则比较特殊,理论上可以预测无穷多个后面的输出,是因为它主要依靠前面的计算最为真实的输出,因此可能误差比open的大。

另外A=tansig(net.IW{1,1}*xt_new+net.LW{1,2}*y(t)+net.b{1});

IW的权值转移到了LW里。

最后欢迎大家讨论。

更多推荐