当前位置: 首页 > article >正文

ELM回归-单隐层前馈神经网络(Single Hidden Layer Feedforward Neural Network)

ELM回归详细介绍

源码

什么是ELM回归?

ELM回归(极限学习机回归,Extreme Learning Machine Regression)是一种基于**单隐层前馈神经网络(Single Hidden Layer Feedforward Neural Network, SLFN)**的高效回归算法。ELM由黄铁军等人在2004年提出,旨在通过随机初始化输入层到隐藏层的权重,并通过解析方法快速计算隐藏层到输出层的权重,从而实现高效的训练过程。与传统的反向传播算法相比,ELM具有训练速度快、泛化能力强等优点,广泛应用于回归、分类和模式识别等领域。

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

    • 接收输入数据的特征向量,每个节点对应一个特征。
  2. 隐藏层

    • 通常包含大量神经元,使用非线性激活函数(如Sigmoid、Hardlim等)对输入特征进行非线性映射。
    • 隐藏层的权重和偏置随机初始化,并在训练过程中保持不变。
  3. 输出层

    • 将隐藏层的输出通过线性组合生成最终的回归结果。
    • 输出层的权重通过解析方法(如最小二乘法)计算得到。
ELM回归的工作原理

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

  1. 数据准备与预处理

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

    • 初始化权重和偏置:随机初始化输入层到隐藏层的权重矩阵和偏置向量。
    • 选择激活函数:根据数据分布和任务需求选择合适的激活函数,如Sigmoid函数或Hardlim函数。
  3. 训练ELM模型

    • 计算隐藏层输出:通过输入数据和初始化的权重及偏置计算隐藏层的输出。
    • 计算输出层权重:使用最小二乘法或其他解析方法计算隐藏层到输出层的权重,确保输出与真实目标值之间的误差最小。
  4. 模型预测与评估

    • 使用训练好的ELM模型对训练集和测试集进行回归预测。
    • 计算预测误差和其他性能指标(如RMSE、R²、MAE等),评估模型的回归准确性和泛化能力。
  5. 结果分析与可视化

    • 预测结果对比图:绘制真实值与预测值的对比图,直观展示模型的回归效果。
    • 散点图:绘制真实值与预测值的散点图,评估模型的拟合能力。
    • 性能指标:计算并显示RMSE、R²、MAE、MBE、MAPE等回归性能指标,全面评估模型性能。
ELM回归的优势
  1. 训练速度快

    • 由于隐藏层权重和偏置随机初始化且不需要迭代优化,ELM的训练速度远快于传统的反向传播神经网络。
  2. 泛化能力强

    • ELM通过解析方法计算输出层权重,具有良好的泛化性能,能够在未见数据上表现出色。
  3. 实现简单

    • ELM的训练过程不依赖复杂的梯度下降算法,算法实现简单,易于理解和应用。
  4. 适用于大规模数据

    • ELM能够高效处理大规模数据集,适用于工业、金融、医疗等多个领域的回归任务。
  5. 避免过拟合

    • 通过适当的隐藏层神经元数量和正则化方法,ELM能够有效避免过拟合现象。
ELM回归的应用

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

  1. 金融预测

    • 股票价格预测:预测股票市场的未来价格走势。
    • 经济指标预测:预测GDP、通胀率等宏观经济指标。
  2. 工程与制造

    • 设备寿命预测:预测设备的剩余使用寿命。
    • 质量控制:拟合和预测制造过程中关键参数,确保产品质量。
  3. 环境科学

    • 污染物浓度预测:预测空气或水体中的污染物浓度,进行环境监测。
    • 气象预测:预测未来的气温、降水量等气象指标。
  4. 医疗健康

    • 疾病风险预测:预测个体患某种疾病的风险。
    • 医疗费用预测:预测患者的医疗费用支出。
  5. 市场营销

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

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

  1. 准备数据集

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

    • 初始化权重和偏置:随机初始化输入层到隐藏层的权重矩阵和偏置向量。
    • 选择激活函数:选择合适的激活函数,如Sigmoid函数或Hardlim函数。
    • 计算隐藏层输出:通过输入数据和初始化的权重及偏置计算隐藏层的输出。
    • 计算输出层权重:使用最小二乘法或其他解析方法计算隐藏层到输出层的权重,确保输出与真实目标值之间的误差最小。
  3. 模型预测与评估

    • 使用训练好的ELM模型对训练集和测试集进行回归预测。
    • 计算预测误差和其他性能指标,如RMSE、R²、MAE、MBE、MAPE等,评估模型的回归准确性和泛化能力。
  4. 结果分析与可视化

    • 预测结果对比图:绘制真实值与预测值的对比图,直观展示模型的回归效果。
    • 散点图:绘制真实值与预测值的散点图,评估模型的拟合能力。
    • 性能指标:计算并显示RMSE、R²、MAE、MBE、MAPE等回归性能指标,全面评估模型性能。

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


