CNN回归-卷积神经网络(Convolutional Neural Network)

CNN回归详细介绍

源码

什么是CNN回归?

CNN回归(卷积神经网络回归)是一种基于**卷积神经网络(Convolutional Neural Network, CNN)**的回归算法。卷积神经网络最初主要应用于图像处理和计算机视觉任务,如图像分类、目标检测和语义分割。然而,随着其强大的特征提取能力,CNN也被广泛应用于回归问题,如时间序列预测、信号处理和结构参数估计等。

CNN回归的组成部分
  1. 输入层

    • 接收输入数据,通常是多维数据,如图像、序列或其他形式的高维数据。
    • 数据的格式需要与网络结构的要求相匹配,例如图像数据通常为三维张量(高度 × 宽度 × 通道数)。
  2. 卷积层(Convolutional Layer)

    • 通过卷积核(滤波器)对输入数据进行局部感受野的特征提取。
    • 能够捕捉空间或时间上的局部特征,提高模型的表达能力。
  3. 激活层(Activation Layer)

    • 引入非线性因素,常用的激活函数包括ReLU、Sigmoid、Tanh等。
    • 增强网络的非线性表达能力,使其能够拟合复杂的函数关系。
  4. 池化层(Pooling Layer)

    • 对卷积层输出进行下采样,减少数据的维度和计算量。
    • 常用的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。
  5. 全连接层(Fully Connected Layer)

    • 将前面提取的特征进行线性组合,生成最终的回归输出。
    • 常用于网络的末端,将高维特征映射到目标变量。
  6. 回归层(Regression Layer)

    • 计算预测值与真实值之间的误差,通常使用均方误差(MSE)作为损失函数。
CNN回归的工作原理

CNN回归通过以下步骤实现回归任务:

  1. 数据准备与预处理

    • 数据收集与整理:确保数据的完整性和准确性,处理缺失值和异常值。
    • 数据划分:将数据集划分为训练集和测试集,常用比例为70%训练集和30%测试集。
    • 数据预处理:对数据进行归一化或标准化处理,以提高模型的训练效果和稳定性。
  2. 构建CNN模型

    • 选择网络结构:根据数据的特点和任务的复杂度,设计合适的CNN架构,包括卷积层、激活层、池化层和全连接层的数量和参数。
    • 设置参数:设定学习率、批量大小、优化算法等超参数,以优化模型的训练过程。
  3. 训练CNN模型

    • 使用训练集数据训练CNN模型,通过前向传播计算预测值,并通过反向传播调整网络权重以最小化预测误差。
    • 迭代训练过程直至达到预设的训练次数或误差阈值。
  4. 模型预测与评估

    • 使用训练好的CNN模型对测试集数据进行回归预测,计算预测误差和其他性能指标。
    • 评估模型的回归准确性和泛化能力,分析模型的表现。
  5. 结果分析与可视化

    • 预测结果对比图:绘制真实值与预测值的对比图,直观展示模型的回归效果。
    • 误差曲线:绘制训练过程中的误差变化曲线,观察模型的收敛情况。
    • 散点图:绘制真实值与预测值的散点图,评估模型的拟合能力。
    • 相关指标:计算R²、MAE、MBE、MAPE、RMSE等回归性能指标,全面评估模型性能。
CNN回归的优势
  1. 强大的特征提取能力

    • CNN通过多层卷积和池化操作,能够自动提取数据的层次化特征,减少了对手工特征工程的依赖。
  2. 优秀的非线性建模能力

    • 通过激活函数和深层网络结构,CNN能够拟合复杂的非线性关系,适用于多种回归任务。
  3. 良好的泛化性能

    • 适当的网络结构和正则化技术使得CNN在未见数据上表现良好,减少了过拟合现象。
  4. 高效的并行计算

    • 卷积操作具有高度的并行性,能够利用GPU加速训练过程,提高计算效率。
  5. 广泛的应用领域

    • 除了图像和视频处理,CNN回归还应用于时间序列预测、信号处理、结构参数估计等领域。
CNN回归的应用

CNN回归广泛应用于各类需要精确预测和拟合的领域,包括但不限于:

  1. 时间序列预测

    • 股票价格预测:预测股票市场的未来价格走势。
    • 天气预测:预测未来的气温、降水量等气象指标。
  2. 工程与制造

    • 设备故障预测:预测设备的潜在故障,进行预防性维护。
    • 质量控制:预测制造过程中关键参数,确保产品质量。
  3. 医疗健康

    • 生物标志物预测:预测疾病的生物标志物水平,用于早期诊断。
    • 药物反应预测:预测患者对药物的反应,优化治疗方案。
  4. 环境科学

    • 污染物浓度预测:预测空气或水体中的污染物浓度,进行环境监测。
    • 气候变化分析:分析和预测气候变化趋势。
  5. 市场营销

    • 销售预测:预测产品的未来销售量,优化库存管理。
    • 客户需求预测:预测客户的购买行为和需求变化,制定营销策略。
如何使用CNN回归

