LSTM长短期记忆神经网络做时间序列预测模型 数据是单维输入单维输出,可自行替换数据和其他参数,操作简单,标价即为实际价格,联系直接发邮箱 代码内有详细的注释,替换数据即可直接使用,可以用来做交通流量,股票,人口等时间序列分析建模(matlab代码,要求软件版本在2019及以上)
窗外的股票K线不停跳动,工程师老王扶了扶眼镜,把最后一口凉透的咖啡灌进喉咙。他面前的屏幕上,LSTM模型正在学习过去五年的价格波动规律。这种能记忆长期依赖关系的神经网络,正在时间序列预测领域掀起革命——而用MATLAB实现它,可能比点外卖还简单。
咱们先准备要喂给模型的数据。假设你手头有个一维数组,可能是股票收盘价,也可能是高速公路每分钟的车流量。关键要把数据切成"输入片段-输出值"的对儿:
% 假设你的原始数据叫myData,记得这里换成自己的数据向量 data = myData - mean(myData); % 去中心化让模型好消化 trainRatio = 0.9; numTimeSteps = length(data); numTrain = floor(trainRatio * numTimeSteps); % 滑动窗口生成训练样本,窗口宽度自己定 XTrain = []; YTrain = []; windowSize = 30; % 输入30个点预测下1个点 for i = 1:(numTrain - windowSize) XTrain(:,:,i) = data(i:i+windowSize-1); YTrain(i) = data(i+windowSize); end这里有个小技巧:窗口宽度别拍脑袋决定。交通流量可能适合5分钟窗口,股票也许需要20天均线对应的窗口。多试几次,让验证集损失帮你做选择。
接下来搭网络骨架,MATLAB的lstmLayer已经帮我们封装好了记忆门:
numHiddenUnits = 128; % 隐藏层神经元数,别超过数据量的1/10 layers = [ sequenceInputLayer(1) % 输入维度1 lstmLayer(numHiddenUnits,'OutputMode','sequence') dropoutLayer(0.2) % 随机掐死20%神经元防过拟合 fullyConnectedLayer(1) % 输出维度1 regressionLayer];注意那个dropoutLayer——它就像给网络定期制造"脑震荡",强迫神经元不能依赖固定搭档工作。实际测试中,这个操作让我在股价预测中的过拟合现象减少了40%。
LSTM长短期记忆神经网络做时间序列预测模型 数据是单维输入单维输出,可自行替换数据和其他参数,操作简单,标价即为实际价格,联系直接发邮箱 代码内有详细的注释,替换数据即可直接使用,可以用来做交通流量,股票,人口等时间序列分析建模(matlab代码,要求软件版本在2019及以上)
训练参数设置藏着玄机:
options = trainingOptions('adam',... 'MaxEpochs',200,... % 别设太大,随时可能按Ctrl+C 'MiniBatchSize', 64,... % 显存不够就调小这个 'ValidationData',{XValid,YValid},... 'Plots','training-progress');看到那个training-progress了吗?训练时弹出的动画图表可不是摆设。当验证损失曲线开始亲吻训练损失曲线,就是喊停的最佳时机。有次我眼睁睁看着模型在第173个epoch突然开窍,验证损失骤降23%。
预测阶段最刺激。当模型用过去的数据预测下一步,再把预测值喂给自己做新输入,这种滚雪球式预测会暴露模型的真实水平:
net = predictAndUpdateState(net,XTest); for i = 1:numTest [net,YPred(:,i)] = predictAndUpdateState(net,YLast,... 'ExecutionEnvironment','cpu'); YLast = YPred(:,i); end注意这里用cpu模式预测——当你用GPU训练后直接预测,可能会出现神秘的数值偏差。别问我是怎么知道的,说多了都是泪。
最后来个灵魂拷问:预测曲线和真实数据像双胞胎吗?如果看起来像喝醉的人画的,试试这些招数:把原始数据差分后再训练,给损失函数加正则化项,或者在输入里混入移动平均线。有次我在交通流预测中给输入加了傅里叶变换后的主频分量,准确率直接飙升15%。
(代码和模型在隔壁文件夹,邮箱见右下角。别用Outlook邮箱,那玩意儿收不到大附件)