代码简介

该MATLAB代码实现了基于**极限学习机(ELM)**的回归算法,简称“ELM回归”。其主要流程如下:

  1. 数据预处理

    • 导入数据集,并随机打乱数据顺序。
    • 将数据集划分为训练集和测试集。
    • 对输入数据和目标变量进行归一化处理,以提高训练效果和稳定性。
  2. ELM模型构建与训练

    • 使用elmtrain函数训练ELM模型,初始化输入权重、偏置并计算输出权重。
    • 使用elmpredict函数对训练集和测试集进行回归预测。
  3. 结果分析与可视化

    • 绘制训练集和测试集的真实值与预测值对比图,直观展示回归效果。
    • 计算并显示相关回归性能指标(R²、MAE、MBE、MAPE、RMSE)。
    • 绘制真实值与预测值的散点图,评估模型的拟合能力。

以下是包含详细中文注释的ELM回归MATLAB代码。


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

elmpredict.m 文件代码
function Y = elmpredict(p_test, IW, B, LW, TF, TYPE)
    % ELM预测函数
    % 输入:
    %   p_test - 测试集输入数据 (R * Q)
    %   IW     - 输入权重矩阵 (N * R)
    %   B      - 偏置向量 (N * 1)
    %   LW     - 输出权重矩阵 (N * S)
    %   TF     - 激活函数类型 ('sig' 或 'hardlim')
    %   TYPE   - 回归或分类类型 (0 为回归, 1 为分类)
    % 输出:
    %   Y      - 预测结果 (1 * Q) 或类别索引
    
    %% 计算隐层输出
    Q = size(p_test, 2);                          % 测试集样本数
    BiasMatrix = repmat(B, 1, Q);                 % 将偏置向量复制Q列,形成偏置矩阵
    tempH = IW * p_test + BiasMatrix;             % 计算隐藏层的线性组合
    
    %% 选择激活函数
    switch TF
        case 'sig'
            H = 1 ./ (1 + exp(-tempH));           % Sigmoid激活函数
        case 'hardlim'
            H = hardlim(tempH);                   % Hardlim激活函数
        otherwise
            error('未知的激活函数类型');
    end
    
    %% 计算输出
    Y = (H' * LW)';                                % 计算输出层的线性组合
    
    %% 转化分类模式
    if TYPE == 1
        temp_Y = zeros(size(Y));                    % 初始化临时矩阵用于存储分类结果
        for i = 1:size(Y, 2)
            [~, index] = max(Y(:, i));              % 找到每列中的最大值索引
            temp_Y(index, i) = 1;                    % 将对应位置设为1
        end
        Y = vec2ind(temp_Y);                         % 将二进制向量转换为类别索引
    end
end
elmtrain.m 文件代码
function [IW, B, LW, TF, TYPE] = elmtrain(p_train, t_train, N, TF, TYPE)
    % ELM训练函数
    % 输入:
    %   p_train - 训练集输入数据 (R * Q)
    %   t_train - 训练集输出数据 (S * Q)
    %   N       - 隐藏层神经元数量
    %   TF      - 激活函数类型 ('sig' 或 'hardlim')
    %   TYPE    - 回归或分类类型 (0 为回归, 1 为分类)
    % 输出:
    %   IW  - 输入权重矩阵 (N * R)
    %   B   - 偏置向量 (N * 1)
    %   LW  - 输出权重矩阵 (N * S)
    %   TF  - 激活函数类型
    %   TYPE - 回归或分类类型
    
    % 检查输入输出样本数是否匹配
    if size(p_train, 2) ~= size(t_train, 2)
        error('ELM:Arguments', '训练集的输入和输出样本数必须相同。');
    end
    
    %% 转入分类模式
    if TYPE == 1
        t_train = ind2vec(t_train);                 % 将类别索引转换为二进制向量
    end
    
    %% 初始化权重
    R = size(p_train, 1);                           % 输入特征维度
    Q = size(t_train, 2);                           % 样本数
    IW = rand(N, R) * 2 - 1;                        % 随机初始化输入权重矩阵,范围[-1, 1]
    B  = rand(N, 1);                                % 随机初始化偏置向量,范围[0, 1]
    BiasMatrix = repmat(B, 1, Q);                   % 复制偏置向量,形成偏置矩阵
    
    %% 计算隐藏层输出
    tempH = IW * p_train + BiasMatrix;              % 计算隐藏层的线性组合
    
    %% 选择激活函数
    switch TF
        case 'sig'
            H = 1 ./ (1 + exp(-tempH));            % Sigmoid激活函数
        case 'hardlim'
            H = hardlim(tempH);                    % Hardlim激活函数
        otherwise
            error('未知的激活函数类型');
    end
    
    %% 伪逆计算输出权重
    LW = pinv(H') * t_train';                        % 使用伪逆计算输出权重矩阵
end
main.m 文件代码
%% 初始化
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_)';       % 训练集输入,转置使每列为一个样本 (f_ * Q_train)
T_train = res(1: num_train_s, f_ + 1: end)'; % 训练集输出,转置使每列为一个样本 (outdim * Q_train)
M = size(P_train, 2);                        % 训练集样本数

P_test = res(num_train_s + 1: end, 1: f_)';   % 测试集输入,转置使每列为一个样本 (f_ * Q_test)
T_test = res(num_train_s + 1: end, f_ + 1: end)'; % 测试集输出,转置使每列为一个样本 (outdim * Q_test)
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 );         % 使用训练集的归一化参数对测试集输出进行归一化

