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