卷机神经网络CNN做多输入多输出的拟合预测建模。 程序内注释详细直接替换数据就可以使用。 程序语言为matlab。 程序直接运行可以出拟合预测图,线性拟合预测图,多个预测评价指标。

在机器学习的世界里,卷积神经网络(CNN)通常用于图像识别等领域,但其实它在多输入多输出的拟合预测建模中也能发挥强大的作用。今天咱们就来聊聊怎么用 Matlab 实现基于 CNN 的多输入多输出拟合预测建模。

一、整体思路

我们的目标是构建一个 CNN 模型,它能够接收多个输入数据,并输出对应的预测结果。这些输入数据可以是不同维度、不同类型的数据,通过 CNN 的特征提取和映射能力,将其转化为我们需要的预测值。

二、Matlab 代码实现

% 1. 数据准备
% 假设我们有两个输入数据集 X1 和 X2,它们的维度分别为 [样本数, 特征维度1] 和 [样本数, 特征维度2]
% 以及对应的输出数据集 Y,维度为 [样本数, 输出维度]
load('input_data1.mat'); % 替换为实际数据文件名
X1 = input_data1;
load('input_data2.mat'); % 替换为实际数据文件名
X2 = input_data2;
load('output_data.mat'); % 替换为实际数据文件名
Y = output_data;

% 将数据分为训练集和测试集
trainRatio = 0.8;
numSamples = size(X1, 1);
numTrain = floor(trainRatio * numSamples);
trainIndex = 1:numTrain;
testIndex = (numTrain + 1):numSamples;

X1Train = X1(trainIndex, :);
X2Train = X2(trainIndex, :);
YTrain = Y(trainIndex, :);

X1Test = X1(testIndex, :);
X2Test = X2(testIndex, :);
YTest = Y(testIndex, :);

% 2. 构建 CNN 模型
layers = [
    sequenceInputLayer(size(X1, 2)) % 输入层,对应第一个输入数据维度
    convolution1dLayer(5, 16, 'Padding', 'same') % 1D 卷积层,卷积核大小 5,16 个滤波器
    batchNormalizationLayer % 批归一化层
    reluLayer % 激活函数层
    maxPooling1dLayer(2) % 最大池化层,池化大小 2
    
    sequenceInputLayer(size(X2, 2)) % 第二个输入数据的输入层
    convolution1dLayer(5, 16, 'Padding', 'same')
    batchNormalizationLayer
    reluLayer
    maxPooling1dLayer(2)
    
    concatenationLayer(2, 'Name', 'concat') % 连接两个分支的输出
    
    fullyConnectedLayer(32) % 全连接层
    reluLayer
    fullyConnectedLayer(size(Y, 2)) % 输出层,输出维度与实际输出一致
    regressionLayer]; % 回归层,用于拟合预测

% 3. 训练模型
options = trainingOptions('adam',...
    'MaxEpochs', 100,...
    'MiniBatchSize', 32,...
    'InitialLearnRate', 0.001,...
    'Shuffle', 'every-epoch',...
    'Plots', 'training-progress');

net = trainNetwork([X1Train; X2Train], YTrain, layers, options);

% 4. 预测
YPred = predict(net, [X1Test; X2Test]);

% 5. 评价指标计算
mseValue = mse(YPred, YTest); % 均方误差
rmseValue = sqrt(mseValue); % 均方根误差
maeValue = mae(YPred, YTest); % 平均绝对误差

fprintf('均方误差 MSE: %.4f\n', mseValue);
fprintf('均方根误差 RMSE: %.4f\n', rmseValue);
fprintf('平均绝对误差 MAE: %.4f\n', maeValue);

% 6. 绘图
figure;
subplot(2,1,1);
scatter(YTest(:, 1), YPred(:, 1)); % 以第一个输出维度为例绘制散点图
xlabel('实际值');
ylabel('预测值');
title('拟合预测散点图');

