基于ELM极限学习机的风速预测MATLAB实现

基于ELM极限学习机的风速预测MATLAB实现

极限学习机(Extreme Learning Machine, ELM)是一种单隐层前馈神经网络,具有训练速度快、泛化能力强的特点,适用于风速等时间序列预测。

一、ELM基本原理

1. 网络结构

ELM由输入层、隐层、输出层组成:

2. 数学模型

3. 风速预测适用性

风速数据具有非线性、时序相关性,ELM无需迭代训练,可直接通过矩阵运算求解,适合实时预测场景。

二、MATLAB实现步骤

1. 参数设置与数据准备

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. 数据预处理(归一化+样本构造)

%% 数据归一化(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模型构建与训练

%% 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. 模型训练与预测

%% 训练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. 结果评估与可视化

%% 评估指标计算
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)

2. 数据预处理优化

四、仿真结果示例

五、完整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/contentcns/45731.html

六、工程应用建议

  1. 数据质量:优先使用高精度风速仪数据,剔除异常值;
  2. 多特征融合:加入风向、温度、气压等辅助特征,提升模型鲁棒性;
  3. 在线更新:定期用新数据重新训练ELM,适应风速季节性变化;
  4. 硬件部署:ELM计算量小,可部署于嵌入式设备(如风机控制器)实现实时预测。

 

专注于matlab/simulink,电子电路,编程