%% 创建模型
num_hiddens = 50;        % 隐藏层神经元数量
activate_model = 'sig';  % 激活函数类型,'sig' 为 Sigmoid 函数
TYPE = 0;                % 回归模式,0 为回归,1 为分类
[IW, B, LW, TF, TYPE] = elmtrain(p_train, t_train, num_hiddens, activate_model, TYPE); % 训练ELM模型

%% 仿真测试
t_sim1 = elmpredict(p_train, IW, B, LW, TF, TYPE);  % 使用训练集数据进行预测,得到训练集的预测结果
t_sim2 = elmpredict(p_test , IW, B, LW, TF, TYPE);  % 使用测试集数据进行预测,得到测试集的预测结果

%% 数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);  % 将训练集预测结果反归一化,恢复到原始尺度
T_sim2 = mapminmax('reverse', t_sim2, ps_output);  % 将测试集预测结果反归一化,恢复到原始尺度

%% 均方根误差(RMSE)
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);  % 计算训练集的均方根误差(RMSE)
error2 = sqrt(sum((T_sim2 - T_test ).^2) ./ N);  % 计算测试集的均方根误差(RMSE)

%% 绘图
% 绘制训练集预测结果对比图
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(['训练集数据的R²为:', num2str(R1)])  % 显示训练集的R²
disp(['测试集数据的R²为:', num2str(R2)])  % 显示测试集的R²

% MAE
mae1 = sum(abs(T_sim1 - T_train)) ./ M ;  % 计算训练集的平均绝对误差MAE
mae2 = sum(abs(T_sim2 - T_test )) ./ N ;  % 计算测试集的平均绝对误差MAE