subplot(2,1,2);
plot(1:size(YTest, 1), YTest(:, 1), 'b', 'DisplayName', '实际值'); % 绘制线性拟合预测图
hold on;
plot(1:size(YPred, 1), YPred(:, 1), 'r--', 'DisplayName', '预测值');
xlabel('样本序号');
ylabel('数值');
title('线性拟合预测图');
legend;

三、代码分析

  1. 数据准备部分
    - 我们通过 load 函数加载输入数据 X1X2 和输出数据 Y。这里你需要将 inputdata1.matinputdata2.matoutput_data.mat 替换为你实际的数据文件名。
    - 然后将数据按照 trainRatio(这里设为 0.8)的比例划分为训练集和测试集。这样做是为了在训练模型后,能够用未参与训练的数据来评估模型的泛化能力。
  1. 构建 CNN 模型部分
    - 我们使用 sequenceInputLayer 定义了两个输入层,分别对应 X1X2 的维度。这是因为 CNN 可以处理序列数据,而我们的输入数据虽然不一定是严格意义上的时间序列,但可以看作是一种特征序列。
    - 接着,我们为每个输入分支构建了 1D 卷积层(convolution1dLayer)。卷积层的作用是提取数据中的局部特征,这里卷积核大小设为 5,16 个滤波器。Padding 设置为 same 是为了保持卷积后数据的长度不变。
    - batchNormalizationLayer 用于对数据进行批归一化,它可以加速模型的收敛,并减少梯度消失或爆炸的问题。
    - reluLayer 是激活函数层,这里使用 ReLU 函数,它能够给模型引入非线性因素,使模型能够学习到更复杂的映射关系。
    - maxPooling1dLayer 进行最大池化操作,池化大小为 2,它可以降低数据维度,同时保留主要特征。
    - 通过 concatenationLayer 将两个分支的输出连接起来,这样就把两个输入数据的特征融合到了一起。
    - 之后是两个全连接层(fullyConnectedLayer),第一个全连接层有 32 个神经元,进一步对融合后的特征进行处理,第二个全连接层的神经元数量与输出维度相同,直接输出预测结果。最后通过 regressionLayer 定义回归层,用于拟合预测。
  1. 训练模型部分
    - 使用 trainingOptions 来设置训练的参数。这里选择了 Adam 优化器,它是一种常用的优化算法,能够自适应地调整学习率。MaxEpochs 设置为 100,表示训练 100 个 epoch。MiniBatchSize 设为 32,意味着每次训练使用 32 个样本。InitialLearnRate 是初始学习率,设为 0.001。Shuffle 设置为 every - epoch 表示每个 epoch 都对数据进行打乱,以避免模型过拟合。Plots 设置为 training - progress 可以在训练过程中实时显示训练进度图。
  1. 预测部分
    - 使用 predict 函数对测试集数据进行预测,得到预测结果 YPred
  1. 评价指标计算部分
    - 通过 mse 函数计算均方误差(MSE),它衡量了预测值与实际值之间误差的平方的平均值。
    - rmseValue 是均方根误差(RMSE),它是 MSE 的平方根,这样与实际值的单位相同,更直观地反映预测的误差大小。
    - mae 函数计算平均绝对误差(MAE),它衡量了预测值与实际值之间误差的绝对值的平均值。
  1. 绘图部分
    - 我们使用 scatter 函数绘制了拟合预测散点图,以观察预测值与实际值的分布关系。
    - 使用 plot 函数绘制了线性拟合预测图,直观地展示预测值和实际值随样本序号的变化情况,方便我们进一步评估模型的预测效果。

通过以上步骤,我们就用 Matlab 成功实现了基于 CNN 的多输入多输出拟合预测建模,并且能够得到拟合预测图、线性拟合预测图以及多个预测评价指标,方便我们对模型进行评估和优化。希望这篇博文对你有所帮助,赶紧试试吧!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