拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

PSO-BP神经网络风电功率预测:原理、Python实现与调参指南

PSO-BP神经网络风电功率预测:原理、Python实现与调参指南 简介基于粒子群算法优化BP神经网络的风电功率预测MATLAB项目面向从事风电功率预测、神经网络改进及算法研究的工程师和学生。利用PSO算法对BP网络的权重和阈值进行全局寻优可改善传统反向传播算法易陷入局部极小、收敛慢的问题并结合实际风电场功率数据验证预测效果。整套资料共11个文件包括7个.m源码文件、2个.mat数据文件和2张结果示意图压缩包大小仅256KB代码模块划分清晰便于直接运行和二次开发。已有653人浏览学习内容完整紧凑适合快速掌握粒子群优化神经网络组合建模的流程与实现细节。除核心预测程序外还提供MSE、RMSE、MAE、MBE及R²等误差评估脚本以及拟合度分析和实测数据集能够定量比较PSO-BP与原始BP的预测精度直观展示功率预测曲线差异为风电功率短期预测算法研究提供了完整的工程参考。1. 风电功率预测为什么要找PSO-BP这条新路风电功率预测一直是场站调度和电力交易里的硬骨头风速一会儿大一会儿小功率曲线跟着“抽风”想用一个固定的BP神经网络直接拟合经常陷入局部极小训练半天损失不再下降换初始权值结果又变。粒子群算法这种仿生搜索方法恰好能在权值空间里先做全局搜索再交给BP神经网络去做局部精调就形成了常说的PSO-BP神经网络风电功率预测方案。它解决的问题不是“换一种网络”而是“让BP神经网络找到一套更靠谱的出发权值”。如果你手头有风电场SCADA数据想用Python从零搭一套能跑的功率预测模型或者你在对比BP和PSO-BP到底值不值得换这条路线会给你一个能落地的答案。2. PSO-BP的关键原理粒子群在BP神经网络的权值空间里找最优起点2.1 粒子群算法原理速度-位置更新怎么让一群粒子收敛到最优粒子群算法模拟鸟群觅食时的个体经验共享。每个粒子代表解空间里的一个候选点包含位置向量和速度向量移动方向由记忆中的个体最优pbest和整个群体的全局最优gbest共同决定。经典的速度更新公式是v_id^{k1} w * v_id^k c1 * r1 * (pbest_id - x_id^k) c2 * r2 * (gbest_d - x_id^k)x_id^{k1} x_id^k v_id^{k1}这里的w是惯性权重控制上一代速度的延续程度c1和c2是加速系数r1和r2是0到1之间的随机数。w越大搜索范围越广适合前期w越小越聚焦局部适合后期。常见做法是把w从0.9线性递减到0.4让粒子群先满天飞后期再收敛到最优区域。应用到风电功率预测这个场景粒子群算法的每个“粒子”并不是一个简单的风速或功率值而是BP神经网络的全部权值和阈值的排列。粒子群算法要找的是让预测误差最小的那组权值。它不关心网络结构图长什么样只关心这个位置参数让适应度函数算出来的MSE是多少。这也是PSO能嵌入BP的原因BP把误差反向传播看作一个优化问题而粒子群算法把同一个优化问题当成搜索问题来解。2.2 BP神经网络结构图拆解权值阈值与风电功率之间的非线性映射BP神经网络是典型的前向网络风电功率预测常用的结构图是输入层接收风速、风向正弦分量、风向余弦分量、温度、历史功率等特征中间一层或两层隐含层用sigmoid或tanh做非线性映射输出层给出下一时刻功率预测值。每个连接都有权值每个隐含节点和输出节点都有阈值偏置。以单隐层为例输出 W2 * f(W1 * x b1) b2其中W1是输入层到隐含层的权值矩阵b1是隐含层阈值W2是隐含层到输出层的权值矩阵b2是输出层阈值。BP神经网络的训练过程就是不断用梯度下降调整这四组参数让损失函数下降。但BP神经网络训练时最怕两件事一是初始权值选得不好梯度下降一开始就钻进某个局部坑里出不来二是风电数据噪声大误差曲面非常复杂学习率调得稍大就震荡调小了又跑不动。这就是为什么很多人在风电功率预测上用BP神经网络总感觉“效果还行但说不出哪里差”——差的往往是初始位置而不是模型本身。粒子群算法优化的正是初始权值位置而不是去替代BP网络结构。2.3 PSOBP的三种结合方式与选型理由我在实际项目里见过三种PSO与BP结合的方式标题里写的“PSO-BP神经网络”至少包含三种可能第一种粒子群算法只负责搜索BP网络的初始权值和阈值得到较优的起点后再用BP梯度下降继续微调。这是最常用的方式适合风电功率预测这种数据量大、噪声大的场景全局搜索和局部精调各干各的效果最好控制。第二种粒子群算法全程替代BP的反向传播粒子群通过反复计算适应度来更新权值整个训练过程中没有梯度。这种方式适合梯度计算困难或者网络结构很特殊的情形但计算量比BP大几倍风电场站几万条数据跑起来很慢我一般只用它做小样本验证。第三种用粒子群算法去搜索BP神经网络的超参数比如隐含层节点数、学习率、正则化系数然后仍由BP完成权值学习。这种“参数调优”型PSO-BP更适合做实验对比而不是生产部署因为粒子群每次评估都要完整训练一遍BP耗时太长。风电功率预测选哪种我推荐第一种。原因很简单风电数据量通常有几万到几十万条粒子群本来就是个计算密集型算法如果让它替代梯度下降每迭代一次都要对全部样本做前向计算代价太高。而只用它找初始权值粒子群迭代几十代后得到一组不错的初始点再让BP自己精调比纯BP收敛更快比纯PSO训练省时预测精度也更稳定。3. 数据准备把风电SCADA原始记录变成PSO-BP能吃的训练集3.1 特征构造风速、风向、历史功率怎么组装成训练样本风电功率预测的输入特征不是越多越好而是越贴近风机物理特性越好。从SCADA系统能拿到的常见原始字段有时间、平均风速、风向、有功功率好一点的数据还有温度、湿度、气压、机舱风速、桨距角等。直接把这些列按原样喂给神经网络是新手最容易踩的坑比如风向就绝不能用一个0到360的角度数字去做回归输入因为350度和10度在数值上差340度物理上却只差20度模型会被这个“假距离”带偏。我一般会把风向拆成两个特征import pandas as pd import numpy as np # 原始数据示例time, speed_avg, winddirection, power df pd.read_csv(wind_farm_scada.csv, parse_dates[time]) df df.sort_values(time).reset_index(dropTrue) # 风向是环形变量拆成正弦和余弦分量避免350°和10°被当成远距离 df[wind_dir_sin] np.sin(np.radians(df[winddirection])) df[wind_dir_cos] np.cos(np.radians(df[winddirection])) # 构造滞后特征用过去4个15分钟点的平均风速和功率预测下一时刻功率 # 风电预测通常会看15分钟到1小时的历史趋势这个窗口长度叫look_back look_back 4 feature_cols [speed_avg, power, wind_dir_sin, wind_dir_cos] for lag in range(1, look_back 1): for col in feature_cols: df[f{col}_lag_{lag}] df[col].shift(lag) # 去掉因为滞后构造产生的空行 df df.dropna().reset_index(dropTrue) # 目标列下一时刻有功功率 df[target] df[power]这段代码的核心逻辑是把风速、功率、风向正弦、风向余弦各自向后错一位、两位、三位、四位形成“过去15分钟到过去1小时的状态”再用下一时刻功率做标签。为什么要滞后而不直接把当前风速和当前功率做特征因为风电功率预测要解决的是“提前15分钟或提前1小时看未来”只给当前时刻风速模型学不到上升或下降的趋势。滞后窗口加入后模型能看到风速和功率的变化斜率这对爬坡段的预测帮助非常大。风向分量转换时要注意先算弧度再用sin和cos不要用原始角度直接进模型。look_back参数的选择根据预测时间尺度调整我通常做15分钟滚动预测用8到12个滞后点做1小时预测用4到8个滞后点太长的滞后期会把模型拖入平滑太短的又学不到趋势。3.2 归一化与时序划分为什么要先fit训练集再transform测试集BP神经网络对输入特征的尺度非常敏感。风速可以是12.5m/s功率可以是2400kW放在同一个矩阵里数值大的特征会主导初始误差计算训练过程容易被带偏。常见做法是用MinMaxScaler把每个特征压缩到0到1区间。这一步本身没什么争议真正的坑在怎么用scaler必须先用训练集fit再用同一个scaler去transform训练集和测试集绝不能先把整个数据集拼接在一起再fit缩放。from sklearn.preprocessing import MinMaxScaler feature_lags [c for c in df.columns if lag_ in c] X df[feature_lags].values y df[target].values # 按时间顺序切分前80%训练后20%测试风电样本不能随机打乱 train_size int(len(X) * 0.8) X_train, X_test X[:train_size], X[train_size:] y_train, y_test y[:train_size], y[train_size:] # 关键只用训练集fit避免测试集信息泄漏到scaler里 scaler_X MinMaxScaler() X_train_scaled scaler_X.fit_transform(X_train) X_test_scaled scaler_X.transform(X_test) scaler_y MinMaxScaler() y_train_scaled scaler_y.fit_transform(y_train.reshape(-1, 1)).ravel()这段代码里有两处必须说清楚。第一处时序预测只能按时间顺序切分不能用train_test_split随机切否则测试集里混着训练集前后时段的数据模型“提前看到未来”评估结果虚高。第二处scaler_y必须单独建立一个对象并且只用训练集的y去fit后面预测出来的归一化功率要靠它inverse_transform回来。很多PSO-BP预测代码跑出来曲线整体偏低最后查下来都是scaler模型用错了。3.3 评估指标RMSE、MAE、R2到底该看哪一个风电功率预测的评估不能只看一个指标因为不同指标反映的问题不同。RMSE对极端误差敏感模型在一个关键爬坡段犯错时RMSE会明显变大适合用来判断“有没有灾难性偏差”。MAE对平均误差更温和适合判断整体预测水平。R2公式在回归模型评估里很常用但它对风电这种本身方差极大的信号有“作弊”可能如果模型只预测均值R2可能会因为真实功率方差大而显得还可以所以必须搭配RMSE一起看。我实际调试时通常记录三个指标以额定功率做归一化归一化RMSE RMSE对测试集功率最大值的比例。做风电场预测项目时调度部门更关心的是“预测功率和实际功率的偏差是否超过考核阈值”所以RMSE是主指标MAE做参考。如果RMSE比MAE大出很多倍说明模型在某些时段的预测误差被拉爆了优先检查那些时段是不是处于风速骤变或弃风限电状态。4. 从零写PSO-BP风电功率预测的Python代码4.1 网络结构与粒子编码位置向量的每一段对应什么参数在写粒子群代码之前得先把BP网络内部参数变成粒子位置向量。假设输入层是6个特征隐含层是10个节点输出层是1个节点那么需要优化的参数总共有6乘10的输入到隐层权值、10个隐层阈值、10乘1的隐层到输出权值、1个输出层阈值合计81个浮点数。粒子群算法里一个粒子的位置就是这81个数组成的数组粒子群的维度就是81。顺序必须固定否则解码就错。我习惯按W1、b1、W2、b2排列也就是位置向量前60个元素是输入层到隐含层的权值接下来10个是隐含层阈值再接下来10个是隐含层到输出层的权值最后一个位置是输出阈值。import numpy as np n_input 6 # 输入特征数风速lag1-4、功率lag1-4实际可少于前面构造的特征数 n_hidden 10 n_output 1 # 粒子位置长度就是BP全部权值和阈值的个数 dim n_input * n_hidden n_hidden n_hidden * n_output n_output print(f粒子维度: {dim}) # 6*101010*11 81 def decode_position(position, n_input, n_hidden, n_output): 把一维位置向量还原成BP网络的权值矩阵和阈值向量 w1_size n_input * n_hidden b1_size n_hidden w2_size n_hidden * n_output b2_size n_output w1 position[:w1_size].reshape(n_input, n_hidden) b1 position[w1_size:w1_size b1_size] w2 position[w1_size b1_size:w1_size b1_size w2_size].reshape(n_hidden, n_output) b2 position[w1_size b1_size w2_size:w1_size b1_size w2_size b2_size] return w1, b1, w2, b2这里有个关键点粒子的边界范围要设计合理。BP网络的初始权值通常在一个较小范围比如-0.5到0.5之间。粒子群搜索范围如果设成-10到10很多粒子初始阶段落在很差的位置适应度极高纯粹浪费时间。我给粒子位置上下界的常用值是-1到1等粒子群搜索接近最优区域后再交给BP微调效果最好。4.2 粒子群主循环适应度、速度更新、边界处理粒子群的核心部分分成四步初始化粒子位置和速度计算每个粒子的适应度并更新pbest和gbest更新位置和速度检查边界。适应度函数是BP前向传播得到的MSE注意这里不需要反向传播粒子群完全靠“搜索评价”来逼近最优权值。def sigmoid(x): 数值稳定的sigmoid防止exp溢出 return np.where(x 0, 1.0 / (1.0 np.exp(-x)), np.exp(x) / (1.0 np.exp(x))) def fitness(position, X, y, n_input, n_hidden, n_output): 用当前粒子位置做BP前向传播返回MSE w1, b1, w2, b2 decode_position(position, n_input, n_hidden, n_output) hidden sigmoid(np.dot(X, w1) b1) output np.dot(hidden, w2) b2 return np.mean((output.ravel() - y.ravel()) ** 2)速度更新时惯性权重采用线性递减这是粒子群算法里最经典的“先探索后精调”策略。每一代的w值根据当前迭代数和最大迭代数计算w w_max - (w_max - w_min) * (t / max_iter)。加速系数c1和c2都设为2这是当年粒子群原文里推荐的常用值实测风电功率预测场景表现稳定。# 粒子群算法主循环 def pso_train(X_train, y_train, n_input, n_hidden, n_output, n_particles30, max_iter60, w_max0.9, w_min0.4, c12.0, c22.0): dim n_input * n_hidden n_hidden n_hidden * n_output n_output bound 1.0 # 位置边界 # 初始化粒子位置和速度 positions np.random.uniform(-bound, bound, (n_particles, dim)) velocities np.random.uniform(-0.2, 0.2, (n_particles, dim)) # 记录个体最优和全局最优 pbest_positions positions.copy() pbest_scores np.array([fitness(p, X_train, y_train, n_input, n_hidden, n_output) for p in positions]) gbest_index np.argmin(pbest_scores) gbest_position pbest_positions[gbest_index].copy() gbest_score pbest_scores[gbest_index] for t in range(max_iter): w w_max - (w_max - w_min) * (t / max_iter) for i in range(n_particles): r1, r2 np.random.rand(), np.random.rand() velocities[i] (w * velocities[i] c1 * r1 * (pbest_positions[i] - positions[i]) c2 * r2 * (gbest_position - positions[i])) # 限制最大速度防止粒子飞得太远 velocities[i] np.clip(velocities[i], -0.5, 0.5) positions[i] positions[i] velocities[i] # 边界反射比直接截断更容易保持搜索多样性 positions[i] np.where(positions[i] bound, 2 * bound - positions[i], positions[i]) positions[i] np.where(positions[i] -bound, -2 * bound - positions[i], positions[i]) score fitness(positions[i], X_train, y_train, n_input, n_hidden, n_output) if score pbest_scores[i]: pbest_scores[i] score pbest_positions[i] positions[i].copy() if score gbest_score: gbest_score score gbest_position positions[i].copy() return gbest_position, gbest_score这段代码里有两个细节我提醒你注意。第一处粒子速度限制值max_velocity设为0.5这个值约是位置边界bound的一半太小会收敛慢太大会让粒子在边界之间反复横跳。第二处边界反射处理用np.where实现了越界后的镜像反弹。如果只用简单的截断粒子会大量堆在边界上影响后期收敛。适应度函数里的X和y必须事先用训练集缩放好的数据。粒子群迭代过程中每个粒子每代都要跑一次前向传播30个粒子60代就是1800次前向计算样本量几万条时这个耗时大概在几十秒到几分钟完全可以接受。4.3 训练与预测流程拿到gbest之后还要不要微调粒子群搜索结束后gbest的位置就是一组比随机初始化好得多的BP初始权值。但要不要继续微调如果要充分体现PSO-BP的价值我建议做。粒子群算法解决的是“全局搜索”精度达不到梯度下降那种细腻程度。用gbest位置作为起点继续用BP反向传播优化几十轮可以得到更低的MSE。from scipy.optimize import minimize # 先跑粒子群得到gbset位置 best_position, best_score pso_train( X_train_scaled, y_train_scaled, n_input, n_hidden, n_output, n_particles30, max_iter60 ) # 再以gbest为起点用L-BFGS做局部精调相当于BP反向传播的替代 local_opt_start best_position.copy() res minimize( funlambda p: fitness(p, X_train_scaled, y_train_scaled, n_input, n_hidden, n_output), x0local_opt_start, methodL-BFGS-B ) final_position res.x # 用最终权值做预测 w1_final, b1_final, w2_final, b2_final decode_position( final_position, n_input, n_hidden, n_output ) def predict(X): hidden sigmoid(np.dot(X, w1_final) b1_final) return np.dot(hidden, w2_final) b2_final # 反归一化回真实功率 y_pred_scaled predict(X_test_scaled) y_pred scaler_y.inverse_transform(y_pred_scaled.reshape(-1, 1)).ravel() y_test_real scaler_y.inverse_transform(y_test_scaled.reshape(-1, 1)).ravel()这里用scipy的L-BFGS-B做微调它不需要算梯度表达式只要给出适应度函数内部会用差分近似梯度。对81维参数这种规模速度很快。需要提醒的是L-BFGS-B是连续优化算法必须传入一维初始向量不能传给粒子的二维矩阵所以decode_position仍然承担着坐标转换的作用。如果不想引入scipy也可以用sklearn的MLPRegressor作为BP微调部分但那样前面自己写的网络结构就没用了不推荐。PSO-BP的完整流程是数据缩放、粒子群全局搜索初始权值、局部优化微调最后反归一化得到预测功率。每一步的代码都不复杂组合起来就是一套可复用的风电功率预测方案。5. PSO-BP风电功率预测的6个常见坑与排查方法5.1 预测曲线“拖尾”或整体偏低先查数据归一化和反归一化现象模型训练时MSE很低但预测出来的功率和实际功率画在一起时预测曲线明显比实际曲线平滑而且在高峰时段普遍偏低。原因大概率是预测值还在归一化空间里或者用了错误scaler反归一化。比如有些人fit_transform整体数据集后又用原来的总scaler去transform测试集等于训练时模型已经见过测试集的数值范围看起来训练表现不错但部署时新数据一进来分布一变化预测会变差。解决严格按第3节的流程scaler_X和scaler_y都只用训练集fit测试集只用transform预测结束后用scaler_y.inverse_transform还原。另一点是输出层如果使用了sigmoid激活输出范围被限制在0到1之间反归一化后也会出现“压顶”现象功率预测模型的输出层通常不用激活函数让模型自己回归。5.2 适应度卡住不动、粒子抱团是早熟而不是收敛现象跑粒子群时前20代适应度下降很快之后突然完全停滞把所有粒子打印出来发现位置几乎一样速度也趋近于0。原因这是粒子群算法的经典“早熟收敛”早熟表示粒子群陷入了某个局部最优失去了多样性而不是真的收敛到了全局最优。风电数据的误差曲面很复杂gbest一旦被某个噪声样本带偏周围粒子都会被吸过去。解决把粒子数从20增加到40到50让初始覆盖范围更大惯性权重从固定值改成线性递减前期保持探索能力另外可以在迭代过程中加入“重置机制”如果连续10代gbest没有下降就把最差的一半粒子重新随机初始化到搜索空间打散抱团状态。5.3 同一份代码两次跑偏差很大随机种子和初始化是关键现象不放任何随机种子连续跑两次PSO-BP模型测试集RMSE相差10%以上甚至同一个时刻的预测趋势都不一样。原因粒子群初始位置、速度、r1和r2都是随机数BP初始权值也被随机决定模型再现性差。风电功率预测要面向调度考核结果不稳定会让人怀疑方法的可信度。解决在代码最前面写上np.random.seed和random.seed固定随机源更工程化的做法是设计多组随机种子分别训练后取预测结果的均值或选择验证集表现最优的那一次作为最终模型。报告中要说明固定了哪个随机种子以及不同种子下的指标波动范围波动太大说明模型对初始值过于敏感需要继续加大粒子群搜索代数。5.4 把PSO塞给sklearn的MLPRegressor反而跑不动现象有人想用现成的sklearn MLPRegressor做BP部分然后用粒子群去改它的coefs_属性结果训练效率极低或者MLP内部的adam优化很快把PSO搜出来的初始权值覆盖掉PSO白跑了。原因MLPRegressor有自己的训练算法它在fit时会重新初始化或沿用现有属性继续反向传播内部还有早停、正则化等机制和PSO的搜索逻辑并不兼容。解决要么像我第4章那样自己用numpy写BP前向和适应度把调权过程完全掌握要么改变思路用PSO去优化MLPRegressor的超参数比如hidden_layer_sizes、alpha、learning_rate_init把每次fit出的验证集RMSE作为适应度。这种方式做对比实验可以生产环境不要指望它和真正的手写PSO-BP效果一致。5.5 弃风限电和检修样本让模型“选择性失灵”现象训练集里包含大量中午时段的低风速高功率样本测试时模型遇到大风却预测出很小功率或者在凌晨检修时段实际功率被强制降到接近0预测却按照风速估算出很高的功率。原因这些样本根本不是正常的物理波动而是调度指令或设备限电导致的人为操作模型被迫学习“风速大但功率低”和“风速小但功率高”的异常映射把误差曲面搞得一团糟。解决在特征工程阶段把弃风限电和检修样本过滤掉常见过滤条件包括风机处于停机状态、风速大于切入风速但功率连续多个点是0、功率与风速关系曲线偏离风机标准功率曲线太远。如果不想过滤太多样本可以增加一个“调度状态”特征作为输入让模型自己区分正常和限电时段。5.6 隐含层节点数拍脑袋选训练误差低测试误差爆表现象隐含层节点从10改成50训练集MSE一路下降测试集RMSE却上升预测曲线出现很多毛刺。原因隐含层节点越多BP网络对训练集的拟合能力越强风电数据本身噪声大模型把噪声也当成规律学了。这是典型过拟合。解决先用经验公式划定范围比如n_hidden取输入特征数的1.5到2倍再加2到3个也就是6个输入时隐含层在12到15之间再在这个范围内逐个测试用验证集而不是训练集选择最优节点数。粒子群搜索初始权值不是万能的它不能阻止隐含层节点过多带来的过拟合结构问题还是要靠验证集卡住。6. 用结果验证和参数调优确认PSO-BP值不值得投入6.1 先做对照BP、PSO-BP在测试集上的表现怎么读判断PSO-BP值不值得用不能只看训练集要看测试集上的RMSE和MAE。我通常的做法是同一套数据、同一随机种子分别跑普通BP和PSO-BP各自调参到相对不错的水平再对比测试集表现。从我做过的风电数据项目经验看PSO-BP相比裸BP一般能把测试集RMSE压低10%到20%在风速骤变的爬坡时段改善更明显但也不能期待它把预测做到完美。如果实验里PSO-BP几乎没有提升优先检查是不是普通BP已经陷入了比较好的局部最优或者粒子群迭代次数太少还没找到比随机初始化更好的区域。6.2 三个最影响预测精度的参数惯性权重、粒子数、隐层节点惯性权重直接决定粒子群的探索与开发平衡w_max取0.9、w_min取0.4的线性递减组合在风电数据上表现稳。粒子数30左右是性价比平衡点少于20容易早熟大于50收敛速度慢但结果略稳。隐含层节点数按6个输入特征来看10到15之间合适我会在验证集上做一轮节点数扫描。下表是我常用的参数调整起点参数常用范围调参倾向惯性权重w0.9到0.4线性递减前期大后期小不要固定加速系数c1、c21.5到2.5固定2即可先不调粒子数20到5030起步早熟再加最大迭代次数50到100先跑到50看适应度曲线隐含层节点数输入特征数的1.5到2倍用验证集扫描6.3 我的调参习惯与验证清单这套PSO-BP方案我已经在不同风电项目上反复用过很多次。我现在的习惯是先把数据预处理和反归一化代码写牢再固定随机种子用默认参数跑一轮看适应度曲线如果适应度平稳下降就调一次隐层节点数如果曲线中途卡死就加大粒子数或调整惯性权重。我会保存一份包含最终参数、随机种子、RMSE和MAE的记录方便调度考核出问题时回查。粒子群算法不是黑匣子把粒子的平均速度、群体位置标准差打印出来能帮你判断算法是在正常收敛还是早熟。最后提醒一句不要迷信PSO-BP是万能解药它适合短期15分钟到4小时的功率预测做中长期日功率预测物理模型和统计模型结合往往更稳定。风电功率预测本质上是个工程问题先把数据洗干净再谈算法深度。这一套PSO-BP踩坑记录希望能帮到你。本文还有配套的精品资源点击获取
返回列表