news 2026/2/12 22:01:59

用卷积神经网络CNN实现多输入多输出的拟合预测建模(Matlab 版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用卷积神经网络CNN实现多输入多输出的拟合预测建模(Matlab 版)

卷机神经网络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 的多输入多输出拟合预测建模,并且能够得到拟合预测图、线性拟合预测图以及多个预测评价指标,方便我们对模型进行评估和优化。希望这篇博文对你有所帮助,赶紧试试吧!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/11 19:25:16

Vugu WebAssembly终极部署指南:零基础快速上手Go语言前端开发

你是不是曾经想过,能不能用Go语言直接写前端应用?现在这个梦想成真了!Vugu框架让Go语言开发者也能轻松构建运行在浏览器中的Web应用。作为一名Go开发者,你肯定遇到过这样的困扰:前端技术栈更新换代太快,学习…

作者头像 李华
网站建设 2026/2/12 16:29:32

ChatTTS语音合成完整指南:从零开始打造专业AI语音系统

ChatTTS语音合成完整指南:从零开始打造专业AI语音系统 【免费下载链接】ChatTTS ChatTTS 是一个用于日常对话的生成性语音模型。 项目地址: https://gitcode.com/GitHub_Trending/ch/ChatTTS 还在为复杂的语音合成系统而烦恼?本指南将带你一步步搭…

作者头像 李华
网站建设 2026/2/9 23:14:59

多GPU并行训练TensorFlow模型:数据并行实现方法

多GPU并行训练TensorFlow模型:数据并行实现方法 在现代深度学习系统中,单块GPU早已无法满足大规模模型的训练需求。随着图像识别、自然语言处理等任务对算力要求的指数级增长,如何高效利用多张GPU成为工业界必须面对的问题。尤其是在企业级AI…

作者头像 李华
网站建设 2026/2/9 11:48:34

SWATH质谱

SWATH质谱 SWATH质谱(Sequential Window Acquisition of All Theoretical Mass Spectra)是一种新型的数据独立采集技术,近年来在蛋白质组学研究中备受关注。这种技术通过在固定质量范围内对所有离子进行碎片化分析,解决了传统数据…

作者头像 李华
网站建设 2026/2/10 15:51:34

云手机成Open-AutoGLM新宠?深度解析背后的算力博弈

第一章:云手机成Open-AutoGLM新宠?深度解析背后的算力博弈 在边缘计算与AI模型轻量化的双重推动下,云手机正悄然成为运行Open-AutoGLM类大模型推理任务的新选择。其核心优势在于将高负载的模型运算迁移至云端,通过虚拟化移动设备实…

作者头像 李华