简介:这份PDF论文聚焦配电网小电流接地故障选线问题,面向电力系统继电保护研究人员、电气工程师及研究生。内容从故障暂态特征入手,引入人工神经网络建立故障线路识别模型,并针对常规BP网络的不足,提出改进遗传算法优化网络权重与结构的方案,再结合110 kV/35 kV配电系统实例与传统算法对比验证。论文完整呈现了算法原理、改进策略、仿真流程及误差与选线率数据,适合需要借鉴智能算法在电力故障诊断中应用方法的读者。压缩包内含1个PDF文档,大小约360KB,全文结构清晰,包含摘要、引言、故障特征分析、算法实现与结论等部分。目前已有113人学习,对研究小电流接地选线或神经网络优化应用具有实用参考价值。
1. 人工神经网络做小电流接地选线:先弄明白这事到底难在哪
人工神经网络做小电流接地选线,难点从来不在“神经网络”。10kV母线报零序电压越限,4条出线零序电流都有反应,消弧线圈一补偿,稳态零序电流连方向都反转了,传统幅值法、相位法集体失灵;人工神经网络要做的,是把故障后20ms内的暂态零序电流能量、首半波极性、五次谐波占比这些特征直接映射成线路编号,不靠整定值、不靠人工阈值,绕开了小电流接地选线最头疼的“边界条件”问题。这篇文章面向配网自动化工程师、二次检修人员和做故障诊断方向的研究生:先讲清楚特征怎么选、样本怎么造,再给出一个可复现的BP网络训练流程、五个避坑点和最终的录波回放与部署方案。
2. 特征量与样本集设计:小电流接地选线喂给人工神经网络的第一步
很多人拿到这个题目,第一反应是去调网络结构,其实顺序反了。人工神经网络的性能上限由输入特征决定,样本集决定它能不能逼近这个上限;网络结构只是逼近手段。小电流接地系统的故障信息本来就被消弧线圈和负载不平衡压得很低,特征选不好,后面再怎么调参都是白搭。这一章先把“喂什么”讲透,再落到样本怎么生成。
2.1 稳态零序电流在消弧线圈补偿下为什么靠不住
中性点不接地系统发生单相接地时,非故障线路的零序电流等于本线路对地电容电流,故障线路的零序电流等于全系统非故障元件对地电容电流之和。幅值上故障线路最大,方向和非故障线路相反,所以传统选线靠零序电流幅值比较或零序功率方向就能干活。
但国内10kV配电网大量采用中性点经消弧线圈接地。消弧线圈接在变压器中性点上,单相接地时它的感性电流补偿系统容性电流,而且是过补偿运行,补偿度一般在8%到10%。补偿之后,故障线路的稳态零序电流被感性电流抵消掉一大截,幅值可能比非故障线路还小,相位也可能反转。幅值法和功率方向法当场失效,这是选线问题最原始的痛点。
五次谐波法是这个背景下的一种补救:消弧线圈在五次谐波下感抗放大五倍,补偿效果大打折扣,故障线路的五次谐波电流仍然突出。但五次谐波本身的含量很小,现场非线性负荷一多,信噪比就很差。所以单靠稳态量做人工神经网络的输入特征,等于把问题建立在流沙上。特征设计必须往暂态量倾斜。
2.2 暂态零序电流与五次谐波:选线特征量怎么挑才有区分度
单相接地发生的瞬间,母线对地电容通过故障点放电,暂态零序电流幅值可以达到稳态的几倍到十几倍,主频在几百赫兹到几千赫兹。消弧线圈的电感电流在暂态初期不能突变,基本不参与补偿,所以暂态分量里保留了真实的故障方向信息。这是人工神经网络最值得利用的“干净信号”。
实际取特征时,我一般用下面这一组,覆盖幅值、能量、方向和频谱四个维度:
| 特征 | 计算方式 | 物理含义 | 在现场的稳定性 |
|---|---|---|---|
| 暂态首半波幅值 | 故障后5ms内零序电流绝对峰值 | 反映电容放电强度,带方向性 | 高,是主要判据 |
| 暂态能量 | 20ms窗内零序电流平方对时间积分 | 暂态过程总强度,抗随机噪声好 | 高,适合做阈值 |
| 稳态幅值 | 故障后10ms零序电流有效值 | 保留传统选线的稳态信息 | 过补偿时不可单独用 |
| 零序电压基波相位 | 零序电压与A相基波的相位差 | 辅助判断接地相 | 中,受PT角差影响 |
| 五次谐波占比 | 母线零序电压五次谐波/基波 | 消弧线圈下仍有区分度 | 低,只作辅助 |
每条线路各取“首半波幅值、暂态能量、稳态幅值”三项,4条线路就是12维输入,加上零序电压相位和五次谐波占比,一共14维。特征量不是越多越好,但14维对千级样本量来说完全在BP网络能消化的范围内,而且每一项都能说出物理意义,后面模型出了问题也能回溯。
2.3 仿真样本生成:故障角、过渡电阻、补偿度三要素怎么配
选线模型的样本很难从现场拿——真实接地故障一年也没几次,所以行业通用做法是用ATP-EMTP或MATLAB/Simulink搭一个10kV配电网模型,批量扫故障条件生成样本。仿真参数的覆盖范围直接决定模型的泛化能力,这一节是能抄作业的部分。
我常用的一组系统参数如下:
| 参数 | 取值 |
|---|---|
| 系统电压 | 10kV,50Hz |
| 中性点接地方式 | 经消弧线圈,补偿度8%/9%/10% |
| 出线组成 | L1电缆6km,L2电缆4km,L3架空12km,L4电缆2km |
| 采样率 | 10kHz(一个工频周波200点) |
| 故障角 | 相对相电压峰值点0°/30°/60°/90° |
| 过渡电阻 | 0/50/100/500/1000/2000Ω |
| 故障位置 | 线路首端25%/50%/75% |
| 负荷微扰 | 各线路负荷功率在±30%内随机波动 |
每条线路按“位置×电阻×故障角”全组合遍历,再把补偿度和负荷微扰随机注入,最终生成1200组左右样本,标签就是发生的线路编号0到3。这里有个原则:故障线路的样本量要均匀,每条线路250组左右,母线故障单独再留一部分,不然训练出来的网络会“偏科”。
仿真跑完导出的通常是三相电压电流波形,不能直接喂网络,要先提特征。以下脚本把每一条仿真波形转成一条特征向量:
# extract_features.py # 输入: 仿真或录波导出的CSV, 每行一个采样点 # 列名: t(时间), IA, IB, IC(三相电流), U0(母线零序电压), L1..L4(各线路零序电流) import numpy as np import pandas as pd fs = 10000 # 采样率 10kHz f0 = 50 # 工频 50Hz def extract_features(df: pd.DataFrame, line_names: list[str]) -> np.ndarray: u0 = df['U0'].to_numpy() # 用零序电压突变量找故障起始点, 阈值取 0.15 倍额定开口三角电压 du0 = np.abs(np.diff(u0, prepend=u0[0])) start = np.argmax(du0 > 0.15 * 35 * np.sqrt(2)) if start < 10 or start + int(0.02 * fs) >= len(df): raise ValueError('故障起始点越界, 检查录波长度或启动阈值') # 首半波窗取故障后5ms, 稳态窗取最后10ms win_first = slice(start, start + int(0.005 * fs)) win_total = slice(start, start + int(0.02 * fs)) win_steady = slice(start + int(0.01 * fs), start + int(0.02 * fs)) feats = [] for name in line_names: i0 = df[name].to_numpy() first_amp = np.max(np.abs(i0[win_first])) trans_energy = np.sum(np.square(i0[win_total])) / fs steady_rms = np.sqrt(2) * np.mean(np.abs(i0[win_steady])) feats += [first_amp, trans_energy, steady_rms] # 零序电压基波相位: 用90度窗内过零点粗略估计 i0u = u0[win_total] cross = np.where(np.diff(np.sign(i0u)) != 0)[0] phase = (cross[0] / fs) * 360 * f0 if len(cross) > 0 else 0.0 feats.append(phase) # 五次谐波占比: 对零序电压做FFT, 取250Hz与50Hz幅值比 spec = np.fft.rfft(u0[win_total]) freqs = np.fft.rfftfreq(len(u0[win_total]), d=1/fs) amp_50 = np.abs(spec[np.argmin(np.abs(freqs - 50))]) amp_250 = np.abs(spec[np.argmin(np.abs(freqs - 250))]) feats.append(amp_250 / (amp_50 + 1e-6)) return np.array(feats, dtype=np.float32)逻辑说明:先靠零序电压突变量锁定故障起始点,这是所有后续特征的时间基准;首半波窗口开到5ms是为了避开消弧线圈的暂态调整;稳态窗放在故障后10到20ms,既不碰暂态又不跨越故障消失;五次谐波占比用FFT算,加了个1e-6防止除零。参数说明:突变阈值0.15倍的35V是经验值,太小会被系统正常操作误启动,太大会漏掉高阻接地;如果换了电压等级或PT变比,这个值要重标。
把全部波形跑完,保存成fault_features.csv,一列一个特征,最后一列是标签,样本设计这一步就收工了。下一步才轮到网络。
3. 用BP网络跑通最小可选线模型:拓扑、训练参数与评估指标
样本集就位之后,网络结构的选择反而成了最省事的一步。这一章给出一个单隐层BP网络的最小可用配置,附带可直接运行的训练脚本、归一化处理和评估指标定义。目标是让新手照着一周内能跑出一版仿真内准确率达标的选线模型,熟手则可以直接拿走那组超参做基线。
3.1 为什么选BP而不是上深度学习:数据量与落地的权衡
小电流接地选线本质是一次性暂态事件识别,不是长序列预测。现场能拿到的有效样本,满打满算几百到一千组,这个量级喂给LSTM或Transformer,数据量差了两个数量级,强行上深度学习只会得到过拟合的黑匣子。单隐层BP网络作为万能逼近器,在千级样本、十几维输入的场景下已经足够了。
还有一个更现实的理由:选线装置是嵌入式设备,DSP或ARM上跑的代码要确定性强、算得完。BP网络训练好之后,前向计算就是两次矩阵乘法和一次激活函数,几十KB内存加几毫秒时间就够;而PyTorch、TensorFlow这类运行时在变电站的装置上根本挪不动。所以我做这个方案一贯用BP打底,不是因为它新,而是因为它能在现场设备里真正跑起来。
3.2 特征向量构造与归一化:现场录波数据如何变成输入
上一章生成的14维特征向量,不能直接喂给激活函数为tanh的网络。原因很简单:首半波幅值可能是几十安培,五次谐波占比是零点几的小数,量纲差了两个数量级。不归一化的话,网络的权值学习会被大幅值特征主导,小幅值但物理意义很强的特征(比如相位、谐波占比)直接失去作用。
归一化操作必须在训练集上拟合参数,再把同一组参数应用到验证集、测试集和未来的现场录波上。这里有个常见的错法:把全部数据合在一起做归一化再划分训练测试集,这会造成数据泄漏,测试集准确率虚高,一到现场就现原形。下面的训练脚本里,归一化参数只从训练集来:
# train_selection.py # 依赖: numpy pandas scikit-learn import numpy as np import pandas as pd from sklearn.neural_network import MLPClassifier from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import confusion_matrix, classification_report # 读取上一章生成的特征库 data = pd.read_csv('fault_features.csv') # 列: f1..f14, label(0..3) X = data.drop('label', axis=1).to_numpy(dtype=np.float32) y = data['label'].to_numpy() # 7:2:1 分三份: 训练70%, 早停验证20%, 测试10% X_trainval, X_test, y_trainval, y_test = train_test_split( X, y, test_size=0.1, random_state=42, stratify=y) X_train, X_val, y_train, y_val = train_test_split( X_trainval, y_trainval, test_size=0.222, random_state=42, stratify=y_trainval) # 归一化参数只在训练集上拟合, 验证/测试复用同一套 scaler = StandardScaler().fit(X_train) X_train_s = scaler.transform(X_train) X_val_s = scaler.transform(X_val) X_test_s = scaler.transform(X_test) # 单隐层BP: 14维输入 -> 16个隐层节点 -> 4类输出 mlp = MLPClassifier( hidden_layer_sizes=(16,), activation='tanh', solver='adam', learning_rate_init=0.01, max_iter=2000, early_stopping=True, n_iter_no_change=20, validation_fraction=0.1, random_state=42) mlp.fit(X_train_s, y_train) print('test accuracy: %.3f' % mlp.score(X_test_s, y_test)) print(confusion_matrix(y_test, mlp.predict(X_test_s))) print(classification_report(y_test, mlp.predict(X_test_s)))逻辑说明:test_size=0.1先切出10%测试集,剩下90%再按比例切出验证集,配合early_stopping=True让网络在验证集不再提升时提前停止,防止过拟合;stratify=y保证每条线路的样本在三个集合里的占比一致,避免某条线路的样本全进了测试集。参数说明:learning_rate_init=0.01对14维输入、16个隐层节点来说是个保守但安全的起点,小了收敛慢,大了容易震荡;n_iter_no_change=20是连续20次迭代验证损失不下降就停,对千级样本足够;random_state=42固定随机种子,跑出来的结果可复现。
3.3 训练超参与评估指标:准确率之外还要盯漏选率和错选率
选线模型的评估不能只看总准确率。四回出线均匀分布时,随机猜也有25%准确率;即使模型做到95%,实际场景里5%的错误也意味着一年几次误跳非故障线路。所以我更看重两个细化指标:漏选率,故障线路没被选出来;错选率,选了非目标线路。前者会导致故障长期挂着,后者直接扩大停电范围,后者危害更大。
分类报告里的recall就是按线路分开看的召回率。对这版模型我的验收标准是:测试集总准确率不低于95%,并且每条线路的recall都不低于90%。如果有一条线路的recall只有70%,说明特征对它区分度不够,或者样本量偏少,这时候不要盲目调网络,回去看仿真样本里那条线路的故障条件是不是覆盖不全。
如果跑出来的基线模型准确率在90%边缘晃,优先检查三件事:特征里是否混入了未归一化的稳态幅值、样本是否按线路分层划分、隐层节点数是不是拍脑袋定的。这三处修完,仿真内提升两到三个百分点很常见。关于隐层节点数怎么拍的问题,下一章专门讲。
4. 人工神经网络选线避坑:五个现场必然遇到的坑
理论方案跑通和现场装置可靠工作是两回事。这一章写的是我在仿真和录波回放里反复踩过的五类问题,每条按“现象→原因→解决”展开。前四条是方法和数据层面的,最后一条是调参层面的,建议收藏。
4.1 过补偿让稳态特征翻转,网络学到了错误的映射
现象:仿真内把L1设为故障线路,准确率很高;换到一套补偿度调成12%的录波数据上,网络稳定选L2,而且看特征曲线,L1的稳态零序电流幅值排在四条线路最末。
原因:特征向量里包含了稳态零序电流幅值,消弧线圈过补偿时,故障线路的稳态零序电流被感性电流压到接近零甚至反相。网络在训练数据里学到的是“幅值大就是故障线路”,到了补偿度更高的现场,这条规则被整体逆转,选线自然错。
解决:稳态幅值特征保留但权重上不给它主导地位,主判据换成暂态首半波幅值和暂态能量;训练样本的补偿度范围从原来的8%-10%扩展到0-20%,把“过补偿翻转”当成一类正常现象交给网络学习,而不是让它以为稳态幅值永远可靠。
4.2 高阻接地时特征接近噪声,模型频频误选
现象:过渡电阻2000Ω的样本里,暂态零序电流峰值只有几安培,和电流互感器的不平衡输出一个量级。网络输出的四个概率都接近0.25,随便指了一条,但置信度极低。
原因:特征信噪比太低。高阻接地时故障点电流本身小,暂态分量被系统电容和CT精度双重衰减,网络拿到的输入向量基本是噪声,强行分类只会随机选。
解决:训练前给波形叠加高斯白噪声,信噪比按20dB到40dB随机注入,让网络见过“脏”输入;验收时把高阻样本单独划成一个子集,要求准确率不低于80%才算过关。现场逻辑也要配合:概率最大值低于0.6时不要出口选线,而是报“母线接地”并保持原线路,这个阈值规则在最后一章展开。
4.3 仿真样本太干净,一到现场就翻车
现象:仿真里测试集准确率96%,拿现场故障录波回放,连续三次真实接地选错两次。
原因:分布漂移。仿真里线路参数固定、三相负荷平衡、CT和PT理想,而现场线路电容可能偏了20%,负荷不平衡导致零序电流自带偏置,CT角差让相位特征偏移好几度。网络在仿真分布上学到的决策边界,在现场分布上不成立。
解决:仿真阶段就对参数加扰动,各线路对地电容在±20%内随机波动,负荷功率±30%,CT角差0到2度,每一条线路的样本都带一组独立的扰动系数,而不是全系统只改一个参数。这样生成的数据分布更接近现场,网络学到的映射也更鲁棒。
4.4 样本不平衡让网络退化成“只会报母线”
现象:模型总准确率虚高到98%,但打开混淆矩阵一看,故障线路样本的召回率只有40%,大量故障线路样本被归类到非故障那条去。
原因:仿真数据生成时,如果“无故障”或“母线故障”样本量明显多于单条线路故障样本,网络为了最小化总损失,会倾向于输出概率分布集中到样本量最多的类别。选线问题里,这等于宁可把故障算到母线上,也不愿意承担误跳线路的风险。
解决:每条线路的训练样本量严格对齐,比如4条线路各300组,母线故障单独300组;如果某些工况实在采不到足够样本,用class_weight='balanced'让网络在损失函数层面给少数类加权。评估不要只看总准确率,按线路分别看召回率,任何一条低于90%都要处理。
4.5 隐含层节点数拍脑袋:训练集满分、测试集翻车
现象:隐层节点数从16改成50,训练集准确率冲到100%,测试集反而掉到88%;改成6个节点后训练损失一直下不去,迭代到头也只有70%出头。
原因:节点太多让网络有足够容量去记住训练样本的细节噪声,过拟合;节点太少则表达能力不足,决策边界过于平滑,欠拟合。所谓的“最优节点数”不是玄学,是模型容量和样本量的匹配问题。
解决:把隐层节点数当成超参数做小范围扫描,经验范围在(输入维度+输出维度)/2到输入维度*2之间,也就是9到28之间。配合早停训练,跑一组简单的网格:
# 一个极简的节点数扫描 from sklearn.neural_network import MLPClassifier from sklearn.metrics import accuracy_score best_acc, best_nodes = 0.0, 16 for nodes in (9, 12, 16, 20, 24, 28): mlp = MLPClassifier(hidden_layer_sizes=(nodes,), activation='tanh', max_iter=2000, early_stopping=True, random_state=42) mlp.fit(X_train_s, y_train) acc = accuracy_score(y_val, mlp.predict(X_val_s)) print(f'nodes={nodes}, val_acc={acc:.3f}') if acc > best_acc: best_acc, best_nodes = acc, nodes print(f'best nodes: {best_nodes}, val_acc: {best_acc:.3f}')逻辑说明:这个循环纯粹用早停验证集分数选节点数,不碰测试集,选完再用测试集做最终评估,避免对测试集过拟合。参数说明:节点数从9到28覆盖了前面给的经验区间,步长不是等差的,9和12是偏欠拟合的边界,28是偏过拟合的边界;如果这六个值跑完测试集准确率都不到90%,问题大概率不在节点数,而是特征或样本本身。
5. 从模型到装置:录波回放验证与权重部署的完整链路
训练完的模型只是一堆浮点权重,现场选线装置要能加载它、执行它,还要面对真实录波数据不翻车。这一章讲两件事:离线用COMTRADE故障录波文件验证模型,然后把权重手工导成C数组部署到嵌入式装置上。
5.1 用COMTRADE录波文件做离线回放,验证模型真本事
COMTRADE是故障录波器的标准文件格式(IEC/IEEE标准),国内主流录波装置导出的是.cfg加.dat两个文件。.cfg描述通道数量和采样率,.dat存实际采样值。用真实的故障录波回放,是上线前最接近现场状态的验证手段。
回放流程固定四步:解析COMTRADE文件拿到各通道波形、定位故障起始点、按第2章的特征提取函数转成特征向量、送入训练好的模型得到选线结果。下面这个脚本搭好了骨架:
# replay_comtrade.py # 依赖: comtrade库(PyComtrade), numpy, joblib from comtrade import Comtrade import numpy as np import joblib rec = Comtrade() rec.load('fault_20240512_001.cfg', 'fault_20240512_001.dat') fs = int(round(rec.frequency)) # 通道名映射: 找到各线路零序电流和母线零序电压 line_names = ['I0_L1', 'I0_L2', 'I0_L3', 'I0_L4'] ch_map = {ch.name: ch.values for ch in rec.analog} if 'U0' not in ch_map: # 没有零序通道时用三相相电压合成3U0 ch_map['U0'] = (ch_map['UA'] + ch_map['UB'] + ch_map['UC']) / 3 df = pd.DataFrame({**ch_map, 't': rec.time}) feat = extract_features(df, fs=fs, line_names=line_names).reshape(1, -1) feat_s = scaler.transform(feat) prob = mlp.predict_proba(feat_s)[0] print('选线结果: L%d, 置信度 %.3f' % (int(np.argmax(prob)), np.max(prob)))逻辑说明:PyComtrade库负责解析二进制和ASCII两种格式的录波文件,省去手写二进制解析的麻烦;没有零序通道时用三相电压向量和除以3合成零序电压,这是电压互感器二次侧开口三角的等效算法。注意这里scaler和mlp是第3章训练后保存下来的对象,必须用joblib或pickle从训练工程里带过来,不能现场重新拟合。
通过标准我一般定两条并行:不少于50条历史录波文件,选线正确率不低于90%;故障线路对应的最大概率平均值不低于0.7。低于这个数说明模型在现场分布上不过关,直接进入增量训练流程。
5.2 把训练好的权重导成C数组,选线装置前向计算落地
验证通过后的模型要进装置。scikit-learn的MLPClassifier训练完,权重存放在coefs_和intercepts_里,两个列表各两个元素,分别对应输入到隐层、隐层到输出的权重和偏置。导出成C头文件是个体力活,写个脚本一次搞定:
# export_c_header.py import numpy as np W1, W2 = mlp.coefs_[0], mlp.coefs_[1] # W1: 14x16, W2: 16x4 b1, b2 = mlp.intercepts_[0], mlp.intercepts_[1] with open('ann_model.h', 'w') as f: f.write('#ifndef ANN_MODEL_H\n#define ANN_MODEL_H\n\n') f.write('#define N_IN 14\n#define N_HID 16\n#define N_OUT 4\n\n') f.write('static const float W1[N_IN][N_HID] = {\n') for row in W1: f.write(' {' + ', '.join(f'{v:.6f}f' for v in row) + '},\n') f.write('};\n\n') # W2, b1, b2 同理, 省略重复代码 f.write('#endif\n')训练好的网络在装置上的前向计算只需要矩阵乘法和tanh,代码量很小,而且不依赖任何AI框架:
/* forward.c: 单隐层BP前向计算, 在DSP/ARM上直接编译 */ #include <math.h> #include "ann_model.h" void ann_forward(const float in[N_IN], float out[N_OUT]) { float h[N_HID]; for (int j = 0; j < N_HID; j++) { h[j] = b1[j]; for (int i = 0; i < N_IN; i++) h[j] += W1[i][j] * in[i]; h[j] = tanhf(h[j]); } for (int k = 0; k < N_OUT; k++) { out[k] = b2[k]; for (int j = 0; j < N_HID; j++) out[k] += W2[j][k] * h[j]; } /* softmax: 先减最大值再指数, 防止浮点溢出 */ float m = out[0]; for (int k = 1; k < N_OUT; k++) if (out[k] > m) m = out[k]; float s = 0.0f; for (int k = 0; k < N_OUT; k++) { out[k] = expf(out[k] - m); s += out[k]; } for (int k = 0; k < N_OUT; k++) out[k] /= s; }逻辑说明:隐层节点用了tanhf,输出层先取最大值做平移再算softmax,这一步不是可选项——如果某路输出达到几十上百,直接expf会溢出成inf。参数说明:N_IN、N_HID、N_OUT三个宏和第3章的维度严格对应,改网络结构时先改头文件再改训练脚本,两边对不上是最常见的部署事故。
5.3 采样频率与数据窗长:部署时最容易被忽视的两个边界
前向算得再快,前面采样的底子也得对。选线用的暂态零序电流主频在几百到几千赫兹,采样率至少要能覆盖两倍以上主频。如果装置录波采样率只有2kHz,首半波的幅值会被严重削峰,提取出来的特征和训练分布不一致。我的经验是:只做选线功能,采样率不低于5kHz;要做故障波形分析,10kHz起步。
数据窗长同样有讲究。第2章特征设计用的是故障后20ms窗口,因为暂态主能量集中在前10ms,20ms足够覆盖首半波和一部分稳态。窗口再长会把负载波动和消弧线圈调节过程卷进来,反而引入噪声。启动判据建议用零序电压突变量超过额定值15%,同时连续三个采样点越限才确认启动,防止单点毛刺误触发。用这个启动逻辑配合20ms数据窗,装置从故障发生到输出选线结果一般在40ms以内,对不需要快速跳闸的小电流接地系统完全够用。
6. 最后加一道保险:给选线结果设置信度门槛,别让装置乱开口
仿真指标再漂亮,现场的真实样本分布也不可能和训练分布完全一致。所以部署时我坚持加一道置信度门槛:网络输出的是四个线路的概率分布,不要简单取最大值就出口。概率最大值落在哪个区间,决定装置到底该跳闸、该提示还是该闭嘴。
我的判断逻辑分三档:最大概率大于等于0.7,并且连续三个数据窗指向同一条线路,才允许出口选线结果;最大概率在0.4到0.7之间,只提示“综合选线建议Lx”,不自动出口;低于0.4直接报“无法判断”,保持原运行方式。这个门槛是血泪经验——选线装置误跳一条非故障线路,比选不出故障的后果严重得多。宁可让运维人员多跑一趟人工拉路,也不能让装置乱开口。
def decide_action(prob, history, thr_trip=0.7, thr_report=0.4): line = int(np.argmax(prob)) p = float(np.max(prob)) history.append(line) if len(history) > 3: history.pop(0) if len(history) == 3 and all(h == line for h in history): if p >= thr_trip: return 'trip', line if p >= thr_report: return 'report', line return 'hold', None阈值本身可以按现场的验收结果微调:如果50条录波回放里高阻接地样本频频落在0.4到0.7区间,说明现场噪声比训练分布大,可以把thr_report降到0.35,但thr_trip不要低于0.6,这是保住不误动底线的最后一道闸。希望这一套从样本构造到置信度门槛的流程,能帮你少走几段弯路;选线这条路,先把“不乱动”做好,再谈“选得准”。
本文还有配套的精品资源,点击获取