当前位置: 首页 > news >正文

LSTM长短期记忆神经网络分位数回归多输入单输出(Matlab) 1.输入多个特征,输出单个特...

LSTM长短期记忆神经网络分位数回归多输入单输出(Matlab) 1.输入多个特征,输出单个特征,分位数回归,区间预测 2.运行环境matlab2020b 所有程序经过验证,保证有效运行。

直接上干货。咱们今天聊点硬核的——用Matlab搞LSTM分位数回归做多变量区间预测。这玩意儿在电力负荷预测、股票波动率估计这些需要风险预警的场景特实用,毕竟光预测个平均值没劲,得知道预测结果的上下限才靠谱。

先看数据准备。假设我们有10个特征变量(比如温度、湿度、风速等)影响目标变量(比如用电量)。数据标准化用mapminmax最省事:

[input_train,ps_input] = mapminmax(feature_data',0,1); [output_train,ps_output] = mapminmax(target_data',0,1);

注意这里转置操作符',Matlab的LSTM要求数据格式是特征数×样本数,别搞反了。建议把原始数据存成Excel,用xlsread导入比较稳。

网络结构是关键。上Bidirectional LSTM能捕捉前后时序关系,比单向的强。核心代码这样写:

layers = [ sequenceInputLayer(inputSize) bilstmLayer(128,'OutputMode','sequence') dropoutLayer(0.2) fullyConnectedLayer(3) % 对应三个分位数输出 ];

这里有个骚操作:最后全连接层输出3个节点,对应0.1、0.5、0.9三个分位数。想改分位点数值?直接改数组就行,比如[0.05,0.5,0.95]。

LSTM长短期记忆神经网络分位数回归多输入单输出(Matlab) 1.输入多个特征,输出单个特征,分位数回归,区间预测 2.运行环境matlab2020b 所有程序经过验证,保证有效运行。

损失函数得自己定制。分位数损失不是MSE那套,得用这个公式:

$$Loss = \frac{1}{N}\sum{i=1}^{N} \max(q(yi - \hat{y}i), (q-1)(yi - \hat{y}_i))$$

Matlab实现用dlarray处理自动微分:

function loss = quantileLoss(predictions, targets, tau) errors = targets - predictions; loss = mean(max(tau*errors, (tau-1)*errors)); end

训练时别开accelerator,老版本可能有兼容问题。建议用CPU模式,batchsize设32或64:

options = trainingOptions('adam', ... 'MaxEpochs',200,... 'MiniBatchSize',64,... 'GradientThreshold',1,... 'ExecutionEnvironment','cpu',... 'Plots','training-progress');

预测结果要做反向归一化:

YPred = predict(net,XTest); YPred_inv = mapminmax('reverse', YPred, ps_output);

可视化部分建议用带状图展示预测区间:

fill([1:numTest, numTest:-1:1],... [upperQuantile, fliplr(lowerQuantile)],... [0.8 0.9 0.9], 'EdgeColor','none') hold on plot(medianQuantile,'LineWidth',2)

踩过最大的坑是序列长度对齐。建议训练时用padding处理不等长序列,但验证集别这么干。遇到loss震荡的话,试试把学习率从3e-4降到1e-4,亲测有效。

完整代码跑通后建议保存成mat文件,下次直接load网络用。注意2020b开始支持ONNX格式导出,需要部署到其他平台的话这个很方便。

http://www.jsqmd.com/news/326985/

相关文章:

  • 高性能日志库C++实现
  • 【题解】P10664 BZOJ3328 PYXFIB
  • 在你的Node.js项目中轻松集成WhatsApp功能!
  • 自动化机器学习(AutoML)库TPOT使用指南
  • C++中的职责链模式
  • 双十一秒杀:如何让1万人同时抢1瓶水,系统却不崩?
  • 给女朋友选口红色号?这简直是完美的「分类算法」实战!
  • Python包管理神器:pip的十大高级用法
  • 理解并使用Proxy 和 Reflect
  • C++中的对象池模式
  • 【题解】AT_agc003_e [AGC003E] Sequential operations on Sequence
  • 【题解】P3641 [APIO2016] 最大差分
  • 【题解】P5955 [POI 2018] Pionek
  • 五个值得关注的Python新库
  • 中医执医机构选择:我们应该选哪个课程好?
  • 【题解】P14303 [GCJ 2011 Finals] Runs 加强版
  • 【题解】SP3912 MTREECOL - Color a tree
  • 【题解】P10832 [COTS 2023] 传 Mapa
  • Agent设计模式学习(基于langchain4j实现)(9) - 人机协同
  • C++与Java性能对比
  • 为什么Python依然是初学者最好的选择?
  • 更优雅的测试:Pytest框架入门
  • 【kali显示界面太小?一步教你解决】
  • Python深度学习入门:TensorFlow 2.0/Keras实战
  • 【题解】CF946E Largest Beautiful Number
  • 自定义内存布局控制
  • 嵌入式LinuxC++开发
  • 【题解】P14224 [ICPC 2024 Kunming I] 子数组
  • 自定义操作符重载指南
  • Python游戏中的碰撞检测实现