ARTICLE DETAIL

资讯详情

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

基于BP神经网络的小电流接地系统单相接地故障选线与定位

基于BP神经网络的小电流接地系统单相接地故障选线与定位 简介本资源面向电力系统研究人员、电网保护与控制工程师以及关注小电流接地系统故障检测的技术人员聚焦单相接地故障的选线与定位难题。内容结合稳态零序电流基波、五次谐波特征与暂态固有模态能量特征通过BP神经网络融合多判据并借助MATLAB仿真与内蒙古变电站实际数据验证方法有效性同时给出完整Python代码涵盖数据准备与预处理、模型构建、训练评估及预测示例。资源包共1个PDF文件大小约743KB便于集中阅读与复现实验。目前已有78人学习。读者可从中获得故障特征分析思路、样本集构建流程、BP网络自定义损失设计及选线与定位联合预测的完整实现适合希望深入理解检测原理、开发高效算法或提升电网自动化水平的从业者参考。1. 小电流接地系统单相接地故障选线为什么BP神经网络能派上用场中性点不接地或经消弧线圈接地的中压配电网发生单相接地时故障电流只有几安到几十安线电压依然对称设备还能继续跑一两个小时。规程允许带故障运行但这也意味着——选线这件事本质上是在微弱、强噪声、工况多变的信号里做模式识别。传统群体比幅比相、五次谐波、首半波、有功分量法在金属性接地时表现尚可一旦遇到高阻接地、弧光间歇、CT饱和、消弧线圈过补偿误判和漏判就集中爆发。我做过几个变电站的选线改造最深的体会是没有哪一种单一判据能通吃所有工况。零序电流幅值在经消弧线圈接地时被严重削弱五次谐波在非线性负荷重的馈线上信噪比很差首半波对采样同步要求苛刻。既然人工整定阈值这么难那就把多条馈线的零序电流、零序电压、谐波特征一起喂给一个能自己学非线性边界的模型——BP神经网络就是最朴素也最容易落地的那一个。它不要求你写出解析判据只要求你把特征工程做对、样本标对、网络别训飞。这篇笔记面向两类人一是电力专业做故障选线课题、需要一套能跑通代码的研究生和现场工程师二是想把神经网络真正用到工业信号分类上、但被调包跑通和现场可用之间那道鸿沟卡住的人。我会从特征怎么提、网络怎么搭、MATLAB里怎么训、定位怎么做一路讲到我自己踩过的坑。代码用MATLAB写因为现场和高校的仿真数据基本都在MATLAB生态里Simulink搭模型、.mat存数据、工具箱直接调闭环最短。2. 从零序电流到特征向量选线问题的数据底座怎么搭2.1 小电流接地故障的电气量到底长什么样先把物理图像说清楚否则后面特征全是瞎凑。单相接地后故障相电压降到接近零非故障相升到线电压零序电压3U0在全网出现幅值随接地电阻增大而减小。零序电流的分布取决于中性点接地方式中性点不接地时非故障线路的零序电流是自身对地电容电流方向从母线流向线路故障线路的零序电流是所有非故障线路电容电流之和方向从线路流向母线。这就是经典的幅值最大、方向相反判据的由来。但经消弧线圈接地后电感电流补偿了电容电流故障线路的零序基波幅值可能反而比非故障线路小方向判据也随补偿度变化。这时候基波幅值基本废了得靠谐波和暂态。五次谐波不受消弧线圈影响消弧线圈对五次谐波阻抗大暂态首半波的幅值和极性在故障瞬间最明显。所以特征设计要覆盖三个维度稳态基波、稳态谐波、暂态分量。我一般会从每条馈线的零序电流里提取这些量基波幅值、五次谐波幅值、三次谐波幅值、有功分量、首半波幅值、首半波极性、小波能量熵。零序电压作为全网参考量单独取。这样一条馈线一个时刻就是一个多维特征向量选线就变成这条馈线的特征向量属于故障线还是非故障线的二分类问题。2.2 特征提取的MATLAB实现下面这段是我常用的特征提取骨架输入是每条馈线的零序电流序列和对应的零序电压序列采样率按现场常见的4kHz每周期80点设计。用FFT取稳态谐波用db4小波取暂态能量。function feat extract_feature(i0, u0, fs, f0) % i0: 单条馈线零序电流序列(列向量) % u0: 母线零序电压序列(列向量) % fs: 采样率(Hz) f0: 工频(Hz) % feat: 1x7 特征向量 N length(i0); n_cycle round(fs / f0); % 每周期采样点数 %% 1. 基波幅值取故障后第2个周波避开暂态 seg i0(n_cycle1 : 2*n_cycle); I1 2*abs(fft(seg)) / length(seg); feat(1) I1(2); % 基波(50Hz)幅值 %% 2. 五次谐波幅值250Hz对应第6根谱线 feat(2) I1(6); %% 3. 三次谐波幅值 feat(3) I1(4); %% 4. 有功分量零序电流与零序电压的基波相位差余弦 U1 2*abs(fft(u0(n_cycle1:2*n_cycle))) / n_cycle; ph_i angle(fft(seg)); ph_u angle(fft(u0(n_cycle1:2*n_cycle))); feat(4) I1(2) * U1(2) * cos(ph_i(2) - ph_u(2)); %% 5. 首半波幅值故障后前1/4周期内的极值 half round(n_cycle/4); feat(5) max(abs(i0(1:half))); %% 6. 首半波极性与零序电压首半波极性比较 feat(6) sign(i0(1:half) * u0(1:half)); %% 7. 小波能量熵db4分解3层取细节系数能量熵 [c, l] wavedec(i0, 3, db4); d1 detcoef(c, l, 1); E sum(d1.^2); p d1.^2 / (E eps); feat(7) -sum(p .* log(p eps)); end逻辑说明前三个特征走FFT注意取的是故障后第二个周波第一个周波含暂态直接做FFT会把暂态频谱混进稳态这是新手最常翻的车。有功分量用基波相位差算物理意义是零序电流里真正消耗能量的部分在消弧线圈过补偿时比幅值判据稳。首半波极性用点乘取符号故障线和非故障线符号相反是个很强的判别量。小波能量熵刻画暂态复杂度弧光接地时熵值明显偏高。参数说明fs必须和录波装置实际采样率一致我见过有人拿4kHz的算法去套10kHz数据谐波谱线全错位。f0国内取50别写60。小波基选db4是因为它在电力暂态分析里用得最多、支撑长度适中换成sym8或db6结果会有差异但别频繁换换一次就得重新训网络。n_cycle用round而不是floor防止采样率不是工频整数倍时索引错位。2.3 样本集怎么标、怎么划分特征提完样本标签是第二个大坑。每条馈线每个故障样本都要标1故障线0非故障线一个含6条馈线的系统一次单相接地就产生6个样本其中只有1个正样本。这种正负样本极度不平衡的数据直接训网络会得到一个全判非故障的废物模型准确率看着有83%实际一个故障都选不出来。我的做法是按故障样本而非馈线样本划分训练集和测试集保证同一个故障的所有馈线样本要么全在训练集、要么全在测试集否则同一次故障的特征泄漏到测试集指标虚高得离谱。正负样本用SMOTE或者简单地对正样本过采样MATLAB里可以用smote函数需要Statistics and Machine Learning Toolbox或者手动复制正样本加轻微高斯扰动。样本量上仿真数据我一般跑500到1000次故障覆盖不同故障线路、不同故障位置首端/中端/末端、不同接地电阻0.1Ω到5kΩ、不同故障初相角0°到90°、不同补偿度。现场录波数据有多少用多少通常几十条就够微调。仿真和现场数据分布差异大这是后面避坑章节要重点讲的。3. BP网络结构设计与MATLAB训练把选线准确率从80%拉到95%3.1 为什么选BP而不是SVM或随机森林先说选型理由免得有人觉得是拿锤子找钉子。SVM在小样本上确实强但它的核函数选择和参数寻优C、g对新手不友好而且多分类扩展麻烦。随机森林抗过拟合、能出特征重要性但输出的是硬分类做定位回归时不如神经网络顺滑。BP神经网络的优势在于结构简单可解释、MATLAB工具箱开箱即用、能同时做分类和回归选线是分类定位是回归、方便和后面的多算法融合对接。更重要的是选线问题的特征维度不高我上面提了7维实际工程里10到20维足够样本量中等几百到几千这种规模下BP网络不容易过拟合训练也快。深度学习的那些花哨结构在这里是杀鸡用牛刀还容易因为样本不够训崩。3.2 网络结构输入层、隐层、输出层怎么定输入层节点数等于特征维度这个没得商量。输出层做选线二分类用1个节点加logisticsigmoid激活输出大于0.5判故障线做多分类比如同时判断故障类型用softmax。隐层是玄学重灾区我的血泪经验是单隐层够用节点数取输入维度的1.5到2.5倍再用交叉验证微调。下面是我常用的网络搭建和训练代码用MATLAB的patternnet专为模式分类设计而不是裸feedforwardnet因为patternnet默认用交叉熵损失、输出层是softmax、还会自动做数据归一化省事且稳。function net train_bp_line_selection(X, Y, hidden_ratio) % X: 特征矩阵 (n_samples x n_features) % Y: 标签矩阵 (n_samples x 1)1故障线 0非故障线 % hidden_ratio: 隐层节点系数默认2.0 if nargin 3, hidden_ratio 2.0; end n_feat size(X, 2); n_hidden round(n_feat * hidden_ratio); % patternnet: 分类专用输出层softmax损失交叉熵 net patternnet(n_hidden); % 训练参数 net.trainFcn trainscg; % 量化共轭梯度中小样本首选 net.trainParam.epochs 1000; net.trainParam.goal 1e-4; net.trainParam.lr 0.01; net.trainParam.max_fail 20; % 验证集连续20次不降就停 net.performFcn crossentropy; % 数据划分70%训练 15%验证 15%测试 net.divideParam.trainRatio 0.7; net.divideParam.valRatio 0.15; net.divideParam.testRatio 0.15; % 训练 net train(net, X, Y); % 在测试集上评估 Y_pred net(X); [~, cm] confusion(Y, Y_pred); fprintf(混淆矩阵:\n); disp(cm); end逻辑说明patternnet(n_hidden)自动生成一个输入-隐层-输出三层网络隐层激活默认tansig输出层softmax。trainscg是量化共轭梯度比trainlm省内存、比traingd快中小样本分类任务里我最常用。max_fail20是早停防止过拟合这个值别设太小比如5否则网络还没学够就停了。参数说明hidden_ratio从1.5试到2.5用验证集准确率挑。epochs1000配合早停实际往往几百轮就停。lr0.01对trainscg其实影响不大它自己调步长但设了没坏处。divideParam的比例别乱改测试集留15%是为了最后评估如果样本本来就少少于200改成80/10/10。3.3 训练完怎么判断模型是不是真的能用看三个东西混淆矩阵、ROC曲线、以及分工况的准确率。混淆矩阵看漏判故障线被判成非故障和误判非故障被判成故障选线里漏判比误判更致命因为漏判意味着故障线路没被切除。ROC曲线看AUCAUC低于0.9基本别拿去现场。分工况准确率是关键——把测试集按接地电阻分档低阻100Ω、中阻100Ω-1kΩ、高阻1kΩ分别算准确率如果高阻档掉到70%以下说明特征对高阻不敏感得回去补特征。我一般还会画特征重要性用net.IW{1}的权重绝对值排序看看哪个特征贡献大。如果发现五次谐波权重极低可能是样本里谐波特征不明显得检查数据生成时有没有加非线性负荷。4. 故障定位从哪条线到线上哪个点4.1 定位问题的本质和选线不一样选线是分类定位是回归——要输出故障点到母线距离的连续值。定位的难度比选线高一个量级因为行波法需要高采样率MHz级阻抗法受过渡电阻和线路参数影响大。用小电流接地系统的稳态量做定位精度通常只能到几百米适合做区段定位而不是精确测距。我的思路是先用选线网络锁定故障线路再在这条线上用BP网络做回归定位。输入特征换成故障线路的双端零序电流如果有双端同步采样或者单端零序电流的多个频段能量输出是归一化距离0到1乘以线路长度就是公里数。4.2 定位网络的MATLAB实现function net train_bp_location(X, D, hidden_ratio) % X: 定位特征矩阵 (n_samples x n_features) % D: 归一化距离标签 (n_samples x 1)范围[0,1] % hidden_ratio: 隐层系数 if nargin 3, hidden_ratio 2.0; end n_hidden round(size(X, 2) * hidden_ratio); % 回归用fitnet输出层线性 net fitnet(n_hidden); net.trainFcn trainlm; % 回归任务用LM收敛快 net.trainParam.epochs 2000; net.trainParam.goal 1e-5; net.trainParam.max_fail 30; net.performFcn mse; net.divideParam.trainRatio 0.7; net.divideParam.valRatio 0.15; net.divideParam.testRatio 0.15; net train(net, X, D); % 评估平均绝对误差(换算成米) D_pred net(X); mae mean(abs(D_pred - D)); fprintf(归一化MAE: %.4f\n, mae); end逻辑说明回归任务用fitnet输出层是线性激活损失用MSE。trainlmLevenberg-Marquardt在回归任务上收敛最快但内存占用大样本超过几千条时换成trainscg。评估用MAE而不是MSE因为MAE直接对应平均定位误差多少米现场听得懂。参数说明goal1e-5对归一化距离来说已经够小再小容易过拟合。max_fail30比分类任务放宽因为回归的验证误差波动更大。定位特征我一般用故障线路零序电流在100Hz、150Hz、250Hz、350Hz四个频段的能量占比加上首半波到达时刻如果有双端同步。4.3 定位精度的现实预期别指望BP网络把定位做到行波法那种几十米精度。我实测下来单端稳态量特征做区段定位误差在200到500米之间线路总长10公里的话相对误差2%到5%。这个精度对故障巡视够用——能把范围缩到一两个杆塔区间剩下的靠人工巡线。如果非要更高精度得上双端行波那是另一套硬件和算法不在BP网络的射程内。5. 避坑与排查那些让选线模型现场翻车的细节5.1 现象训练集准确率99%现场一测全错原因仿真数据和现场数据分布不一致。仿真里CT是理想变比、无饱和、无噪声现场CT在故障暂态时会饱和零序电流波形畸变特征全变。更隐蔽的是仿真时零序电压全网一致现场因为PT安装位置不同各条馈线看到的零序电压有相位差。解决训练时在特征里加噪声信噪比20到40dB随机模拟CT饱和用分段线性模型或者干脆拿现场录波数据做迁移学习——冻结前几层只微调输出层。我一般会留20%的现场数据做最终验证仿真数据只用来预训练。5.2 现象网络输出全在0.5附近选不出线原因特征没归一化或者归一化参数在训练集和测试集上不一致。零序电流幅值可能从0.1A到50A有功分量量纲又不一样不归一化的话大数值特征会主导梯度。另一个原因是正负样本不平衡网络学会了全输出0.5这种偷懒策略。解决用mapminmax或zscore统一归一化且归一化参数必须从训练集算出来、应用到测试集不能各自归一化。正负样本用SMOTE过采样或者给损失函数加类别权重patternnet里可以用net.performParam调整。5.3 现象换一个变电站模型准确率暴跌原因过拟合到特定变电站的拓扑和参数。不同变电站馈线数量、线路类型电缆/架空、消弧线圈补偿度都不同特征分布差异大。一个在6馈线架空线系统上训的模型拿到20馈线电缆系统上直接废。解决训练集要覆盖多种拓扑馈线数从4到20、电缆架空混合、补偿度从欠补偿到过补偿都放进去。如果做不到就每个变电站单独训一个模型用迁移学习共享底层特征。别指望一个模型打天下这是我在三个变电站之间来回折腾后认的命。5.4 现象训练时验证集误差先降后升测试集准确率远低于验证集原因典型的过拟合或者数据划分时同一次故障的样本泄漏到了训练集和测试集。前者靠早停和正则化net.performParam.regularization解决后者靠按故障划分样本解决。解决先检查划分逻辑确保同一次故障的所有馈线样本在同一侧。然后加L2正则net.performParam.regularization 0.01减小隐层节点数增大训练样本量。如果还不行说明特征维度太高、样本太少做PCA降维。5.5 现象定位网络在故障点靠近母线时误差特别大原因靠近母线时故障线路的零序电流特征和非故障线路接近因为故障点电容电流小特征区分度低。另外归一化距离在0附近时网络输出容易偏向均值。解决对靠近母线的样本单独加权或者在特征里加入故障点反射波到达时刻如果有行波数据。我一般会在训练集里对首端故障样本过采样让网络多见几次。6. 让选线模型真正落地的两个进阶技巧6.1 多判据融合别让BP网络单打独斗BP网络再强也有它不擅长的工况。我的做法是把BP网络的输出概率和传统判据的结果做决策级融合。具体来说基波幅值判据、五次谐波判据、首半波判据各出一个故障线候选BP网络出一个概率用D-S证据理论或者简单加权投票融合。加权系数用遗传算法或者粒子群在验证集上寻优。MATLAB里实现加权投票很简单function line_id fuse_decision(p_bp, votes_traditional, w) % p_bp: BP网络输出的各馈线故障概率 (1 x n_lines) % votes_traditional: 传统判据投票矩阵 (n_criteria x n_lines)1判为故障 % w: 权重向量 [w_bp, w_trad1, w_trad2, ...] n_lines length(p_bp); score w(1) * p_bp; for k 1:size(votes_traditional, 1) score score w(k1) * votes_traditional(k, :); end [~, line_id] max(score); end逻辑说明p_bp是BP网络对每条馈线的故障概率votes_traditional是各传统判据的硬投票结果w是权重。融合后取分数最高的馈线作为选线结果。权重用验证集上的选线准确率做目标函数粒子群迭代几十代就能收敛。参数说明w的维度是1判据数初始值可以平均分配寻优范围设0到1。注意权重之和不必为1因为这是相对打分不是概率。融合后准确率通常比单BP网络高2到5个百分点尤其是高阻接地工况。6.2 在线更新模型不是训一次就完事现场工况会变负荷投切、线路改造、消弧线圈调档都会让特征分布漂移。我的习惯是在变电站后台留一个增量学习通道每次选线结果经人工确认后把这条样本加入训练集定期比如每月用全部数据重新训一次网络。MATLAB里可以用train函数在已有网络基础上继续训warm start但要注意学习率调小防止新样本把旧知识冲掉。% 增量更新加载旧网络用新数据继续训 load(bp_line_selection_v1.mat, net); net.trainParam.epochs 200; % 增量训练轮数少 net.trainParam.lr 0.001; % 学习率调小 net train(net, X_new, Y_new); save(bp_line_selection_v2.mat, net);逻辑说明增量训练的关键是学习率要小、轮数要少让网络微调而不是重学。如果新样本和旧样本分布差异极大增量训练反而有害这时候应该重新训。我一般会监控验证集准确率如果增量训练后验证集掉了就回滚到旧模型。参数说明epochs200和lr0.001是经验值样本越多可以适当增大。保存模型时带上版本号和日期方便回滚。这套机制我在一个35kV变电站跑了半年选线准确率从投运初期的88%稳定到94%左右。最后说个我自己的习惯每次现场选线结果不管对错我都会把录波数据存下来标注好实际故障线路。这些数据比任何仿真都值钱攒到几百条模型的现场适应性会有质变。电力系统的故障选线没有一劳永逸的模型只有持续迭代的工程习惯。希望帮到你。本文还有配套的精品资源点击获取
返回列表