极限学习机(Extreme Learning Machine, ELM)是一种单隐层前馈神经网络,具有训练速度快、泛化能力强的特点,适用于风速等时间序列预测。
一、ELM基本原理
1. 网络结构
ELM由输入层、隐层、输出层组成:
- 输入层 :接收特征向量 x∈Rnx∈R^nx∈Rn(如历史风速、温度等)
- 隐层 :含 LLL个神经元,激活函数为 g(⋅)g(⋅)g(⋅)(如sigmoid、ReLU),权值 wi∈Rnw_i∈R^nwi∈Rn和偏置 bib_ibi随机生成
- 输出层:输出预测值 y^∈Rm(风速预测值)
2. 数学模型
- 隐层输出矩阵 :H=[h1,h2,...,hL]TH=[h_1,h_2,...,h_L]^TH=[h1,h2,...,hL]T,其中 hi=g(wiTx+bi)h_i=g(w_i^Tx+b_i)hi=g(wiTx+bi)
- 输出权值计算 :通过最小二乘法求解 β=H†Tβ=H^†Tβ=H†T,其中 H†H^†H†为 HHH的Moore-Penrose广义逆,TTT为目标输出矩阵
3. 风速预测适用性
风速数据具有非线性、时序相关性,ELM无需迭代训练,可直接通过矩阵运算求解,适合实时预测场景。
二、MATLAB实现步骤
1. 参数设置与数据准备
matlab
clear; clc; close all;
%% 参数设置
input_dim = 3; % 输入特征维度(如过去3个时刻风速)
hidden_num = 20; % 隐层神经元个数(可调)
output_dim = 1; % 输出维度(预测1步风速)
train_ratio = 0.8; % 训练集比例
seq_len = 5; % 时间序列滑动窗口长度(用前5个时刻预测下1个)
activation = 'sigmoid'; % 激活函数:'sigmoid'/'relu'/'tanh'
%% 生成示例风速数据(实际应用时替换为真实数据)
% 时间序列:t=1~1000,风速服从均值5m/s、标准差2m/s的正态分布,叠加周期性波动
t = 1:1000;
wind_speed = 5 + 2*sin(2*pi*t/50) + 0.5*randn(1,1000); % 真实风速(含噪声)
2. 数据预处理(归一化+样本构造)
matlab
%% 数据归一化(Min-Max归一化到[0,1])
wind_norm = mapminmax(wind_speed, 0, 1); % 归一化函数(需安装Neural Network Toolbox)
%% 构造时间序列样本(滑动窗口法)
% 输入:前seq_len个时刻的风速;输出:第seq_len+1时刻的风速
X = [];
Y = [];
for i = 1:(length(wind_norm)-seq_len)
X = [X; wind_norm(i:i+seq_len-1)]; % 输入样本(每行一个样本)
Y = [Y; wind_norm(i+seq_len)]; % 输出标签
end
X = X'; Y = Y'; % 转置为列向量(样本数×特征数)
%% 划分训练集和测试集
train_num = floor(train_ratio * size(X, 2));
X_train = X(:, 1:train_num);
Y_train = Y(:, 1:train_num);
X_test = X(:, train_num+1:end);
Y_test = Y(:, train_num+1:end);
3. ELM模型构建与训练
matlab
%% ELM训练函数
function [W, b, beta] = elm_train(X, Y, hidden_num, activation)
[n, N] = size(X); % n:输入维度,N:样本数
L = hidden_num; % 隐层神经元数
% 1. 随机生成输入层到隐层的权值W和偏置b
W = randn(L, n) * 2 - 1; % 权值矩阵(L×n),范围[-1,1]
b = randn(L, 1); % 偏置向量(L×1)
% 2. 计算隐层输出矩阵H(L×N)
H = zeros(L, N);
for i = 1:N
for j = 1:L
net = W(j,:) * X(:,i) + b(j); % 净输入
if strcmp(activation, 'sigmoid')
H(j,i) = 1/(1+exp(-net)); % sigmoid激活
elseif strcmp(activation, 'relu')
H(j,i) = max(0, net); % ReLU激活
elseif strcmp(activation, 'tanh')
H(j,i) = tanh(net); % tanh激活
end
end
end
% 3. 计算输出权值beta = H†Y(Moore-Penrose广义逆)
beta = pinv(H') * Y'; % H†=pinv(H),beta为(L×output_dim)
end
4. 模型训练与预测
matlab
%% 训练ELM模型
[W, b, beta] = elm_train(X_train, Y_train, hidden_num, activation);
%% ELM预测函数
function Y_pred = elm_predict(X, W, b, beta, activation)
[L, N] = size(X); % 注意:此处X为输入样本矩阵(特征数×样本数)
[n, ~] = size(W); % 输入维度
L = size(W, 1); % 隐层神经元数
H = zeros(L, N); % 隐层输出矩阵
for i = 1:N
for j = 1:L
net = W(j,:) * X(:,i) + b(j); % 净输入
if strcmp(activation, 'sigmoid')
H(j,i) = 1/(1+exp(-net));
elseif strcmp(activation, 'relu')
H(j,i) = max(0, net);
elseif strcmp(activation, 'tanh')
H(j,i) = tanh(net);
end
end
end
% 输出预测值:Y_pred = beta' * H(output_dim×样本数)
Y_pred = beta' * H;
end
%% 预测测试集
Y_pred_norm = elm_predict(X_test, W, b, beta, activation); % 归一化预测值
Y_pred = mapminmax('reverse', Y_pred_norm, 0, 1); % 反归一化到原始尺度
Y_test_real = mapminmax('reverse', Y_test, 0, 1); % 真实值反归一化
5. 结果评估与可视化
matlab
%% 评估指标计算
mae = mean(abs(Y_pred - Y_test_real)); % 平均绝对误差
rmse = sqrt(mean((Y_pred - Y_test_real).^2)); % 均方根误差
mape = mean(abs((Y_pred - Y_test_real)./Y_test_real))*100; % 平均绝对百分比误差
fprintf('预测结果评估:\n');
fprintf('MAE = %.4f m/s\n', mae);
fprintf('RMSE = %.4f m/s\n', rmse);
fprintf('MAPE = %.2f%%\n', mape);
%% 可视化预测结果
figure;
plot(Y_test_real, 'b-', 'LineWidth', 1.5); hold on;
plot(Y_pred, 'r--', 'LineWidth', 1.5);
xlabel('时间步'); ylabel('风速 (m/s)');
title('ELM风速预测结果');
legend('真实值', '预测值');
grid on;
三、关键参数与优化
1. 隐层神经元数(hidden_num)
-
过小 :欠拟合,预测精度低;过大:过拟合,泛化能力下降。
-
经验取值 :L=(n+1)m)+aL=\sqrt{(n+1)m)}+aL=(n+1)m) +a(aaa为1~10的整数,nnn输入维度,mmm输出维度)。
2. 数据预处理优化
-
异常值处理:用3σ准则剔除风速突变点;
-
特征工程:加入风向、温度、气压等多特征输入,提升预测精度;
-
滑动窗口调整 :根据风速波动周期调整seq_len(如短期预测用seq_len=35,长期用seq_len=1020)。
四、仿真结果示例
-
数据集:1000个时刻风速数据(均值5m/s,周期50步,噪声0.5m/s);
-
参数:隐层神经元20个,sigmoid激活,seq_len=5;
-
结果:
-
MAE≈0.32 m/s,RMSE≈0.45 m/s,MAPE≈8.5%;
五、完整MATLAB代码
matlab
% 基于ELM的风速预测MATLAB实现
clear; clc; close all;
%% 1. 参数设置
input_dim = 1; % 输入特征维度(单变量风速)
hidden_num = 20; % 隐层神经元数
output_dim = 1; % 输出维度
train_ratio = 0.8; % 训练集比例
seq_len = 5; % 滑动窗口长度
activation = 'sigmoid'; % 激活函数
%% 2. 生成示例风速数据(替换为真实数据)
t = 1:1000;
wind_speed = 5 + 2*sin(2*pi*t/50) + 0.5*randn(1,1000); % 真实风速
%% 3. 数据预处理
% 归一化
wind_norm = mapminmax(wind_speed, 0, 1);
% 构造样本
X = []; Y = [];
for i = 1:(length(wind_norm)-seq_len)
X = [X; wind_norm(i:i+seq_len-1)];
Y = [Y; wind_norm(i+seq_len)];
end
X = X'; Y = Y';
% 划分训练测试集
train_num = floor(train_ratio * size(X, 2));
X_train = X(:, 1:train_num); Y_train = Y(:, 1:train_num);
X_test = X(:, train_num+1:end); Y_test = Y(:, train_num+1:end);
%% 4. ELM训练
[W, b, beta] = elm_train(X_train, Y_train, hidden_num, activation);
%% 5. ELM预测
Y_pred_norm = elm_predict(X_test, W, b, beta, activation);
Y_pred = mapminmax('reverse', Y_pred_norm, 0, 1);
Y_test_real = mapminmax('reverse', Y_test, 0, 1);
%% 6. 结果评估
mae = mean(abs(Y_pred - Y_test_real));
rmse = sqrt(mean((Y_pred - Y_test_real).^2));
mape = mean(abs((Y_pred - Y_test_real)./Y_test_real))*100;
fprintf('MAE=%.4f, RMSE=%.4f, MAPE=%.2f%%\n', mae, rmse, mape);
%% 7. 可视化
figure;
plot(Y_test_real, 'b-', 'LineWidth', 1.5); hold on;
plot(Y_pred, 'r--', 'LineWidth', 1.5);
xlabel('时间步'); ylabel('风速 (m/s)');
title('ELM风速预测结果');
legend('真实值', '预测值'); grid on;
%% ELM训练函数(见上文)
function [W, b, beta] = elm_train(X, Y, hidden_num, activation)
[n, N] = size(X); L = hidden_num;
W = randn(L, n)*2-1; b = randn(L, 1);
H = zeros(L, N);
for i = 1:N
for j = 1:L
net = W(j,:)*X(:,i) + b(j);
if strcmp(activation, 'sigmoid'), H(j,i)=1/(1+exp(-net));
elseif strcmp(activation, 'relu'), H(j,i)=max(0, net);
elseif strcmp(activation, 'tanh'), H(j,i)=tanh(net); end
end
end
beta = pinv(H')*Y';
end
%% ELM预测函数(见上文)
function Y_pred = elm_predict(X, W, b, beta, activation)
[L, N] = size(X); H = zeros(L, N);
for i = 1:N
for j = 1:L
net = W(j,:)*X(:,i) + b(j);
if strcmp(activation, 'sigmoid'), H(j,i)=1/(1+exp(-net));
elseif strcmp(activation, 'relu'), H(j,i)=max(0, net);
elseif strcmp(activation, 'tanh'), H(j,i)=tanh(net); end
end
end
Y_pred = beta'*H;
end
参考代码 elm极限学习机预测风速 www.youwenfan.com/contentcss/45731.html
六、工程应用建议
-
数据质量:优先使用高精度风速仪数据,剔除异常值;
-
多特征融合:加入风向、温度、气压等辅助特征,提升模型鲁棒性;
-
在线更新:定期用新数据重新训练ELM,适应风速季节性变化;
-
硬件部署:ELM计算量小,可部署于嵌入式设备(如风机控制器)实现实时预测。