我实现了一个两层神经网络(根据柯尔莫哥洛夫-阿诺德定理,这足以表示n个变量的任何非线性函数)来预测时间序列。然而,到神经网络结束时,接收到的预测的波动性几乎降至零,并变成一条直线(我附上预测屏幕和神经网络的源代码)。我增加了隐藏层神经元的数量、epoch的数量、训练样本的大小、学习率,改变了训练样本数据归一化的范围,改变了初始权重的范围。没有任何帮助。训练样本大小为336个样本,训练方法为误差反向传播,归一化方法为极小极大。而且,当使用双曲正切作为激活函数时,情况有所改善,但图形看起来也很奇怪。 ReLU 输出“直接预测”。有人对这个问题有什么想法吗?
import random
import sys
import numpy
import math
eta=0.0001 #learning rate
n=200 #number of training epoch. There were also 500, 1000, 5000
inp=30 #input layer size
m=60 #hidden layer size
y=0 #output signal
t=0 #target signal
e=0 #error
d_y=0 #local gradient for the last neuron
err=0 #calculated network error for output neuron
err_av=0 #average network error
path='dataTrain.txt' #training sample
path2='dataLaunch.txt' #launching a forecast
day = 365 #number of days of forecasting
...
其余的在网站上:https://ideone.com/vV2QW6
屏幕截图(激活函数 - sigmoid):https://ibb.co/GHrTGLr
屏幕截图(激活函数 - 双曲正切):https://ibb.co/WHFX3Sc
感谢关注。
这个问题很难回答,因为您正在尝试使用并非为此目的设计的工具来解决时间序列问题。 RNN 或 LSTM 会更合适。
根据我阅读您编写的代码的理解,您似乎已经固定了输入大小(至 30 天)来预测第 31 天。然后滑动 30 天窗口以包含该预测(并排除第一天),以便您可以预测第 32 天。如果我的理解是正确的,你遇到的现象可以简单地解释(我希望):
第 31 天和第 32 天的预测不会有太大不同,因为它们是根据非常相似的输入得出的。 32 和 33 等也是如此。最终所有输入都变得更加相似(因为这些包括我们建立的相似预测)并且输出变得更加相似,直到你得到看起来恒定的东西。
我建议在代码中切换 MLP 架构。基于 Kolmogorov-Arnold 表示定理的原理创建了一类新的 ANN 网络 - Kolmogorov-Arnold 网络(或 KAN)。我建议改为研究它,因为它的设计目的是“训练激活函数”而不仅仅是调整权重。在您提到的示例中,具有相同激活函数的不同数据集上的性能可能会有所不同,因此 KAN 代表了一种更灵活的方法。
在本文中 KAN 网络完全用于时间序列分析,并与更传统的时间序列分析方法(例如 Galletti_Lance 的回复中提到的 LSTM)进行了比较。