考虑实时电价与PCA降维的GA-BP神经网络短期负荷预测 简介一篇围绕智能电网短期负荷预测的学术论文主要面向电力系统、自动化及机器学习方向的研究者。论文针对BP神经网络易陷入局部极小值、预测精度受限的问题提出融合主成分分析PCA与遗传算法的改进方案先利用PCA对高维负荷数据进行降维减少过拟合风险再使用遗传算法优化BP神经网络的权重与结构避免陷入局部最优同时纳入实时电价、节假日、温度等关键影响因素最终通过实验验证了比传统方法更高的预测精度。资源共1个PDF文件大小约302KB内容包含摘要、引言、模型原理、仿真实验与结论结构完整便于下载后直接阅读和参考。目前已有102人学习。读者可从中获得PCA降维、遗传算法全局寻优与BP神经网络建模相结合的方法论也可借鉴其考虑多因素负荷预测的建模流程对相关课题研究和工程实践都具有较高的参考价值。1. 从实时电价切入的短期负荷预测为什么经典模型突然不够用了智能电网和传统电网最大的区别之一就是电价不再固定。用户会看着实时电价调整用电行为空调、热水器、电动车充电桩这些负荷开始跟着价格波动。这样一来负荷曲线里就多了一个强相关的扰动项单纯靠历史负荷、温度、节假日这些传统特征做短期负荷预测误差会明显变大。这篇论文的核心思路是在传统BP神经网络的基础上把实时电价作为输入特征引入模型再用主成分分析消除特征间的相关性、降低维度最后用遗传算法解决BP网络容易陷入局部极小点的问题。对于做电力数据分析、负荷预测建模的从业者来说这篇论文的价值在于它给出了一个完整的建模链条特征怎么选、维度怎么降、网络怎么优化、误差怎么评估。全文的仿真在Matlab环境下完成训练数据来自澳大利亚悉尼某天的逐时负荷记录前一个月的历史数据作为训练集对比了有无PCA降维两种情况下模型的预测精度。2. BP神经网络的结构剖析为什么它天生带着两个缺陷2.1 BP网络的工作机制与结构设定BP神经网络是一种多层前馈网络信号从输入层进入经过隐含层逐层传递输出层给出预测结果。训练过程分为两个阶段前向传播计算输出值再根据输出值与真实值的误差反向传播逐层修正权值和阈值。这种机制使得BP网络能够逼近任意非线性函数也是它成为负荷预测领域应用最广泛的神经网络模型的原因。在短期负荷预测场景下BP网络的输入层节点数对应选取的特征数量输出层节点数对应预测目标的数量。论文中的模型输入变量一共15个输出是逐时负荷预测值相当于24个输出节点。隐含层层数和节点数没有固定公式一般通过实验确定常见做法是先根据经验公式估算一个初始值再逐步调整。这里需要明确一个容易混淆的点BP神经网络并不等同于深度学习。BP属于经典神经网络结构通常是三层或四层而深度学习强调的是更深层次的网络结构。在负荷预测这类中等规模数据集上BP网络加上合适的优化方法效果往往比盲目堆叠深层次网络更实用训练成本和部署成本也更低。2.2 局部极小点问题的产生机制BP网络的核心参数更新公式如下[ w_{ij}(t1) w_{ij}(t) \eta \delta_j x_i ]其中 ( w_{ij} ) 是神经元 ( i ) 到神经元 ( j ) 的连接权值( \eta ) 是学习率( \delta_j ) 是神经元 ( j ) 的误差项( x_i ) 是输入信号。BP网络采用梯度下降法更新权值误差函数是一个高维非线性曲面曲面上存在多个局部极小值点。当训练过程陷入某个局部极小点时梯度下降法无法跳出网络收敛到一个次优解。具体表现是训练误差降到一定程度后不再下降不管怎么增加迭代次数都一样。实际工程中这个问题会被数据中的噪声和特征间的相关性放大。比如在考虑实时电价后电价与负荷之间的关系并非线性如果输入特征间存在较强的相关性误差曲面的形态会更加复杂陷入局部极小的概率也随之增加。这也是许多工程师在负荷预测中试过BP网络后又转向其他方法的核心原因。2.3 神经网络结构参数设定要点在实际建模时输入变量通常包含连续变量和分类变量。预测日类型属于分类变量不能直接作为数值输入需要先进行编码转换。温度、电价、历史负荷属于连续变量但要先做数据清洗剔除异常点再进行归一化处理。神经网络对输入数据的尺度非常敏感未归一化的数据会导致权值更新不稳定训练过程发散或收敛极慢。归一化公式如下[ x(i) \frac{x(i) - x_{min}}{x_{max} - x_{min}} ]所有输入特征统一映射到 ([0,1]) 区间。这里有一个操作细节容易被忽略预测完成后需要把输出值反归一化回原始尺度才能得到实际的负荷预测值。3. 主成分分析在负荷预测中的应用从15维降到8维的信息压缩逻辑3.1 PCA降维的数学原理与实现步骤考虑实时电价后输入特征从原来的十几个增加到15个特征之间可能存在相关性。比如预测点前一时刻的电价与预测点前两时刻的电价大概率高度相关前一天同一预测点负荷与前一周同一预测点负荷也存在一定相关性。如果把这些相关性较强的特征直接送入网络一方面会引入冗余信息增加网络复杂度与训练时间另一方面特征间的相关性会影响网络的稳定性降低泛化能力。主成分分析的思路是通过线性变换将原始相关的变量重新组合成一组互不相关的综合变量。这些新变量按照方差大小依次排列其中方差最大的称为第一主成分其次是第二主成分以此类推。前几个主成分往往能解释原始数据的大部分变异信息因此可以舍弃后面的主成分用少量主成分代替多个原始变量。PCA降维的数学步骤如下首先对原始数据矩阵进行标准化处理消除量纲影响。标准化公式为[ z_{ij} \frac{x_{ij} - \bar{x}_j}{s_j} ]其中 ( \bar{x}_j ) 是第 ( j ) 个变量的均值( s_j ) 是标准差。标准化后各变量的均值为0方差为1。其次计算标准化数据的协方差矩阵 ( R )[ R \frac{1}{n-1} Z^T Z ]然后求解特征方程 ( |\lambda I - R| 0 )得到协方差矩阵的特征值 ( \lambda_1, \lambda_2, \ldots, \lambda_p )。特征值衡量了对应主成分的方差大小。接着计算各主成分的贡献率和累计贡献率。贡献率公式为[ \text{贡献率} \frac{\lambda_i}{\sum_{j1}^{p} \lambda_j} ]累计贡献率公式为[ \text{累计贡献率} \frac{\sum_{i1}^{k} \lambda_i}{\sum_{j1}^{p} \lambda_j} ]最后根据累计贡献率确定保留的主成分个数。论文中累计贡献率达到95.33%时前8个主成分被保留原始15维特征压缩到8维。3.2 Matlab中的PCA求解与主成分贡献率计算论文中的仿真环境是Matlab。Matlab中实现PCA有多种方式可以直接调用内置pca函数也可以根据上述数学公式手动实现。以论文中的15维输入数据为例Matlab手动实现的关键代码如下%% 数据标准化 data_mean mean(data); % 计算各变量均值 data_std std(data); % 计算各变量标准差 data_norm (data - data_mean) ./ data_std; % 标准化 %% 计算协方差矩阵 cov_matrix cov(data_norm); % 标准化数据的协方差矩阵 %% 求解特征值和特征向量 [V, D] eig(cov_matrix); % D对角线为特征值 eigenvalues diag(D); % 提取特征值 [eigenvalues, idx] sort(eigenvalues, descend); % 降序排序 V V(:, idx); % 对应调整特征向量顺序 %% 计算贡献率和累计贡献率 total_eig sum(eigenvalues); contribution eigenvalues ./ total_eig; % 各主成分贡献率 cum_contribution cumsum(contribution); % 累计贡献率 %% 根据累计贡献率选择主成分个数 for k 1:length(eigenvalues) if cum_contribution(k) 0.95 % 论文取95%阈值 num_pc k; break; end end %% 得到降维后的数据 pc_data data_norm * V(:, 1:num_pc);这段代码的关键点在于标准化必须在计算协方差矩阵之前完成否则量纲差异会主导主成分方向降维结果失去意义。排序后取前 ( k ) 个特征值对应的特征向量得到降维后的新矩阵 ( Z_{n \times k} )。Matlab内置的pca函数可以直接替代上述流程[coeff, score, latent, ~, explained] pca(data_norm); cum_contribution cumsum(explained); num_pc find(cum_contribution 95, 1); pc_data score(:, 1:num_pc);其中explained向量直接给出各主成分的贡献率百分比。两种方法结果一致但手动实现的过程更容易理解PCA的内部机制。建议在项目初期用手动实现验证数据分布特征正式建模时再切换到pca函数这样既能控制细节又能保证效率。3.3 论文中的贡献率分析结果从论文表1可以看出前8个主成分的累计贡献率达到95.33%。这意味着15个原始输入变量经过PCA变换后8个主成分已经解释了原始数据中95.33%的方差信息信息损失控制在5%以内。这种情况下输入维度从15降到8网络结构变简单训练时间缩短泛化能力提升。这里有一个工程判断标准需要说明。累计贡献率的阈值选择没有唯一标准常见设置在85%到95%之间。阈值设置过高保留的主成分数量多降维效果有限阈值设置过低信息损失过大预测精度下降。论文选择95%这个阈值属于数据质量较好时可采用的标准。如果数据本身噪声较大85%到90%的阈值也可以接受。关键在于观察特征值下降的拐点特征值从某个位置开始急剧变小且趋于平缓这个位置通常就是合理的主成分截断位置。下表给出一个典型的贡献率参考格式主成分序号特征值贡献率/%累计贡献率/%13.8236.0536.0522.1720.4756.5231.5414.5371.0540.868.1179.1650.646.0485.2060.514.8190.0170.353.3093.3180.222.0895.39前8个主成分的信息保留程度在95%以上时可以安全地舍弃后7个维度。4. 遗传算法优化BP神经网络的完整流程与Matlab实现4.1 遗传算法与BP网络结合的方式遗传算法优化BP神经网络的实质是遗传算法负责搜索最优的初始权值和阈值组合。传统BP网络的初始权值随机生成一旦初始位置选择不当训练过程很容易收敛到局部极小点。遗传算法通过选择、交叉、变异等操作在全局范围内搜索最优解找到一组适合作为BP网络初始权值和阈值的参数。具体结合方式如下第一确定BP网络的结构即输入层、隐含层、输出层各自的节点数。以论文模型为例PCA降维后输入节点数为8输出节点数为24隐含层节点数通过实验确定。第二将BP网络的连接权值和阈值按顺序拼接成一个长向量这个向量就对应遗传算法中的一个染色体个体。第三随机生成 ( N ) 个个体构成初始种群。论文中每个个体代表一组权值和阈值的完整集合。第四计算每个个体的适应度。适应度函数使用训练误差的倒数或均方误差函数。误差越小适应度越高个体被选择遗传给下一代的概率越大。第五通过选择、交叉、变异产生新一代个体重复迭代直到达到预设的迭代次数或适应度满足要求。第六将最优个体拆分为BP网络的初始权值和阈值再用BP算法进行局部精调直到误差满足条件。整体流程用一句话概括遗传算法负责全局搜索BP算法负责局部精调。这种分工方式既避免了BP网络陷入局部极小的缺陷也弥补了遗传算法在局部搜索方面精度不足的问题。4.2 关键参数设置与Matlab代码实现遗传算法的参数设置直接影响优化效果和收敛速度。在负荷预测这类中等规模问题上常用参数范围如下表所示参数名称常用范围论文场景建议值说明种群规模20 ~ 10050过小易早熟过大增耗时最大迭代次数50 ~ 500100视收敛情况调整交叉概率0.4 ~ 0.90.7控制全局搜索能力变异概率0.01 ~ 0.20.05防止陷入局部最优适应度函数MSE倒数或MSE均方误差误差越小适应度越高Matlab中用遗传算法工具箱对BP网络进行优化的核心代码如下%% 定义BP网络结构 net feedforwardnet([hidden_nodes]); % 隐含层节点数 net.layers{1}.transferFcn tansig; % 隐含层传递函数 net.layers{2}.transferFcn purelin; % 输出层传递函数 %% 获取权值和阈值总数 IW net.IW{1,1}; % 输入层到隐含层权值 IW_num numel(IW); % 权值元素个数 b1 net.b{1}; % 隐含层阈值 b1_num numel(b1); LW net.LW{2,1}; % 隐含层到输出层权值 LW_num numel(LW); b2 net.b{2}; % 输出层阈值 b2_num numel(b2); total_num IW_num b1_num LW_num b2_num; %% 定义适应度函数 fitness_func (x) ga_fitness(x, net, P_train, T_train, ... IW_num, b1_num, LW_num, b2_num); %% 设置遗传算法选项 options gaoptimset(PopulationSize, 50, ... Generations, 100, ... CrossoverFraction, 0.7, ... MutationFcn, {mutationuniform, 0.05}, ... Display, iter, ... PlotFcns, gaplotbestf); %% 调用遗传算法寻优 [x_opt, fval] ga(fitness_func, total_num, [], [], [], [], ... lb, ub, [], options);对应适应度函数的定义如下function MSE ga_fitness(x, net, P_train, T_train, ... IW_num, b1_num, LW_num, b2_num) % 将染色体x拆分为权值和阈值 net.IW{1,1} reshape(x(1:IW_num), size(net.IW{1,1})); net.b{1} reshape(x(IW_num1:IW_numb1_num), size(net.b{1})); net.LW{2,1} reshape(x(IW_numb1_num1:IW_numb1_numLW_num), size(net.LW{2,1})); net.b{2} reshape(x(IW_numb1_numLW_num1:end), size(net.b{2})); % 计算训练集预测误差 y_pred sim(net, P_train); MSE mean((y_pred - T_train).^2); end这里需要说明几个容易踩坑的细节。第一权值和阈值的拆分顺序必须与赋值顺序完全一致否则网络结构会错乱。第二遗传算法中的变量边界lb和ub需要根据输入输出数据的范围设定建议设为归一化后的数据范围再加一定余量。第三种群规模不是越大越好过大不仅训练耗时还可能出现个体多样性过剩导致收敛变慢的情况。4.3 优化后的BP网络训练遗传算法搜索到最优个体后将其拆分为BP网络的初始权值和阈值代入网络进行训练。%% 将最优个体赋给网络 net_opt net; net_opt.IW{1,1} reshape(x_opt(1:IW_num), size(net.IW{1,1})); net_opt.b{1} reshape(x_opt(IW_num1:IW_numb1_num), size(net.b{1})); net_opt.LW{2,1} reshape(x_opt(IW_numb1_num1:IW_numb1_numLW_num), size(net.LW{2,1})); net_opt.b{2} reshape(x_opt(IW_numb1_numLW_num1:end), size(net.b{2})); %% 设置训练参数 net_opt.trainFcn trainlm; % Levenberg-Marquardt算法 net_opt.trainParam.epochs 1000; % 最大训练次数 net_opt.trainParam.goal 1e-5; % 目标误差 net_opt.trainParam.lr 0.01; % 学习率 %% 训练网络 [net_trained, tr] train(net_opt, P_train, T_train);训练函数选择上Levenberg-Marquardt算法在中小规模数据集上收敛速度较快。隐含层传递函数使用tansig输出层使用purelin这是BP网络做函数逼近的标准组合。如果预测结果出现震荡或不收敛优先检查学习率的设置必要时调整为自适应学习率方式。5. 悉尼逐时负荷预测实例复盘从数据预处理到误差对比5.1 输入特征工程的完整清单论文模型共采用15个输入变量这些变量可以归为四类第一类是历史负荷值包括预测点前一时刻负荷、前两时刻负荷、前一天同一时刻负荷、前一天同一时刻前一小时负荷、前一天同一时刻后一小时负荷、前一周同一时刻负荷、前一周同一时刻前一小时负荷、前一周同一时刻后一小时负荷共8个变量。第二类是预测日类型用于区分工作日、周末和节假日共1个变量。这个变量是分类变量需要编码后输入。第三类是温度信息包括预测日平均温度共1个变量。第四类是电价信息包括预测点电价、预测点前一时刻电价、预测点前两时刻电价、前一天同一时刻电价、前一周同一时刻电价共5个变量。从变量构成可以看出历史负荷值占了8个电价占了5个这两类构成了模型的主要信息源。时间间隔上同时覆盖了短期记忆前一时刻、前两时刻和周期性记忆前一天、前一周这个特征工程思路值得借鉴。5.2 数据归一化与异常数据处理电力负荷数据在采集过程中可能出现异常值比如传感器故障、通信中断、统计口径变化等。归一化之前必须先做数据预处理否则异常值会拉大极值区间导致正常数据在归一化后被压缩到很窄的区间内影响网络学习。数据清洗的常用方法是基于统计学的异常检测。计算每个变量在一定时间窗口内的均值和标准差当某个样本的值偏离均值超过3倍标准差时判定为异常值用前后时刻的平均值修正。具体代码如下%% 基于3σ原则的异常值检测与修复 for i 1:size(data, 2) col data(:, i); col_mean mean(col); col_std std(col); outlier_idx abs(col - col_mean) 3 * col_std; for j find(outlier_idx) if j 1 || j length(col) continue; % 边界点直接跳过 end col(j) (col(j-1) col(j1)) / 2; % 用相邻值均值替换 end data(:, i) col; end %% 归一化处理 [data_norm, ps] mapminmax(data, 0, 1); % 归一化到[0,1] data_norm data_norm;mapminmax是Matlab中常用的数据归一化函数返回值ps保存了归一化参数。测试集和验证集需要使用与训练集相同的ps参数进行归一化不能单独计算各自的均值和标准差这属于数据泄漏问题会导致预测精度被高估。5.3 误差评估指标使用不当造成的误导论文使用两个误差指标评估模型性能。百分误差RE的公式为[ RE \frac{|A_t - F_t|}{A_t} \times 100% ]其中 ( A_t ) 为实际负荷值( F_t ) 为预测负荷值。平均绝对值百分误差MAPE的公式为[ MAPE \frac{1}{n} \sum_{t1}^{n} \frac{|A_t - F_t|}{A_t} \times 100% ]MAPE是负荷预测领域最常用的指标它对每个预测点的误差进行平均反映整体预测水平。论文实验结果中未加入PCA降维的数据MAPE为6.9%加入PCA降维后MAPE降至5.0%准确率提升了约1.9个百分点。需要指出的是MAPE存在一个明显的弱点当实际负荷值接近0时误差会被异常放大。负荷预测场景中夜间谷值负荷较低这一点需要特别关注。实际工程中建议同时计算MAE平均绝对误差和RMSE均方根误差作为辅助指标RMSE对大误差更敏感能够反映预测结果的稳定性。另一种常见做法是分时段评估。居民用电负荷在工作日和节假日的波动特征差异很大按日类型分组统计MAPE可以更准确地定位模型的薄弱环节。6. 训练时间对比与工程部署中的避坑清单6.1 降维带来的训练效率提升论文实验中PCA降维将输入维度从15降到8训练时间明显缩短。这个提升来自两个方面一方面是网络结构变小隐含层到输出层的权值数量大幅减少另一方面是特征间的冗余信息被消除网络收敛所需的迭代次数下降。在Matlab环境下一个值得注意的细节是GA优化阶段和BP训练阶段的时间开销需要分开看待。GA优化的耗时取决于种群规模和迭代次数与数据量关系不大BP训练耗时主要取决于数据量和网络规模。工程上可以采用一种加速策略先用一部分训练数据完成GA寻优和网络结构验证确定最优权值区间和隐含层节点数后再在全量数据上重新训练。这样做能把参数搜索阶段的资源消耗控制在可接受范围内。6.2 隐含层节点数的实验确定方法隐含层节点数的选择没有理论上的精确公式常用的经验公式有[ m \sqrt{n l} a ]其中 ( n ) 为输入节点数( l ) 为输出节点数( a ) 为1到10之间的调节常数。以论文模型为例PCA降维后 ( n8 )( l24 )代入公式得到隐含层节点数范围大致在7到16之间。实际操作中可以在该范围内逐一遍历不同节点数比较各模型的MAPE选取误差最小的节点数。遍历过程中要注意隐含层节点数过少会导致欠拟合过多则容易过拟合。一个简单有效的判断方法是观察训练集和验证集的误差变化两者同时较低且接近说明模型泛化能力较好验证集误差明显高于训练集则说明存在过拟合应减小网络规模或增加训练数据。6.3 实时电价特征有效性验证论文一个重要的实验细节是同时考虑了有无实时电价两种情况。根据表2的训练结果考虑实时电价后的模型MAPE更低这说明电价信息确实为负荷预测提供了增量价值。但电价特征的有效性不能一概而论不同地区、不同时段的电价机制差异很大。判断电价特征是否值得引入一个直接的方法是做相关性分析。计算电价序列与负荷序列之间的相关系数如果相关性显著保留电价特征如果相关性接近0说明该场景下电价对负荷几乎没有影响可以舍弃。另一个方法是做特征消融实验分别训练含电价和不含电价的模型对比MAPE来决定是否保留这个特征。澳洲悉尼是较早实行实时电价的市场之一论文选择该地区的数据具有代表性。国内目前大部分地区还是分时电价机制直接照搬国际论文中的输入变量清单不一定适用建议按当地市场规则重新筛选特征。本文还有配套的精品资源点击获取