ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RBF-BP组合神经网络在短期风电功率预测中的原理与MATLAB实现

RBF-BP组合神经网络在短期风电功率预测中的原理与MATLAB实现 简介这份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(axis0) xmax x.max(axis0) return xmin, xmax def minmax_transform(x, xmin, xmax): # 避免除零加一个极小值 return (x - xmin) / (xmax - xmin 1e-8)逻辑说明先在整个训练集上统计 min 和 max再用同一组参数变换验证集和测试集防止信息泄漏。参数说明axis0表示按特征列统计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, minitpoints) # 计算每个样本到最近中心的平均距离 d np.linalg.norm(x[:, None, :] - centroids[None, :, :], axis2) return d.min(axis1).mean()逻辑说明kmeans2得到 k 个核中心d.min(axis1)取每个样本到最近中心的距离均值作为统一核宽度。参数说明k即隐层节点数minitpoints表示从数据点初始化比随机初始化更稳定。3. 用 MATLAB 搭出 RBF-BP 组合预测的最小可跑流程3.1 数据划分与网络初始化MATLAB 的神经网络工具箱对 RBF 和 BP 都有现成函数但组合结构需要自己写。下面是一个最小可跑流程假设数据已经整理成power_data.mat包含输入矩阵X和输出向量Y。% 加载数据X 为 n×mY 为 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 spread1.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 步之后误差明显发散说明滚动策略需要加校正而不是继续调网络参数。本文还有配套的精品资源点击获取
返回列表