使用CNN回归模型主要包括以下步骤:

  1. 准备数据集

    • 数据收集与整理:确保数据的完整性和准确性,处理缺失值和异常值。
    • 数据划分:将数据集划分为训练集和测试集,常用比例为70%训练集和30%测试集。
    • 数据预处理:对数据进行归一化或标准化处理,以提高模型的训练效果和稳定性。
  2. 构建CNN模型

    • 选择网络结构:根据数据的特点和任务的复杂度,设计合适的CNN架构,包括卷积层、激活层、池化层和全连接层的数量和参数。
    • 设置超参数:设定学习率、批量大小、优化算法等超参数,以优化模型的训练过程。
  3. 训练CNN模型

    • 使用训练集数据训练CNN模型,通过前向传播计算预测值,并通过反向传播调整网络权重以最小化预测误差。
    • 迭代训练过程直至达到预设的训练次数或误差阈值。
  4. 模型测试与评估

    • 使用训练好的CNN模型对测试集数据进行回归预测,计算预测误差和其他性能指标。
    • 评估模型的回归准确性和泛化能力,分析模型的表现。
  5. 结果分析与可视化

    • 预测结果对比图:绘制真实值与预测值的对比图,直观展示模型的回归效果。
    • 误差曲线:绘制训练过程中的误差变化曲线,观察模型的收敛情况。
    • 散点图:绘制真实值与预测值的散点图,评估模型的拟合能力。
    • 相关指标:计算R²、MAE、MBE、MAPE、RMSE等回归性能指标,全面评估模型性能。
使用CNN回归的步骤示例

以下以一个具体的步骤示例,说明如何在MATLAB中实现CNN回归:

  1. 数据准备

    • 确保数据集数据集.xlsx的最后一列为目标变量,其他列为输入特征。
    • 使用MATLAB读取数据,并进行随机打乱、划分训练集和测试集。
  2. 数据预处理

    • 对输入数据和目标变量进行归一化处理,确保数据在相同的尺度范围内,提高模型训练效果和稳定性。
  3. 网络构建与参数设置

    • 创建一个CNN模型,设计合适的卷积层、激活层、池化层和全连接层。
    • 设置CNN网络的训练参数,如学习率、最大训练次数、正则化参数等。
  4. 网络训练与测试

    • 使用训练集数据训练CNN模型,调整网络权重和阈值。
    • 使用训练好的网络对训练集和测试集进行预测,计算预测误差。
  5. 结果可视化

    • 绘制训练集和测试集的真实值与预测值对比图,直观展示回归效果。
    • 绘制误差曲线,观察训练过程中误差的变化趋势。
    • 绘制真实值与预测值的散点图,评估模型的拟合能力。
  6. 性能评价

    • 计算均方根误差(RMSE)、决定系数(R²)、平均绝对误差(MAE)、平均偏差误差(MBE)、平均绝对百分比误差(MAPE)等回归性能指标,全面评估模型性能。

通过上述步骤,用户可以利用CNN回归模型高效地解决各种回归问题,提升模型的预测准确性和鲁棒性。


代码简介

该MATLAB代码实现了基于**卷积神经网络(CNN)**的回归算法,简称“CNN回归”。其主要流程如下:

  1. 数据预处理

    • 导入数据集,并随机打乱数据顺序。
    • 将数据集划分为训练集和测试集。
    • 对输入数据和目标变量进行归一化处理,以提高训练效果和稳定性。
    • 将数据平铺成适合CNN输入的格式。
  2. 网络构建与参数设置

    • 构建CNN网络结构,包括输入层、卷积层、批归一化层、激活层、池化层、Dropout层、全连接层和回归层。
    • 设置训练参数,如学习率、最大训练次数、正则化参数等。
  3. 模型训练与测试

    • 使用训练集数据训练CNN模型,调整网络权重和阈值。
    • 使用训练好的网络对训练集和测试集进行预测,计算预测误差。
  4. 结果分析与可视化

    • 绘制预测结果对比图。
    • 绘制网络分析图。
    • 计算并显示相关回归性能指标(R²、MAE、MBE、MAPE、RMSE)。
    • 绘制真实值与预测值的散点图,评估模型的拟合能力。

以下是添加了详细中文注释的CNN回归MATLAB代码。


MATLAB代码(添加详细中文注释)

