这个例子说明了如何一个NARX(非线性自回归与外部输入)神经网络可以建模一个磁悬浮动力系统。
在这个例子中,我们试图建立一个神经网络,可以预测使用控制电流悬浮的磁铁的动态行为。
该系统的特点是磁体的位置和控制电流,这两者都决定了磁体将在瞬间后的位置。
这是一个时间序列问题的例子,其中反馈时间序列(磁铁位置)和外部输入序列(控制电流)的过去值被用来预测反馈序列的未来值。
神经网络非常擅长解决时间序列问题。具有足够多元素的神经网络(称为神经元)可以以任意精度对动态系统建模。它们特别适合于处理非线性动态问题。神经网络是解决这个问题的一个很好的候选者。
该网络将通过使用实际悬浮磁铁的位置响应控制电流的记录来设计。
通过将数据组织成两个矩阵,即输入时间序列X和目标时间序列T,为神经网络建立函数拟合问题的数据。
输入序列X是一个行单元数组,其中每个元素都是控制电流的相关时间步长。
目标系列T是一个行单元阵列,其中每个元素都是悬浮磁铁位置的相关时间步长。
在这里加载这样的数据集。
[x,t] = maglev_dataset;
我们可以查看输入X和目标T的大小。
注意X和T都有4001列。这些表示控制电流和磁铁位置的4001时间步长。
大小(x)大小(t)
Ans = 1 4001 Ans = 1 4001
下一步是创建一个神经网络,学习模拟磁铁如何改变位置。
由于神经网络从随机的初始权重开始,这个例子的结果在每次运行时都会略有不同。随机种子的设置是为了避免这种随机性。但是,对于您自己的应用程序,这不是必需的。
setdemorandstream (491218381)
两层(即一层隐藏层)NARX神经网络可以拟合任何动态的输入输出关系,只要隐含层中有足够多的神经元。不是输出层的层称为隐藏层。
对于这个例子,我们将尝试一个包含10个神经元的隐藏层。一般来说,更困难的问题需要更多的神经元,也许还需要更多的层次。简单的问题需要更少的神经元。
我们还将尝试使用水龙头延迟与外部输入(控制电流)和反馈(磁铁位置)两个延迟。更多的延迟允许网络模拟更复杂的动态系统。
输入和输出的大小为0,因为网络还没有配置为与输入和目标数据匹配。当网络被训练时,就会发生这种情况。
输出y(t)也是输入,它的延迟版本被反馈到网络中。
Net = narxnet(1:2,1:2,10);视图(净)
在我们可以训练网络之前,我们必须使用外部输入和反馈时间序列的前两个时间步长来填充网络的两个tap delay状态。
此外,我们需要将反馈序列同时用作输入序列和目标序列。
PREPARETS函数为我们准备时间序列数据进行模拟和训练。x将由移位的输入和呈现给网络的目标序列组成。Ai是层延迟状态(本例为空,因为没有层到层的延迟),Ts是移位的反馈序列。
现在可以训练网络了。时间步骤被自动划分为训练集、验证集和测试集。训练集用于对网络进行教学。只要网络在验证集上不断改进,训练就会继续进行。测试集提供了一个完全独立的网络精度测量方法。
神经网络训练工具显示了正在训练的网络和用于训练它的算法。它还显示训练期间的训练状态,停止训练的标准将以绿色突出显示。
底部的按钮可以打开有用的图,可以在训练期间和训练结束后打开。算法名称和绘图按钮旁边的链接打开了关于这些主题的文档。
nntraintool
nntraintool (“关闭”)
要查看网络的性能在训练期间是如何提高的,可以单击训练工具中的“performance”按钮,或者调用PLOTPERFORM。
性能是根据均方误差来衡量的,并以对数刻度表示。随着网络的训练,它迅速下降。
展示了每个训练集、验证集和测试集的性能。
plotperform (tr)
现在可以测量经过训练的神经网络在所有时间步长的均方误差。
perf = mse(净,Ts,Y)
Perf = 2.9245e-06
PLOTRESPONSE将向我们展示网络响应与实际磁铁位置的比较。如果模型是准确的,“+”点将跟踪钻石点,并且在底部轴的误差将非常小。
plotresponse (Ts, Y)
PLOTERRCORR显示了时间t的误差e(t)与不同滞后的误差e(t+滞后)的相关性。中线表示均方误差。如果网络已经训练得很好,所有其他的线将会短得多,并且大多数(如果不是全部)将落在红色置信限内。
函数GSUBTRACT用于计算误差。此函数泛化减法以支持单元格数组数据之间的差异。金宝app
E = gsubtract(Ts,Y);ploterrcorr (E)
类似地,PLOTINERRCORR显示了误差与输入之间的相关性,具有不同程度的滞后。在这种情况下,大多数或所有的线都应该在置信度限制之内,包括中心线。
plotinerrcorr (Xs, E)
该网络以开环形式训练,其中目标被用作反馈输入。该网络还可以转换为闭环形式,其中它自己的预测成为反馈输入。
Net2 = closeloop(net);视图(net2)
我们可以用闭环的形式来模拟网络。在这种情况下,网络只给出初始磁铁位置,然后必须使用自己的预测位置递归地预测新的位置。
这很快就会导致预测和实际响应之间的不匹配。即使模型非常好,这种情况也会发生。但有趣的是,看看它们在分离之前匹配了多少步。
同样,PREPARETS在考虑改变的网络的情况下为我们准备时间序列数据。
plotresponse (Ts, Y)
如果应用程序要求我们在实际发生之前一个时间步之前访问预测的磁铁位置,我们可以从网络中删除一个延迟,因此在任何给定的时间t,输出是时间t+1的位置估计。
Net3 = removedelay(net);视图(net3)
我们再次使用PREPARETS为模拟准备时间序列。这一次,网络仍然非常准确,因为它正在进行开环预测,但输出偏移了一个时间步。
plotresponse (Ts, Y)
这个例子说明了如何设计一个神经网络来模拟一个动态磁悬浮系统的行为。
探索其他示例和文档,以更深入地了解神经网络及其应用。