简介:这份PDF文献面向风电功率预测方向的研究生、电力系统调度人员及机器学习爱好者,聚焦短期风电功率预测精度提升问题。资源为单篇学术论文,共1个PDF文件,压缩包约362KB,内容完整呈现了从风速预处理到模型仿真的研究链条。文中提出RBF-BP组合神经网络预测模型,先考虑风机尾流与地势对风速的影响,引入Jensen尾流模型和Lissaman尾流模型模拟复杂地形下的风速分布,再对风速进行预处理,最后建立组合网络完成功率预测。读者可从中获取RBF网络与BP网络的组合建模思路、尾流遮挡面积计算与风速修正方法,以及基于历史数据的仿真验证流程,对理解神经网络在新能源功率预测中的工程落地具有参考价值。目前已有147人学习,适合作为数据建模与深度学习应用的学习素材。
1. 风电功率预测为什么不能只用单一 BP 神经网络
风电场最头疼的不是发不出电,而是发出来的电和调度计划对不上。风电功率受风速、风向、温度、气压、地形粗糙度等多变量耦合影响,具有强随机性和间歇性。用单一 BP 神经网络做短期预测,常见结果是:训练集拟合得不错,一到测试集就出现明显滞后和幅值偏差,尤其在爬坡事件前后误差急剧放大。
原因在于 BP 网络本质是全局逼近,对局部突变样本敏感,容易陷入局部极小;而 RBF 网络是局部逼近,隐层基函数只对输入空间中靠近中心的区域响应,对突变段反而更稳。把两者组合起来,用 RBF 先捕捉局部非线性、再用 BP 修正残差,是短期风电功率预测里被反复验证过的一条工程路线。这套方案适合已有 SCADA 数据、想在不换硬件的前提下把 4 小时以内预测精度往上推一档的开发和运维人员。
2. RBF-BP 组合神经网络的原理与结构选型
2.1 RBF 与 BP 在风电功率预测中的分工
RBF 网络的结构是三层:输入层、隐层、输出层。隐层神经元使用高斯核函数,输出是若干局部响应的加权和。它的训练分两步,先用聚类方法确定核中心与宽度,再用最小二乘解输出权重,速度快,但外推能力弱。
BP 网络是典型的前馈神经网络,通过反向传播调整全部权重,逼近能力强,但训练慢、对初值敏感。在风电功率预测里,常见做法是让 RBF 负责主预测,BP 负责对 RBF 的预测残差建模。这样 BP 不需要从零学习整个映射,只学误差部分,收敛更快,也不容易过拟合。
注意:组合网络不是简单把两个网络输出取平均,那样提升有限。真正有效的是残差串联结构。
2.2 输入变量与数据预处理
短期风电功率预测的输入一般取历史功率序列加数值天气预报。工程上常用的输入维度如下:
| 变量类型 | 具体字段 | 说明 |
|---|---|---|
| 历史功率 | 前 1 到前 4 个时刻功率 | 反映惯性 |
| 风速 | 轮毂高度风速 | 主影响因素 |
| 风向 | 正弦、余弦分解 | 避免 0/360 跳变 |
| 温度 | 环境温度 | 影响空气密度 |
| 气压 | 海平面气压 | 辅助修正 |
数据预处理必须做归一化,否则风速量级会压制功率量级。常用 min-max 归一化:
import numpy as np def minmax_fit(x): # 按列计算最小值和最大值 xmin = x.min(axis=0) xmax = x.max(axis=0) return xmin, xmax def minmax_transform(x, xmin, xmax): # 避免除零,加一个极小值 return (x - xmin) / (xmax - xmin + 1e-8)逻辑说明:先在整个训练集上统计 min 和 max,再用同一组参数变换验证集和测试集,防止信息泄漏。参数说明:axis=0表示按特征列统计,1e-8是防止某列方差为零时出现除零。
2.3 隐层节点数与核宽度的确定
RBF 隐层节点数不是越多越好。节点过多会导致核函数重叠严重,输出权重矩阵病态。常见做法是从 10 到 40 逐个试,用验证集 RMSE 选最优。核宽度 σ 可以用 K-means 聚类后各簇内平均距离估计:
from scipy.cluster.vq import kmeans2 def estimate_sigma(x, k): # 对输入样本做 K-means 聚类 centroids, _ = kmeans2(x, k, minit='points') # 计算每个样本到最近中心的平均距离 d = np.linalg.norm(x[:, None, :] - centroids[None, :, :], axis=2) return d.min(axis=1).mean()逻辑说明:kmeans2得到 k 个核中心,d.min(axis=1)取每个样本到最近中心的距离,均值作为统一核宽度。参数说明:k即隐层节点数,minit='points'表示从数据点初始化,比随机初始化更稳定。
3. 用 MATLAB 搭出 RBF-BP 组合预测的最小可跑流程
3.1 数据划分与网络初始化
MATLAB 的神经网络工具箱对 RBF 和 BP 都有现成函数,但组合结构需要自己写。下面是一个最小可跑流程,假设数据已经整理成power_data.mat,包含输入矩阵X和输出向量Y。
% 加载数据,X 为 n×m,Y 为 n×1 load('power_data.mat'); % 按 7:2:1 划分训练、验证、测试 n = size(X, 1); idx = randperm(n); train_idx = idx(1:round(0.7*n)); val_idx = idx(round(0.7*n)+1:round(0.9*n)); test_idx = idx(round(0.9*n)+1:end); % 归一化,只对训练集统计参数 [Xn, xmin, xmax] = mapminmax(X', 0, 1); [Yn, ymin, ymax] = mapminmax(Y', 0, 1); Xn = Xn'; Yn = Yn';逻辑说明:mapminmax默认按行归一化,所以先转置。训练集统计出的xmin、xmax要保存,后面反归一化用。参数说明:0, 1是归一化区间,风电功率预测里也常用-1, 1,差别不大。
3.2 RBF 主预测网络的训练
% 设置 RBF 网络,goal 为训练目标误差,spread 为核宽度 goal = 1e-4; spread = 1.5; MN = 30; % 最大神经元数 DF = 1; % 两次显示之间增加的神经元数 net_rbf = newrb(Xn(train_idx,:)', Yn(train_idx)', goal, spread, MN, DF); % 在验证集上预测 Y_rbf_val = sim(net_rbf, Xn(val_idx,:)'); Y_rbf_train = sim(net_rbf, Xn(train_idx,:)');逻辑说明:newrb是 MATLAB 自带的 RBF 构建函数,按误差目标逐步增加隐层神经元。参数说明:goal越小拟合越紧,但容易过拟合;spread越大核越宽,平滑性越强,风电数据一般取 1.0 到 2.0。
3.3 BP 残差修正网络的训练
% 计算 RBF 在训练集上的残差 res_train = Yn(train_idx)' - Y_rbf_train; % 构建 BP 网络,隐层 10 个节点 net_bp = feedforwardnet(10); net_bp.trainParam.epochs = 1000; net_bp.trainParam.goal = 1e-5; net_bp.trainParam.lr = 0.01; % 用输入和 RBF 预测值一起作为 BP 输入 bp_input_train = [Xn(train_idx,:)'; Y_rbf_train]; net_bp = train(net_bp, bp_input_train, res_train); % 验证集残差预测 Y_rbf_val = sim(net_rbf, Xn(val_idx,:)'); bp_input_val = [Xn(val_idx,:)'; Y_rbf_val]; res_val = sim(net_bp, bp_input_val); % 组合输出 Y_comb_val = Y_rbf_val + res_val;逻辑说明:BP 的输入不只是原始特征,还拼上了 RBF 的预测值,这样 BP 能感知当前预测处于哪个区间。参数说明:feedforwardnet(10)表示一个 10 节点的前馈网络,lr是学习率,风电残差通常较小,学习率取 0.01 到 0.05 比较稳。
3.4 反归一化与误差评估
% 反归一化 Y_true = mapminmax('reverse', Yn(val_idx)', ymin, ymax); Y_pred = mapminmax('reverse', Y_comb_val, ymin, ymax); % 计算 RMSE 和 MAE rmse = sqrt(mean((Y_true - Y_pred).^2)); mae = mean(abs(Y_true - Y_pred)); fprintf('RMSE: %.4f, MAE: %.4f\n', rmse, mae);逻辑说明:反归一化必须用训练集的ymin、ymax,不能用验证集自己的统计量。参数说明:RMSE 对大误差敏感,适合看爬坡段;MAE 更稳健,适合看整体水平。
4. 组合网络的参数调优与常见踩坑
4.1 三个必调参数:spread、隐层节点数、BP 学习率
| 参数 | 常用范围 | 调大后果 | 调小后果 |
|---|---|---|---|
| RBF spread | 1.0–2.0 | 欠拟合,平滑过度 | 过拟合,局部抖动 |
| RBF 节点数 | 15–40 | 训练慢,矩阵病态 | 拟合不足 |
| BP 学习率 | 0.01–0.05 | 震荡不收敛 | 收敛慢 |
调参顺序建议:先固定 BP 学习率 0.01,调 RBF 的 spread 和节点数,让 RBF 单独预测的 RMSE 降到合理范围;再调 BP 学习率和隐层节点数,看残差是否还有明显结构。如果残差已经接近白噪声,说明 RBF 已经足够,BP 提升有限。
4.2 数据泄漏与归一化顺序
最常见的坑是先对整个数据集做归一化再划分训练测试。这样测试集的 min 和 max 信息会进入训练过程,验证指标虚高。正确顺序是:先划分,再只用训练集统计归一化参数,然后变换验证集和测试集。
另一个坑是时间序列随机打乱。风电功率是时序数据,随机划分会让相邻时刻的样本同时出现在训练和测试集,造成信息泄漏。常见做法是按时间顺序切分,或者用滑动窗口构造样本后再按时间切。
4.3 爬坡事件与误差集中段
风电功率的误差往往集中在爬坡段。如果发现整体 RMSE 不高但某些时段误差很大,可以检查这些时段是否对应风速突变。处理方式有两种:一是增加风速变化率作为输入特征;二是对爬坡样本加权,让损失函数更关注这些样本。
% 对残差大的样本加权,权重上限设为 3 w = ones(size(res_train)); threshold = prctile(abs(res_train), 80); w(abs(res_train) > threshold) = 3; net_bp.trainParam.weight = w;逻辑说明:prctile取残差绝对值的 80 分位数,超过阈值的样本权重设为 3。参数说明:权重不宜过大,否则少数样本主导训练,反而降低整体稳定性。
5. 从单点预测到多步预测的工程化技巧
短期风电功率预测真正上线时,调度要的是未来 4 小时、每 15 分钟一个点的序列,而不是单点。直接让网络输出多步,误差会累积。工程上更稳的做法是滚动预测:每次只预测下一个点,把预测值拼回输入,再预测下一点。
% 滚动预测未来 16 个点,即 4 小时 horizon = 16; Y_multi = zeros(horizon, 1); X_current = Xn(test_idx(1), :)'; for h = 1:horizon % RBF 预测当前步 y_rbf = sim(net_rbf, X_current'); % BP 修正 bp_in = [X_current; y_rbf]; y_res = sim(net_bp, bp_in); y_pred = y_rbf + y_res; Y_multi(h) = y_pred; % 更新输入窗口,去掉最老时刻,拼入新预测 X_current = [X_current(2:end); y_pred]; end % 反归一化 Y_multi_real = mapminmax('reverse', Y_multi', ymin, ymax);逻辑说明:每次循环用当前输入窗口预测一步,然后把预测值作为下一时刻的历史功率拼进窗口。参数说明:horizon是预测步数,X_current(2:end)表示滑动窗口前移。注意这里假设输入特征里只有历史功率需要滚动更新,风速等外生变量要用预报值替换。
滚动预测的误差会随步数增加而累积,常见缓解手段是每隔几步用最近实测值校正一次,或者对多步误差单独训练一个修正模型。验证时不要只看整体 RMSE,要分步统计,看第 1 步到第 16 步的误差增长曲线。如果第 8 步之后误差明显发散,说明滚动策略需要加校正,而不是继续调网络参数。
本文还有配套的精品资源,点击获取