%% 初始化
clear                % 清除工作区变量
close all            % 关闭所有图形窗口
clc                  % 清空命令行窗口
warning off          % 关闭警告信息%% 导入数据
res = xlsread('数据集.xlsx');  % 从Excel文件中读取数据,假设最后一列为目标变量%% 数据分析
num_size = 0.7;                              % 设定训练集占数据集的比例(70%训练集,30%测试集)
outdim = 1;                                  % 最后一列为输出
num_samples = size(res, 1);                  % 计算样本个数(数据集中的行数)
res = res(randperm(num_samples), :);         % 随机打乱数据集顺序,以避免数据排序带来的偏差(如果不希望打乱可注释该行)
num_train_s = round(num_size * num_samples); % 计算训练集样本个数(四舍五入)
f_ = size(res, 2) - outdim;                  % 输入特征维度(总列数减去输出维度)%% 划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';       % 训练集输入,转置使每列为一个样本
T_train = res(1: num_train_s, f_ + 1: end)'; % 训练集输出,转置使每列为一个样本
M = size(P_train, 2);                        % 训练集样本数P_test = res(num_train_s + 1: end, 1: f_)';   % 测试集输入,转置使每列为一个样本
T_test = res(num_train_s + 1: end, f_ + 1: end)'; % 测试集输出,转置使每列为一个样本
N = size(P_test, 2);                          % 测试集样本数%% 数据归一化
[P_train, ps_input] = mapminmax(P_train, 0, 1);          % 对训练集输入进行归一化,范围[0,1]
P_test = mapminmax('apply', P_test, ps_input );         % 使用训练集的归一化参数对测试集输入进行归一化[t_train, ps_output] = mapminmax(T_train, 0, 1);          % 对训练集输出进行归一化,范围[0,1]
t_test = mapminmax('apply', T_test, ps_output );         % 使用训练集的归一化参数对测试集输出进行归一化%% 数据平铺
% 将数据平铺成4维数据,以适应MATLAB的CNN输入格式
% 输入格式为 [高度, 宽度, 通道数, 样本数]
% 这里将数据平铺成 [特征维度, 1, 1, 样本数] 的格式
p_train = double(reshape(P_train, f_, 1, 1, M));        % 将训练集输入平铺成4维数据
p_test  = double(reshape(P_test , f_, 1, 1, N));        % 将测试集输入平铺成4维数据
t_train = double(t_train)';                             % 将训练集输出转置为列向量
t_test  = double(t_test )';                             % 将测试集输出转置为列向量%% 构造网络结构
% ----------------------  修改模型结构时需对应修改fical.m中的模型结构  --------------------------layers = [imageInputLayer([f_, 1, 1])                        % 输入层 输入数据规模 [特征维度, 1, 1]convolution2dLayer([3, 1], 16, 'Padding', 'same')  % 卷积层 卷积核大小 3x1,生成16张特征图,使用'same'填充保持尺寸batchNormalizationLayer                            % 批归一化层 规范化数据,加快训练速度并稳定性reluLayer                                          % ReLU激活层 引入非线性convolution2dLayer([3, 1], 32, 'Padding', 'same')  % 卷积层 卷积核大小 3x1,生成32张特征图,使用'same'填充保持尺寸batchNormalizationLayer                            % 批归一化层reluLayer                                          % ReLU激活层dropoutLayer(0.2)                                  % Dropout层 随机丢弃20%的神经元,防止过拟合fullyConnectedLayer(outdim)                        % 全连接层 输出维度与目标变量相同regressionLayer];                                  % 回归层 使用回归损失函数%% 参数设置
options = trainingOptions('adam', ...      % 选择Adam优化算法'MaxEpochs', 500, ...                  % 设置最大训练次数为500'InitialLearnRate', 1e-3, ...          % 设置初始学习率为0.001'L2Regularization', 1e-4, ...          % 设置L2正则化参数为0.0001,防止过拟合'LearnRateSchedule', 'piecewise', ...  % 设置学习率下降策略为分段'LearnRateDropFactor', 0.1, ...        % 设置学习率下降因子为0.1'LearnRateDropPeriod', 400, ...        % 设置在第400个epoch后学习率下降'Shuffle', 'every-epoch', ...          % 每个epoch后打乱数据集'ValidationPatience', Inf, ...         % 关闭验证提前停止策略'Plots', 'training-progress', ...      % 显示训练过程中的损失曲线'Verbose', false);                     % 关闭命令行中的训练过程输出%% 训练网络
net = trainNetwork(p_train, t_train, layers, options);  % 使用训练集数据训练CNN网络%% 仿真验证
t_sim1 = predict(net, p_train);          % 使用训练集数据进行预测,得到训练集的预测结果
t_sim2 = predict(net, p_test );          % 使用测试集数据进行预测,得到测试集的预测结果%% 数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);  % 将训练集预测结果反归一化,恢复到原始尺度
T_sim2 = mapminmax('reverse', t_sim2, ps_output);  % 将测试集预测结果反归一化,恢复到原始尺度%% 均方根误差
error1 = sqrt(sum((T_sim1' - T_train).^2) ./ M);  % 计算训练集的均方根误差(RMSE)
error2 = sqrt(sum((T_sim2' - T_test ).^2) ./ N);  % 计算测试集的均方根误差(RMSE)%% 绘制网络分析图
analyzeNetwork(layers)  % 可视化网络结构和各层的参数%% 绘图
% 绘制训练集预测结果对比图
figure
plot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1) % 绘制真实值与预测值对比曲线
legend('真实值', '预测值')                                        % 添加图例
xlabel('预测样本')                                                % 设置X轴标签
ylabel('预测结果')                                                % 设置Y轴标签
string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]};      % 创建标题字符串
title(string)                                                    % 添加图形标题
xlim([1, M])                                                     % 设置X轴范围
grid                                                             % 显示网格% 绘制测试集预测结果对比图
figure
plot(1: N, T_test, 'r-*', 1: N, T_sim2, 'b-o', 'LineWidth', 1) % 绘制真实值与预测值对比曲线
legend('真实值', '预测值')                                        % 添加图例
xlabel('预测样本')                                                % 设置X轴标签
ylabel('预测结果')                                                % 设置Y轴标签
string = {'测试集预测结果对比'; ['RMSE=' num2str(error2)]};       % 创建标题字符串
title(string)                                                    % 添加图形标题
xlim([1, N])                                                     % 设置X轴范围
grid                                                             % 显示网格%% 相关指标计算
% R²
R1 = 1 - norm(T_train - T_sim1')^2 / norm(T_train - mean(T_train))^2;  % 计算训练集的决定系数R²
R2 = 1 - norm(T_test  - T_sim2')^2 / norm(T_test  - mean(T_test ))^2;  % 计算测试集的决定系数R²disp(['训练集数据的R2为:', num2str(R1)])  % 显示训练集的R²
disp(['测试集数据的R2为:', num2str(R2)])  % 显示测试集的R²% MAE
mae1 = sum(abs(T_sim1' - T_train)) ./ M ;  % 计算训练集的平均绝对误差MAE
mae2 = sum(abs(T_sim2' - T_test )) ./ N ;  % 计算测试集的平均绝对误差MAEdisp(['训练集数据的MAE为:', num2str(mae1)])  % 显示训练集的MAE
disp(['测试集数据的MAE为:', num2str(mae2)])  % 显示测试集的MAE% MBE
mbe1 = sum(T_sim1' - T_train) ./ M ;  % 计算训练集的平均偏差误差MBE
mbe2 = sum(T_sim2' - T_test ) ./ N ;  % 计算测试集的平均偏差误差MBEdisp(['训练集数据的MBE为:', num2str(mbe1)])  % 显示训练集的MBE
disp(['测试集数据的MBE为:', num2str(mbe2)])  % 显示测试集的MBE% MAPE
mape1 = sum(abs((T_sim1' - T_train)./T_train)) ./ M ;  % 计算训练集的平均绝对百分比误差MAPE
mape2 = sum(abs((T_sim2' - T_test )./T_test )) ./ N ;  % 计算测试集的平均绝对百分比误差MAPEdisp(['训练集数据的MAPE为:', num2str(mape1)])  % 显示训练集的MAPE
disp(['测试集数据的MAPE为:', num2str(mape2)])  % 显示测试集的MAPE% RMSE
disp(['训练集数据的RMSE为:', num2str(error1)])  % 显示训练集的RMSE
disp(['测试集数据的RMSE为:', num2str(error2)])  % 显示测试集的RMSE%% 绘制散点图
sz = 25;       % 设置散点大小
c = 'b';       % 设置散点颜色为蓝色% 绘制训练集散点图
figure
scatter(T_train, T_sim1, sz, c)              % 绘制训练集真实值与预测值的散点图
hold on                                       % 保持图形
plot(xlim, ylim, '--k')                       % 绘制理想预测线(真实值等于预测值的对角线)
xlabel('训练集真实值');                        % 设置X轴标签
ylabel('训练集预测值');                        % 设置Y轴标签
xlim([min(T_train) max(T_train)])              % 设置X轴范围
ylim([min(T_sim1) max(T_sim1)])                % 设置Y轴范围
title('训练集预测值 vs. 训练集真实值')            % 设置图形标题% 绘制测试集散点图
figure
scatter(T_test, T_sim2, sz, c)               % 绘制测试集真实值与预测值的散点图
hold on                                       % 保持图形
plot(xlim, ylim, '--k')                       % 绘制理想预测线(真实值等于预测值的对角线)
xlabel('测试集真实值');                         % 设置X轴标签
ylabel('测试集预测值');                         % 设置Y轴标签
xlim([min(T_test) max(T_test)])                 % 设置X轴范围
ylim([min(T_sim2) max(T_sim2)])                 % 设置Y轴范围
title('测试集预测值 vs. 测试集真实值')             % 设置图形标题

代码说明

  1. 初始化

    • 清理环境:通过clear清除工作区变量,close all关闭所有图形窗口,clc清空命令行窗口,warning off关闭警告信息,确保代码运行环境的干净和无干扰。
  2. 导入数据

    • 读取数据:使用xlsread函数从Excel文件数据集.xlsx中读取数据。假设数据集的最后一列为目标变量(需要预测的值),其他列为输入特征。
  3. 数据分析

    • 训练集比例:设定训练集占数据集的比例为70%,即num_size = 0.7
    • 输出维度outdim = 1,表示数据集的最后一列为输出(目标变量)。
    • 样本数:通过size(res, 1)计算数据集中的样本总数。
    • 数据打乱:使用randperm函数随机打乱数据集的顺序,以避免数据排序带来的偏差。如果不希望打乱数据集,可以注释掉该行代码。
    • 训练集样本数:通过round(num_size * num_samples)计算训练集的样本数量。
    • 特征维度:通过size(res, 2) - outdim计算输入特征的维度(总列数减去输出维度)。
  4. 划分训练集和测试集

    • 训练集输入:提取前num_train_s个样本的输入特征,并进行转置,使每列为一个样本。
    • 训练集输出:提取前num_train_s个样本的输出(目标变量),并进行转置。
    • 训练集样本数:通过size(P_train, 2)获取训练集的样本数量,赋值给M
    • 测试集输入:提取剩余样本的输入特征,并进行转置。
    • 测试集输出:提取剩余样本的输出(目标变量),并进行转置。
    • 测试集样本数:通过size(P_test, 2)获取测试集的样本数量,赋值给N
  5. 数据归一化

    • 训练集输入归一化:使用mapminmax函数将训练集输入数据缩放到[0,1]的范围内,并保存归一化参数ps_input
    • 测试集输入归一化:使用mapminmax('apply', P_test, ps_input),应用训练集的归一化参数对测试集输入数据进行同样的归一化处理,确保训练集和测试集的数据尺度一致。
    • 训练集输出归一化:使用mapminmax函数将训练集输出数据缩放到[0,1]的范围内,并保存归一化参数ps_output
    • 测试集输出归一化:使用mapminmax('apply', T_test, ps_output),应用训练集的归一化参数对测试集输出数据进行同样的归一化处理。
  6. 数据平铺

    • 数据格式转换:将输入数据平铺成4维数据,以适应MATLAB的CNN输入格式。输入格式为 [高度, 宽度, 通道数, 样本数]。这里将数据平铺成 [特征维度, 1, 1, 样本数] 的格式。
    • 训练集输入平铺:使用reshape函数将训练集输入数据转换为4维数据,并使用double函数确保数据类型为双精度。
    • 测试集输入平铺:使用reshape函数将测试集输入数据转换为4维数据,并使用double函数确保数据类型为双精度。
    • 训练集输出转置:将训练集输出数据转置为列向量,使用double函数确保数据类型为双精度。
    • 测试集输出转置:将测试集输出数据转置为列向量,使用double函数确保数据类型为双精度。
  7. 构造网络结构

    • 定义网络层:使用imageInputLayerconvolution2dLayerbatchNormalizationLayerreluLayerdropoutLayerfullyConnectedLayerregressionLayer构建CNN网络结构。
      • 输入层:定义输入数据的尺寸 [特征维度, 1, 1]
      • 第一卷积层:使用大小为[3,1]的卷积核,生成16张特征图,采用same填充保持尺寸不变。
      • 批归一化层:规范化卷积层的输出,加快训练速度并提高稳定性。
      • ReLU激活层:引入非线性,提高网络的表达能力。
      • 第二卷积层:使用大小为[3,1]的卷积核,生成32张特征图,采用same填充保持尺寸不变。
      • 批归一化层:规范化卷积层的输出。
      • ReLU激活层:引入非线性。
      • Dropout层:随机丢弃20%的神经元,防止过拟合。
      • 全连接层:输出维度与目标变量相同。
      • 回归层:使用回归损失函数,适应回归任务。
  8. 参数设置

    • 训练选项:使用trainingOptions函数设置CNN网络的训练参数。
      • 优化算法:选择adam优化算法,加快收敛速度并适应非凸优化问题。
      • 最大训练次数:设置最大训练次数为500次。
      • 初始学习率:设置初始学习率为0.001。
      • L2正则化:设置L2正则化参数为0.0001,防止过拟合。
      • 学习率调度:设置学习率调度策略为piecewise,在第400个epoch后学习率下降。
      • 学习率下降因子:设置学习率下降因子为0.1。
      • 学习率下降周期:设置在第400个epoch后学习率下降。
      • 数据打乱:每个epoch后打乱数据集顺序。
      • 验证耐心:设置为Inf,关闭验证提前停止策略。
      • 绘图选项:开启训练过程中的损失曲线绘制。
      • 详细程度:关闭命令行中的训练过程输出。
  9. 训练网络

    • 训练过程:使用trainNetwork函数,输入训练集数据p_train和目标变量t_train,按照定义的网络结构layers和训练选项options训练CNN模型。
  10. 仿真验证

    • 训练集预测:使用predict函数对训练集数据进行预测,得到训练集的预测结果t_sim1
    • 测试集预测:使用predict函数对测试集数据进行预测,得到测试集的预测结果t_sim2
  11. 数据反归一化

    • 训练集反归一化:使用mapminmax('reverse', t_sim1, ps_output)函数将训练集预测结果反归一化,恢复到原始数据的尺度,得到T_sim1
    • 测试集反归一化:使用mapminmax('reverse', t_sim2, ps_output)函数将测试集预测结果反归一化,恢复到原始数据的尺度,得到T_sim2
  12. 均方根误差(RMSE)

    • 训练集RMSE:通过sqrt(sum((T_sim1' - T_train).^2) ./ M)计算训练集的均方根误差error1
    • 测试集RMSE:通过sqrt(sum((T_sim2' - T_test ).^2) ./ N)计算测试集的均方根误差error2
  13. 绘制网络分析图

    • 可视化网络结构:使用analyzeNetwork函数可视化CNN网络的结构和各层的参数,便于理解和分析网络的组成。
  14. 绘图

    • 训练集预测结果对比图
      • 绘制对比曲线:使用plot函数绘制训练集的真实值与预测值对比曲线,红色星号表示真实值,蓝色圆圈表示预测值。
      • 图形设置:添加图例、坐标轴标签、标题和网格,提升图形的可读性。
      • 设置X轴范围:使用xlim([1, M])设置X轴的显示范围。
    • 测试集预测结果对比图
      • 绘制对比曲线:使用plot函数绘制测试集的真实值与预测值对比曲线,红色星号表示真实值,蓝色圆圈表示预测值。
      • 图形设置:添加图例、坐标轴标签、标题和网格,提升图形的可读性。
      • 设置X轴范围:使用xlim([1, N])设置X轴的显示范围。
  15. 相关指标计算

    • 决定系数(R²)
      • 训练集R²:通过1 - norm(T_train - T_sim1')^2 / norm(T_train - mean(T_train))^2计算训练集的决定系数R1,衡量模型对训练数据的拟合程度。
      • 测试集R²:通过1 - norm(T_test - T_sim2')^2 / norm(T_test - mean(T_test ))^2计算测试集的决定系数R2,衡量模型对测试数据的泛化能力。
      • 显示结果:使用disp函数显示训练集和测试集的R²值。
    • 平均绝对误差(MAE)
      • 训练集MAE:通过sum(abs(T_sim1' - T_train)) ./ M计算训练集的平均绝对误差mae1
      • 测试集MAE:通过sum(abs(T_sim2' - T_test )) ./ N计算测试集的平均绝对误差mae2
      • 显示结果:使用disp函数显示训练集和测试集的MAE值。
    • 平均偏差误差(MBE)
      • 训练集MBE:通过sum(T_sim1' - T_train) ./ M计算训练集的平均偏差误差mbe1,衡量模型是否存在系统性偏差。
      • 测试集MBE:通过sum(T_sim2' - T_test ) ./ N计算测试集的平均偏差误差mbe2
      • 显示结果:使用disp函数显示训练集和测试集的MBE值。
    • 平均绝对百分比误差(MAPE)
      • 训练集MAPE:通过sum(abs((T_sim1' - T_train)./T_train)) ./ M计算训练集的平均绝对百分比误差mape1
      • 测试集MAPE:通过sum(abs((T_sim2' - T_test )./T_test )) ./ N计算测试集的平均绝对百分比误差mape2
      • 显示结果:使用disp函数显示训练集和测试集的MAPE值。
    • 均方根误差(RMSE)
      • 显示结果:使用disp函数显示训练集和测试集的RMSE值。
  16. 绘制散点图

    • 设置散点图参数
      • sz = 25:设置散点大小为25。
      • c = 'b':设置散点颜色为蓝色。
    • 训练集散点图
      • 绘制散点:使用scatter函数绘制训练集真实值与预测值的散点图。
      • 绘制对角线:使用plot函数绘制理想预测线(真实值等于预测值的对角线)。
      • 图形设置:设置坐标轴标签、图形标题、轴范围,并显示网格。
    • 测试集散点图
      • 绘制散点:使用scatter函数绘制测试集真实值与预测值的散点图。
      • 绘制对角线:使用plot函数绘制理想预测线(真实值等于预测值的对角线)。
      • 图形设置:设置坐标轴标签、图形标题、轴范围,并显示网格。

代码使用注意事项

  1. 数据集格式

    • 目标变量:确保数据集.xlsx的最后一列为目标变量,且目标变量为数值型数据。如果目标变量为分类标签,需先进行数值编码。
    • 特征类型:数据集的其他列应为数值型特征,适合进行归一化处理。如果特征包含类别变量,需先进行编码转换。
  2. 参数调整

    • 网络结构:在构建CNN网络结构时,可以根据数据的特点和任务的复杂度调整卷积层的数量、卷积核的大小、特征图的数量、全连接层的节点数等。适当的网络结构设计能够提升模型的回归性能。
    • 训练参数
      • 学习率(InitialLearnRate):通过设置InitialLearnRate参数控制网络的学习速率。较大的学习率可能加快收敛速度,但可能导致震荡或发散;较小的学习率则使网络收敛更稳定,但可能需要更多的训练次数。
      • 最大训练次数(MaxEpochs):通过设置MaxEpochs参数控制网络的最大训练次数。根据训练误差的收敛情况调整训练次数,以避免过早停止或不必要的计算资源浪费。
      • 正则化参数(L2Regularization):通过设置L2Regularization参数控制网络的L2正则化强度,防止过拟合。
      • 学习率调度:通过设置LearnRateScheduleLearnRateDropFactorLearnRateDropPeriod参数控制学习率的下降策略,优化训练过程。
    • Dropout比例:通过设置dropoutLayer的丢弃比例控制网络的Dropout层,防止过拟合。较高的丢弃比例(如0.5)有助于减少过拟合,但可能影响网络的收敛速度。
  3. 环境要求

    • MATLAB版本:确保使用的MATLAB版本支持trainNetworkimageInputLayerconvolution2dLayer等深度学习相关函数。推荐使用MATLAB R2017a及以上版本,并安装Deep Learning Toolbox。
    • 工具箱:需要安装Deep Learning Toolbox,以支持CNN相关函数和训练过程的可视化。
  4. 性能优化

    • 数据预处理:除了归一化处理,还可以考虑主成分分析(PCA)等降维方法,减少特征数量,提升模型训练效率和性能。
    • 网络结构优化:通过调整卷积层的数量和卷积核的大小、增加或减少全连接层的节点数、引入残差连接等方法优化网络结构,提升模型性能。
    • 早停策略:虽然在本代码中关闭了验证提前停止策略(ValidationPatience设置为Inf),在实际应用中可以根据需要启用早停策略,以防止过拟合。
    • 正则化:除了L2正则化,还可以引入其他正则化技术,如L1正则化、Dropout等,进一步提升模型的泛化能力。
  5. 结果验证

    • 交叉验证:采用k折交叉验证方法评估模型的稳定性和泛化能力,避免因数据划分偶然性导致的性能波动。
    • 多次运行:由于CNN模型对初始权重敏感,建议多次运行模型,取平均性能指标,以获得更稳定的评估结果。
    • 模型对比:将CNN回归模型与其他回归模型(如BP回归、支持向量回归、随机森林回归等)进行对比,评估不同模型在相同数据集上的表现差异。
  6. 性能指标理解

    • 决定系数(R²):衡量模型对数据的拟合程度,值越接近1表示模型解释变量变异的能力越强。
    • 平均绝对误差(MAE):表示预测值与真实值之间的平均绝对差异,值越小表示模型性能越好。
    • 平均偏差误差(MBE):表示预测值与真实值之间的平均差异,正值表示模型倾向于高估,负值表示模型倾向于低估。
    • 平均绝对百分比误差(MAPE):表示预测值与真实值之间的平均绝对百分比差异,适用于评估相对误差。
    • 均方根误差(RMSE):表示预测值与真实值之间的平方差的平均值的平方根,值越小表示模型性能越好。
  7. 网络分析与可视化

    • 网络结构分析:使用analyzeNetwork函数可视化CNN网络的结构,便于理解网络的各层组成和参数设置。
    • 训练过程可视化:通过trainingOptions中的Plots参数,实时观察训练过程中的损失曲线,了解模型的收敛情况。
  8. 代码适应性

    • 网络层调整:根据实际数据和任务需求,调整网络层的数量和参数,例如增加更多的卷积层、调整卷积核的大小、修改全连接层的节点数等。
    • 数据格式匹配:确保输入数据的格式与网络结构的要求一致。如果输入数据为二维或三维数据,需相应调整imageInputLayer的尺寸参数。

通过理解和应用上述CNN回归模型,初学者可以有效地处理各种回归任务,充分发挥卷积神经网络在特征提取和非线性建模方面的优势,提升模型的预测准确性和鲁棒性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/494320.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java基础系列】实现数字的首位交换算法

在java中&#xff0c;手写实现一个数字的首位交换算法实现 实现效果 实现代码 核心业务代码 public static void main(String[] args) {int[] arr {1,2,3,4,5};int temp arr[0];for (int i 0; i < arr.length; i) {System.out.print(arr[i]);}System.out.println(&quo…

C语言初阶习题【14】数9的个数

1.编写程序数一下 1到 100 的所有整数中出现多少个数字9 2.思路 循环遍历1到100&#xff0c;需要判断每一位的个位数是否为9&#xff0c;十位数是否为9&#xff0c;每次符合条件就count进行计数&#xff0c;最后输出count&#xff0c;即可 3.code #define _CRT_SECURE_NO_W…

Debian11 安装MYSQL8 签名错误

前言 今天在新装的Debian11上安装MSYQL8,出现了如下错误 看了下是签名错误&#xff0c;下面具体提供下解决版本 安全mysql vim /etc/apt/sources.list 我使用的阿里源 deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib deb-src https://mirrors.al…

C++----类与对象(下篇)

再谈构造函数 回顾函数体内赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date{ public: Date(int year, int month, int day) { _year year; _month month; _day day; } private: int _year; int _mo…

基于SpringBoot的山西文旅网系统

一、系统背景与意义 在经济全球化背景之下&#xff0c;互联网技术将进一步提高社会综合发展的效率和速度&#xff0c;也将涉及到各个领域&#xff0c;而山西文旅网在网络背景下有着无法忽视的作用。山西作为中国的文化大省&#xff0c;拥有丰富的旅游资源和深厚的文化底蕴。为…

UWB无载波通信技术,UWB定位系统源码

UWB(Ultra Wideband)是一种无载波通信技术&#xff0c;利用纳秒至微秒级的非正弦波窄脉冲传输数据。通过在较宽的频谱上传送极低功率的信号。UWB技术解决了困扰传统无线通信技术多年的有关传播方面的重大难题&#xff0c;具有对信道衰落不敏感、发射信号功率谱密度低、截获率低…

OSPF的状态机

OSPF的状态机-- 当设备启动之后会自动从down进入到init初始化状 态&#xff0c;发送hello报文&#xff0c;如果收到hello报文中携带自己的RID就会自动进入two-way状态---标志设备邻居关系建立的标志 条件匹配--- FULL状态 工作完成的状态&#xff1a;标志邻接关系的建立 OS…

云原生服务网格Istio实战

基础介绍 1、Istio的定义 Istio 是一个开源服务网格&#xff0c;它透明地分层到现有的分布式应用程序上。 Istio 强大的特性提供了一种统一和更有效的方式来保护、连接和监视服务。 Istio 是实现负载平衡、服务到服务身份验证和监视的路径——只需要很少或不需要更改服务代码…

Vue进阶之Vue RouterSSR

Vue Router&SSR VueRouter前端路由模式路由的简单使用动态参数路由编程式导航 手写一个vueRouterrouter/core.jsrouter/index.jsmain.jsApp.vueHome.vueAbout.vue vue-router原理总的package.json&packagesscripts重点&#xff1a;packages/router包package.jsonpackag…

Springboot应用开发:配置类整理

目录 编写目的 一、线程池 1.1 setCorePoolSize 1.2 setMaxPoolSize 1.3 setQueueCapacity 1.4 setKeepAliveSeconds 1.5 setThreadNamePrefix 1.6 setRejectedExecutionHandler 1.7 示例代码 二、Durid数据库连接池 2.1 ServletRegistrationBean 2.2 FilterRegist…

JVM系列(十二) -常用调优命令汇总

最近对 JVM 技术知识进行了重新整理&#xff0c;再次献上 JVM系列文章合集索引&#xff0c;感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…

LightGBM分类算法在医疗数据挖掘中的深度探索与应用创新(上)

一、引言 1.1 医疗数据挖掘的重要性与挑战 在当今数字化医疗时代,医疗数据呈爆炸式增长,这些数据蕴含着丰富的信息,对医疗决策具有极为重要的意义。通过对医疗数据的深入挖掘,可以发现潜在的疾病模式、治疗效果关联以及患者的健康风险因素,从而为精准医疗、个性化治疗方…

STM32F407寄存器点灯

背景描述&#xff1a; 最近用32开发遇到问题不得不看寄存器了&#xff0c;就回顾了一下寄存器手册的查看方式和寄存器的使用方法&#xff1b; 上一次这么细致的记录还是在刚学习STM32的时候&#xff0c;之前觉得看寄存器手册以及配置寄存器是有点难度的事情&#xff0c;现在回头…

Cline 3.0发布:从AI编程助手到通用智能体平台的进化

引言 在人工智能快速发展的今天&#xff0c;开发者工具正在经历一场革命性的变革。作为VSCode生态中备受欢迎的AI编程助手&#xff0c;Cline迎来了具有里程碑意义的3.0版本更新。本次Cline 3.0更新不仅带来了用户呼声最高的自动审批功能&#xff0c;还通过一系列创新优化全面提…

【Jenkins】持久化

文章目录 持续集成CI持续部署CD部署部署到linux服务器 持续集成好处&#xff1a; 持续集成CI 持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff09;指的是频繁地&#xff08;一天多次&#xff09;将代码集成到主干。 持续集成的目的就是让产品可以快速…

Promise链式调用

Promise链式调用 上一篇我们实现了通过promise的方式实现获取国家基本信息&#xff0c;本次我们来使用promise链式调用来实现邻国的展现 首先&#xff0c;我们从第一个国家中获取到邻国的国家代码名称 const neighbour data[0].borders[0];然后我们通过fetch来获取邻国信息&a…

路由器的原理

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网路安全入门系列 目录 路由器的原理一&#xff0c;路由器基础及相关…

2025系统架构师(一考就过):案例题之一:嵌入式架构、大数据架构、ISA

一、嵌入式系统架构 软件脆弱性是软件中存在的弱点(或缺陷)&#xff0c;利用它可以危害系统安全策略&#xff0c;导致信息丢失、系统价值和可用性降低。嵌入式系统软件架构通常采用分层架构&#xff0c;它可以将问题分解为一系列相对独立的子问题&#xff0c;局部化在每一层中…

重拾设计模式--状态模式

文章目录 状态模式&#xff08;State Pattern&#xff09;概述状态模式UML图作用&#xff1a;状态模式的结构环境&#xff08;Context&#xff09;类&#xff1a;抽象状态&#xff08;State&#xff09;类&#xff1a;具体状态&#xff08;Concrete State&#xff09;类&#x…

python使用pip进行库的下载

前言 现如今有太多的python编译软件&#xff0c;其库的下载也是五花八门&#xff0c;但在作者看来&#xff0c;无论是哪种方法都是万变不离其宗&#xff0c;即pip下载。 pip是python的包管理工具&#xff0c;无论你是用的什么python软件&#xff0c;都可以用pip进行库的下载。 …