基于深度神经网络(DNN)的多输出数据回归预测 matlab代码,要求2018及以上版本 只出售代码,不负责讲解

最近在折腾一个工业传感器的数据建模项目,需要同时预测三个物理量。传统单输出模型搞不定,试了试MATLAB的深度神经网络工具箱,发现多输出回归还真能玩。直接上干货,分享个即插即用的代码框架。

先造点模拟数据热身(实际项目记得替换真实数据):

% 生成1000样本,10输入特征,3输出目标
X = randn(1000,10);
Y = X*rand(10,3) + 0.1*randn(1000,3); 

数据预处理别偷懒,标准化是基本操作:

[XTrain,muX,sigmaX] = zscore(X);
[YTrain,muY,sigmaY] = zscore(Y);

网络结构设计有个小技巧——输出层神经元数量直接等于目标变量个数。这里用了个带dropout的三层结构:

layers = [
    featureInputLayer(10)  % 输入特征数
    fullyConnectedLayer(64)
    reluLayer
    dropoutLayer(0.3)
    fullyConnectedLayer(32)
    reluLayer
    fullyConnectedLayer(3)  % 输出层节点数=输出变量数
    regressionLayer];

训练参数配置直接影响收敛速度,试了几个组合后发现这个配置比较稳:

options = trainingOptions('adam', ...
    'MaxEpochs',200,...
    'MiniBatchSize',32,...
    'InitialLearnRate',0.001,...
    'LearnRateDropPeriod',50,...
    'ValidationData',{XVal,YVal},...
    'Plots','training-progress');

预测时要记得数据反标准化,不然输出都是z-score值:

YPred = predict(net,XTest);
YPred = YPred.*sigmaY + muY;  % 逆标准化

实测时发现几个坑:

  1. 输出变量量纲差异大时,建议单独做标准化
  2. 验证集loss震荡明显的话,适当加大dropout比例
  3. 输出层别手贱加激活函数,保持线性输出

完整代码跑起来大概长这样:

% 完整流程示例
[X,Y] = generateData();  % 替换自己的数据生成函数

% 数据拆分
partition = cvpartition(size(X,1),'Holdout',0.2);
XTrain = X(partition.training,:);
YTrain = Y(partition.training,:);
XTest = X(partition.test,:);
YTest = Y(partition.test,:);

% 建模与训练
net = trainNetwork(XTrain,YTrain,layers,options);

% 结果评估
mse = mean((YTest - YPred).^2);
fprintf('测试集MSE: %.4f\n',mse);

最后扔个效果对比图(代码生成):

plot(YTest(:,1),YPred(:,1),'ro')
hold on
plot([min(YTest) max(YTest)],[min(YTest) max(YTest)],'b--')
xlabel('实际值'); ylabel('预测值');
title('第一输出变量预测效果');

这套代码在MATLAB 2018b上实测通过,2023版本也能兼容。注意输入数据要转成double型,碰到内存不足的情况可以适当减小batch size。需要自定义修改的话,重点调整网络层数和神经元数量,别动输出层结构就行。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