disp(['训练集数据的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 ;  % 计算测试集的平均偏差误差MBE

disp(['训练集数据的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 ;  % 计算测试集的平均绝对百分比误差MAPE

disp(['训练集数据的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. elmpredict.m 文件说明

elmpredict.m 是用于使用训练好的ELM模型对新的输入数据进行预测的函数。其主要功能包括计算隐层输出、应用激活函数、计算输出层的预测值以及根据需要转换为分类模式。

  • 输入参数

    • p_test:测试集的输入数据矩阵,尺寸为 (R * Q),其中R为输入特征维度,Q为测试样本数。
    • IW:输入权重矩阵,尺寸为 (N * R),N为隐藏层神经元数量。
    • B:偏置向量,尺寸为 (N * 1)。
    • LW:输出权重矩阵,尺寸为 (N * S),S为输出维度。
    • TF:激活函数类型,可以是 'sig'(Sigmoid函数)或 'hardlim'(Hardlim函数)。
    • TYPE:回归或分类类型,0表示回归,1表示分类。
  • 输出参数

    • Y:预测结果,可以是回归值或分类标签索引。

主要步骤

  1. 计算隐层输出
    • 通过输入数据和输入权重矩阵计算隐层的线性组合,并加上偏置。
  2. 应用激活函数
    • 根据指定的激活函数类型,对线性组合结果进行非线性映射。
  3. 计算输出层预测值
    • 将隐层输出通过输出权重矩阵进行线性组合,得到最终的预测值。
  4. 转换为分类模式(如果需要)
    • 如果TYPE为1,表示分类任务,将预测值转换为类别标签索引。
2. elmtrain.m 文件说明

elmtrain.m 是用于训练ELM模型的函数。其主要功能包括初始化输入权重和偏置,计算隐藏层输出,并通过解析方法计算输出层权重。

  • 输入参数

    • p_train:训练集的输入数据矩阵,尺寸为 (R * Q),R为输入特征维度,Q为训练样本数。
    • t_train:训练集的输出数据矩阵,尺寸为 (S * Q),S为输出维度。
    • N:隐藏层神经元数量。
    • TF:激活函数类型,可以是 'sig'(Sigmoid函数)或 'hardlim'(Hardlim函数)。
    • TYPE:回归或分类类型,0表示回归,1表示分类。
  • 输出参数

    • IW:输入权重矩阵,尺寸为 (N * R)。
    • B:偏置向量,尺寸为 (N * 1)。
    • LW:输出权重矩阵,尺寸为 (N * S)。
    • TF:激活函数类型。
    • TYPE:回归或分类类型。

主要步骤

  1. 检查输入输出样本数是否匹配
    • 确保训练集的输入和输出样本数相同。
  2. 转入分类模式(如果需要)
    • 如果TYPE为1,表示分类任务,将类别标签转换为二进制向量形式。
  3. 初始化权重和偏置
    • 随机初始化输入权重矩阵IW和偏置向量B
  4. 计算隐藏层输出
    • 通过输入数据和输入权重矩阵计算隐层的线性组合,并加上偏置。
  5. 应用激活函数
    • 根据指定的激活函数类型,对线性组合结果进行非线性映射。
  6. 计算输出层权重
    • 使用伪逆方法计算输出权重矩阵LW,确保输出与真实目标值之间的误差最小。
3. main.m 文件说明

main.m 是主脚本文件,负责数据的读取、预处理、ELM模型的训练与预测、结果的可视化及性能指标的计算。

主要步骤

  1. 初始化

    • 清除工作区变量,关闭所有图形窗口,清空命令行窗口,关闭警告信息,确保代码运行环境的干净和无干扰。
  2. 读取数据

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

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

    • 提取前num_train_s个样本的输入特征和输出目标作为训练集,并进行转置,使每列为一个样本。
    • 提取剩余样本的输入特征和输出目标作为测试集,并进行转置,使每列为一个样本。
    • 获取训练集和测试集的样本数量MN
  5. 数据归一化

    • 使用mapminmax函数将训练集输入数据缩放到[0,1]的范围内,并保存归一化参数ps_input
    • 使用训练集的归一化参数对测试集输入数据进行同样的归一化处理,确保训练集和测试集的数据尺度一致。
    • 同样地,对训练集和测试集的输出数据进行归一化处理,保存归一化参数ps_output
  6. 创建ELM模型

    • 设定隐藏层神经元数量num_hiddens为50。
    • 设定激活函数类型activate_model为’Sigmoid’。
    • 设定模型类型TYPE为0,表示回归任务。
    • 调用elmtrain函数训练ELM模型,获取输入权重IW、偏置B、输出权重LW、激活函数类型TF和模型类型TYPE
  7. 仿真测试

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

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

    • 计算训练集和测试集的均方根误差error1error2,衡量模型的回归性能。
  10. 绘图

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

    • 决定系数(R²)
      • 计算训练集和测试集的决定系数R1R2,衡量模型对数据的拟合程度。
      • 使用disp函数显示R²值。
    • 平均绝对误差(MAE)
      • 计算训练集和测试集的平均绝对误差mae1mae2
      • 使用disp函数显示MAE值。
    • 平均偏差误差(MBE)
      • 计算训练集和测试集的平均偏差误差mbe1mbe2,衡量模型是否存在系统性偏差。
      • 使用disp函数显示MBE值。
    • 平均绝对百分比误差(MAPE)
      • 计算训练集和测试集的平均绝对百分比误差mape1mape2
      • 使用disp函数显示MAPE值。
    • 均方根误差(RMSE)
      • 使用disp函数显示训练集和测试集的RMSE值。
  12. 绘制散点图

    • 训练集散点图
      • 使用scatter函数绘制训练集真实值与预测值的散点图,蓝色散点表示预测结果。
      • 使用plot函数绘制理想预测线(真实值等于预测值的对角线)。
      • 设置坐标轴标签、图形标题、轴范围,并显示网格。
    • 测试集散点图
      • 使用scatter函数绘制测试集真实值与预测值的散点图,蓝色散点表示预测结果。
      • 使用plot函数绘制理想预测线(真实值等于预测值的对角线)。
      • 设置坐标轴标签、图形标题、轴范围,并显示网格。

代码使用注意事项

  1. 数据集格式

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

    • 隐藏层神经元数量(N):在main.m文件中通过num_hiddens = 50设定。根据数据集的复杂度和特征数量调整隐藏层的神经元数量,神经元数量过少可能导致欠拟合,过多则可能导致过拟合。
    • 激活函数(TF):选择合适的激活函数类型,如’Sigmoid’或’Hardlim’。不同的激活函数对模型性能有不同影响。
    • 模型类型(TYPE):在本代码中设定为0,表示回归任务。如果需要进行分类任务,将其设定为1,并确保目标变量为类别索引。
    • 训练集比例:默认设置为70%训练集,30%测试集。根据数据集大小和任务需求调整训练集比例,以确保训练集具有足够的代表性。
  3. 环境要求

    • MATLAB版本:确保使用的MATLAB版本支持elmtrainelmpredict函数。如果ELM工具箱不可用,可自行实现这些函数或使用其他机器学习工具箱中的方法。
    • 工具箱:需要安装统计和机器学习工具箱(Statistics and Machine Learning Toolbox),以支持数据预处理和矩阵运算。
  4. 性能优化

    • 数据预处理:除了归一化处理,还可以考虑主成分分析(PCA)等降维方法,减少特征数量,提升模型训练效率和性能。
    • 网络结构优化:通过调整隐藏层神经元数量、选择不同的激活函数等方法优化模型结构,提升回归性能。
    • 正则化:在训练过程中,可以引入正则化方法(如L2正则化),以防止模型过拟合,提高泛化能力。
  5. 结果验证

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

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

通过理解和应用上述ELM回归模型,初学者可以有效地处理各种回归任务,并深入掌握极限学习机的工作原理和应用方法。不断调整和优化模型参数,结合实际应用场景,能够进一步提升模型的预测准确性和鲁棒性。


http://www.kler.cn/a/453917.html

相关文章:

  • 嵌入式科普(25)Home Assistant米家集成意味着IOT的核心是智能设备
  • 安全合规遇 AI 强援:深度驱动行业发展新引擎 | 倍孜网络CEO聂子尧出席ICT深度观察报告会!
  • IBatis和MyBatis在细节上的不同有哪些
  • flink-1.16 table sql 消费 kafka 数据,指定时间戳位置消费数据报错:Invalid negative offset 问题解决
  • 目录jangow-01-1.0.1靶机
  • Playwright爬虫xpath获取技巧
  • STM32基于标准库如何查看时钟主频,100%简单
  • 使用 ECharts 与 Vue 构建数据可视化组件
  • 在linux系统中使用jdbc访问sqlite数据库时报错“java.lang.UnsatisfiedLinkError”
  • 一文流:Mysql my.cnf配置完整示例
  • 精选9个自动化任务的Python脚本精选
  • docker仓库用户认证
  • sqli-labs关卡记录12
  • [python SQLAlchemy数据库操作入门]-11.面向对象方式操作股票数据
  • Ubuntu中 Nginx 虚拟主机设置指南
  • 【Win11】安装 VMware17 和 Ubuntu
  • 连接串口设备后鼠标出现乱跳
  • 交易生态全解析:聚合交易平台 交易策略平台 技术策略提供方 交易机器人平台 资管、支付平台 社交交易社区 跟单平台在饼圈量化的定义和关系是怎样的?
  • Docker 安装mysql ,redis,nacos
  • Linux挂在新硬盘
  • DP动态规划+贪心题目汇总
  • 24 go语言(golang) - gorm框架安装及使用案例详解
  • 什么是ondelete cascade以及使用sqlite演示ondelete cascade使用案例
  • apisix的hmac-auth认证
  • 【每日学点鸿蒙知识】图片控件对齐、上架的应用无法拉起应用详情页、RotateOptions配置、签名配置问题、弹框背景色
  • Leetcode 200 Number of Islands