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回归的组成部分
-
输入层:
- 接收输入数据的特征向量,每个节点对应一个特征。
-
隐藏层:
- 通常包含大量神经元,使用非线性激活函数(如Sigmoid、Hardlim等)对输入特征进行非线性映射。
- 隐藏层的权重和偏置随机初始化,并在训练过程中保持不变。
-
输出层:
- 将隐藏层的输出通过线性组合生成最终的回归结果。
- 输出层的权重通过解析方法(如最小二乘法)计算得到。
ELM回归的工作原理
ELM回归通过以下步骤实现回归任务:
-
数据准备与预处理:
- 数据收集与整理:确保数据的完整性和准确性,处理缺失值和异常值。
- 数据划分:将数据集划分为训练集和测试集,常用比例为70%训练集和30%测试集。
- 数据预处理:对数据进行归一化或标准化处理,以提高模型的训练效果和稳定性。
-
构建ELM模型:
- 初始化权重和偏置:随机初始化输入层到隐藏层的权重矩阵和偏置向量。
- 选择激活函数:根据数据分布和任务需求选择合适的激活函数,如Sigmoid函数或Hardlim函数。
-
训练ELM模型:
- 计算隐藏层输出:通过输入数据和初始化的权重及偏置计算隐藏层的输出。
- 计算输出层权重:使用最小二乘法或其他解析方法计算隐藏层到输出层的权重,确保输出与真实目标值之间的误差最小。
-
模型预测与评估:
- 使用训练好的ELM模型对训练集和测试集进行回归预测。
- 计算预测误差和其他性能指标(如RMSE、R²、MAE等),评估模型的回归准确性和泛化能力。
-
结果分析与可视化:
- 预测结果对比图:绘制真实值与预测值的对比图,直观展示模型的回归效果。
- 散点图:绘制真实值与预测值的散点图,评估模型的拟合能力。
- 性能指标:计算并显示RMSE、R²、MAE、MBE、MAPE等回归性能指标,全面评估模型性能。
ELM回归的优势
-
训练速度快:
- 由于隐藏层权重和偏置随机初始化且不需要迭代优化,ELM的训练速度远快于传统的反向传播神经网络。
-
泛化能力强:
- ELM通过解析方法计算输出层权重,具有良好的泛化性能,能够在未见数据上表现出色。
-
实现简单:
- ELM的训练过程不依赖复杂的梯度下降算法,算法实现简单,易于理解和应用。
-
适用于大规模数据:
- ELM能够高效处理大规模数据集,适用于工业、金融、医疗等多个领域的回归任务。
-
避免过拟合:
- 通过适当的隐藏层神经元数量和正则化方法,ELM能够有效避免过拟合现象。
ELM回归的应用
ELM回归广泛应用于各类需要精确预测和拟合的领域,包括但不限于:
-
金融预测:
- 股票价格预测:预测股票市场的未来价格走势。
- 经济指标预测:预测GDP、通胀率等宏观经济指标。
-
工程与制造:
- 设备寿命预测:预测设备的剩余使用寿命。
- 质量控制:拟合和预测制造过程中关键参数,确保产品质量。
-
环境科学:
- 污染物浓度预测:预测空气或水体中的污染物浓度,进行环境监测。
- 气象预测:预测未来的气温、降水量等气象指标。
-
医疗健康:
- 疾病风险预测:预测个体患某种疾病的风险。
- 医疗费用预测:预测患者的医疗费用支出。
-
市场营销:
- 销售预测:预测产品的未来销售量,优化库存管理。
- 客户需求预测:预测客户的购买行为和需求变化,制定营销策略。
如何使用ELM回归
使用ELM回归模型主要包括以下步骤:
-
准备数据集:
- 数据收集与整理:确保数据的完整性和准确性,处理缺失值和异常值。
- 数据划分:将数据集划分为训练集和测试集,常用比例为70%训练集和30%测试集。
- 数据预处理:对数据进行归一化或标准化处理,以提高模型的训练效果和稳定性。
-
训练ELM模型:
- 初始化权重和偏置:随机初始化输入层到隐藏层的权重矩阵和偏置向量。
- 选择激活函数:选择合适的激活函数,如Sigmoid函数或Hardlim函数。
- 计算隐藏层输出:通过输入数据和初始化的权重及偏置计算隐藏层的输出。
- 计算输出层权重:使用最小二乘法或其他解析方法计算隐藏层到输出层的权重,确保输出与真实目标值之间的误差最小。
-
模型预测与评估:
- 使用训练好的ELM模型对训练集和测试集进行回归预测。
- 计算预测误差和其他性能指标,如RMSE、R²、MAE、MBE、MAPE等,评估模型的回归准确性和泛化能力。
-
结果分析与可视化:
- 预测结果对比图:绘制真实值与预测值的对比图,直观展示模型的回归效果。
- 散点图:绘制真实值与预测值的散点图,评估模型的拟合能力。
- 性能指标:计算并显示RMSE、R²、MAE、MBE、MAPE等回归性能指标,全面评估模型性能。
通过上述步骤,用户可以利用ELM回归模型高效地解决各种回归问题,提升模型的预测准确性和鲁棒性。
代码简介
该MATLAB代码实现了基于**极限学习机(ELM)**的回归算法,简称“ELM回归”。其主要流程如下:
-
数据预处理:
- 导入数据集,并随机打乱数据顺序。
- 将数据集划分为训练集和测试集。
- 对输入数据和目标变量进行归一化处理,以提高训练效果和稳定性。
-
ELM模型构建与训练:
- 使用
elmtrain
函数训练ELM模型,初始化输入权重、偏置并计算输出权重。 - 使用
elmpredict
函数对训练集和测试集进行回归预测。
- 使用
-
结果分析与可视化:
- 绘制训练集和测试集的真实值与预测值对比图,直观展示回归效果。
- 计算并显示相关回归性能指标(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
:预测结果,可以是回归值或分类标签索引。
主要步骤:
- 计算隐层输出:
- 通过输入数据和输入权重矩阵计算隐层的线性组合,并加上偏置。
- 应用激活函数:
- 根据指定的激活函数类型,对线性组合结果进行非线性映射。
- 计算输出层预测值:
- 将隐层输出通过输出权重矩阵进行线性组合,得到最终的预测值。
- 转换为分类模式(如果需要):
- 如果
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
:回归或分类类型。
主要步骤:
- 检查输入输出样本数是否匹配:
- 确保训练集的输入和输出样本数相同。
- 转入分类模式(如果需要):
- 如果
TYPE
为1,表示分类任务,将类别标签转换为二进制向量形式。
- 如果
- 初始化权重和偏置:
- 随机初始化输入权重矩阵
IW
和偏置向量B
。
- 随机初始化输入权重矩阵
- 计算隐藏层输出:
- 通过输入数据和输入权重矩阵计算隐层的线性组合,并加上偏置。
- 应用激活函数:
- 根据指定的激活函数类型,对线性组合结果进行非线性映射。
- 计算输出层权重:
- 使用伪逆方法计算输出权重矩阵
LW
,确保输出与真实目标值之间的误差最小。
- 使用伪逆方法计算输出权重矩阵
3. main.m 文件说明
main.m
是主脚本文件,负责数据的读取、预处理、ELM模型的训练与预测、结果的可视化及性能指标的计算。
主要步骤:
-
初始化:
- 清除工作区变量,关闭所有图形窗口,清空命令行窗口,关闭警告信息,确保代码运行环境的干净和无干扰。
-
读取数据:
- 使用
xlsread
函数从Excel文件数据集.xlsx
中读取数据。假设数据集的最后一列为目标变量(需要预测的值),其他列为输入特征。
- 使用
-
数据分析:
- 设定训练集占数据集的比例为70%,即
num_size = 0.7
。 - 设定数据集的最后一列为输出(目标变量),即
outdim = 1
。 - 计算数据集中的样本总数
num_samples
。 - 使用
randperm
函数随机打乱数据集的顺序,以避免数据排序带来的偏差。如果不希望打乱数据集,可以注释掉该行代码。 - 计算训练集的样本数量
num_train_s
。 - 计算输入特征的维度
f_
(总列数减去输出维度)。
- 设定训练集占数据集的比例为70%,即
-
划分训练集和测试集:
- 提取前
num_train_s
个样本的输入特征和输出目标作为训练集,并进行转置,使每列为一个样本。 - 提取剩余样本的输入特征和输出目标作为测试集,并进行转置,使每列为一个样本。
- 获取训练集和测试集的样本数量
M
和N
。
- 提取前
-
数据归一化:
- 使用
mapminmax
函数将训练集输入数据缩放到[0,1]的范围内,并保存归一化参数ps_input
。 - 使用训练集的归一化参数对测试集输入数据进行同样的归一化处理,确保训练集和测试集的数据尺度一致。
- 同样地,对训练集和测试集的输出数据进行归一化处理,保存归一化参数
ps_output
。
- 使用
-
创建ELM模型:
- 设定隐藏层神经元数量
num_hiddens
为50。 - 设定激活函数类型
activate_model
为’Sigmoid’。 - 设定模型类型
TYPE
为0,表示回归任务。 - 调用
elmtrain
函数训练ELM模型,获取输入权重IW
、偏置B
、输出权重LW
、激活函数类型TF
和模型类型TYPE
。
- 设定隐藏层神经元数量
-
仿真测试:
- 使用
elmpredict
函数对训练集和测试集进行预测,得到训练集的预测结果t_sim1
和测试集的预测结果t_sim2
。
- 使用
-
数据反归一化:
- 使用
mapminmax('reverse', ...)
函数将训练集和测试集的预测结果反归一化,恢复到原始数据的尺度,得到T_sim1
和T_sim2
。
- 使用
-
均方根误差(RMSE):
- 计算训练集和测试集的均方根误差
error1
和error2
,衡量模型的回归性能。
- 计算训练集和测试集的均方根误差
-
绘图:
- 训练集预测结果对比图:
- 使用
plot
函数绘制训练集的真实值与预测值对比曲线,红色星号表示真实值,蓝色圆圈表示预测值。 - 添加图例、坐标轴标签、标题和网格,提升图形的可读性。
- 设置X轴范围为[1, M]。
- 使用
- 测试集预测结果对比图:
- 使用
plot
函数绘制测试集的真实值与预测值对比曲线,红色星号表示真实值,蓝色圆圈表示预测值。 - 添加图例、坐标轴标签、标题和网格,提升图形的可读性。
- 设置X轴范围为[1, N]。
- 使用
- 训练集预测结果对比图:
-
相关指标计算:
- 决定系数(R²):
- 计算训练集和测试集的决定系数
R1
和R2
,衡量模型对数据的拟合程度。 - 使用
disp
函数显示R²值。
- 计算训练集和测试集的决定系数
- 平均绝对误差(MAE):
- 计算训练集和测试集的平均绝对误差
mae1
和mae2
。 - 使用
disp
函数显示MAE值。
- 计算训练集和测试集的平均绝对误差
- 平均偏差误差(MBE):
- 计算训练集和测试集的平均偏差误差
mbe1
和mbe2
,衡量模型是否存在系统性偏差。 - 使用
disp
函数显示MBE值。
- 计算训练集和测试集的平均偏差误差
- 平均绝对百分比误差(MAPE):
- 计算训练集和测试集的平均绝对百分比误差
mape1
和mape2
。 - 使用
disp
函数显示MAPE值。
- 计算训练集和测试集的平均绝对百分比误差
- 均方根误差(RMSE):
- 使用
disp
函数显示训练集和测试集的RMSE值。
- 使用
- 决定系数(R²):
-
绘制散点图:
- 训练集散点图:
- 使用
scatter
函数绘制训练集真实值与预测值的散点图,蓝色散点表示预测结果。 - 使用
plot
函数绘制理想预测线(真实值等于预测值的对角线)。 - 设置坐标轴标签、图形标题、轴范围,并显示网格。
- 使用
- 测试集散点图:
- 使用
scatter
函数绘制测试集真实值与预测值的散点图,蓝色散点表示预测结果。 - 使用
plot
函数绘制理想预测线(真实值等于预测值的对角线)。 - 设置坐标轴标签、图形标题、轴范围,并显示网格。
- 使用
- 训练集散点图:
代码使用注意事项
-
数据集格式:
- 目标变量:确保
数据集.xlsx
的最后一列为目标变量,且目标变量为数值型数据。如果目标变量为分类标签,需先进行数值编码。 - 特征类型:数据集的其他列应为数值型特征,适合进行归一化处理。如果特征包含类别变量,需先进行编码转换。
- 目标变量:确保
-
参数调整:
- 隐藏层神经元数量(N):在
main.m
文件中通过num_hiddens = 50
设定。根据数据集的复杂度和特征数量调整隐藏层的神经元数量,神经元数量过少可能导致欠拟合,过多则可能导致过拟合。 - 激活函数(TF):选择合适的激活函数类型,如’Sigmoid’或’Hardlim’。不同的激活函数对模型性能有不同影响。
- 模型类型(TYPE):在本代码中设定为0,表示回归任务。如果需要进行分类任务,将其设定为1,并确保目标变量为类别索引。
- 训练集比例:默认设置为70%训练集,30%测试集。根据数据集大小和任务需求调整训练集比例,以确保训练集具有足够的代表性。
- 隐藏层神经元数量(N):在
-
环境要求:
- MATLAB版本:确保使用的MATLAB版本支持
elmtrain
和elmpredict
函数。如果ELM工具箱不可用,可自行实现这些函数或使用其他机器学习工具箱中的方法。 - 工具箱:需要安装统计和机器学习工具箱(Statistics and Machine Learning Toolbox),以支持数据预处理和矩阵运算。
- MATLAB版本:确保使用的MATLAB版本支持
-
性能优化:
- 数据预处理:除了归一化处理,还可以考虑主成分分析(PCA)等降维方法,减少特征数量,提升模型训练效率和性能。
- 网络结构优化:通过调整隐藏层神经元数量、选择不同的激活函数等方法优化模型结构,提升回归性能。
- 正则化:在训练过程中,可以引入正则化方法(如L2正则化),以防止模型过拟合,提高泛化能力。
-
结果验证:
- 交叉验证:采用k折交叉验证方法评估模型的稳定性和泛化能力,避免因数据划分偶然性导致的性能波动。
- 多次运行:由于ELM模型对初始权重敏感,建议多次运行模型,取平均性能指标,以获得更稳定的评估结果。
- 模型对比:将ELM回归模型与其他回归模型(如BP回归、支持向量回归、随机森林回归等)进行对比,评估不同模型在相同数据集上的表现差异。
-
性能指标理解:
- 决定系数(R²):衡量模型对数据的拟合程度,值越接近1表示模型解释变量变异的能力越强。
- 平均绝对误差(MAE):表示预测值与真实值之间的平均绝对差异,值越小表示模型性能越好。
- 平均偏差误差(MBE):表示预测值与真实值之间的平均差异,正值表示模型倾向于高估,负值表示模型倾向于低估。
- 平均绝对百分比误差(MAPE):表示预测值与真实值之间的平均绝对百分比差异,适用于评估相对误差。
- 均方根误差(RMSE):表示预测值与真实值之间的平方差的平均值的平方根,值越小表示模型性能越好。
通过理解和应用上述ELM回归模型,初学者可以有效地处理各种回归任务,并深入掌握极限学习机的工作原理和应用方法。不断调整和优化模型参数,结合实际应用场景,能够进一步提升模型的预测准确性和鲁棒性。