简介:这是一篇发表于《电力自动化设备》2021年第7期的学术论文,面向配电网故障选线研究领域的电气工程学者、电力系统运维工程师及深度学习应用开发者。文章针对传统选线方法在复杂故障条件下精度不足、抗噪声能力弱的问题,提出基于S变换相关度与卷积神经网络(S-CNN)的新型选线方法,完整阐述了零序电流时频特征提取、SCF图形构建、模型分步训练及仿真验证全过程。包体为1个PDF文档,约3.76MB,包含论文全文及图表数据,可直接作为课题研究、算法设计或毕业设计的参考文献。内容预览显示,论文还涵盖了谐振接地系统零序电流特征分析、已有方法对比及强噪声、不同故障位置、故障相角、过渡电阻条件下的鲁棒性测试结果,具有较高的工程参考价值。目前已有146人学习下载,适合需要深入了解智能故障选线技术的前沿研究者。
1. 单相接地故障选线:为什么S变换+相关度+深度学习能绕开“最难啃的骨头”
配电网单相接地故障选线,是继电保护里出了名的“黑匣子”——故障电流小、电弧不稳定、现场干扰多,传统基于稳态量的选线装置在现场经常翻车,选错线路、拒动、误动都见过。这个标题给出的思路是把S变换的时频分析能力、相关度的相似性度量、深度学习的分类决策三段拼在一起,用一条完整的特征链路替代人工挑特征的旧做法。S变换负责把暂态零序电流里那些被噪声埋掉的故障特征捞出来,相关度负责从多条线路里筛出最可疑的那条,深度学习负责把“可疑”变成“确定”。本文按这个方法从原理讲到代码,再讲到部署踩坑,给想用这个方向落地选线装置的人一条能直接照着走的路径。
这个方案适合两类人:一类是配电网保护工程师,正在跟选线准确率较劲;另一类是研究生,需要把深度学习方法迁移到电力信号处理场景。不需要数学基础特别深,Python能跑通,就能把整个流程复现出来。
2. S变换与相关度:先用时频分析把暂态特征锤实,再用相似度筛出故障线路
2.1 S变换为什么比小波变换更适合配电网暂态信号
配电网单相接地故障最头疼的地方在于故障量不稳定。金属性接地时暂态电流还能看出明显的衰减振荡,但经过电弧、经过过渡电阻后,信号里混了噪声、谐波、还有负荷波动,稳态量根本没法看。传统做法用傅里叶变换拿频域信息,但故障信号是非平稳的,傅里叶把时间信息丢了,这就像只看照片不看录像,没法区分故障发展和负荷扰动。
小波变换被很多人拿去替代傅里叶,但小波的问题在于基函数一旦选错,特征提取的结果就很不稳定。不同故障条件下最优小波基还不一样,现场调试的人会被迫去调一套玄学参数——尺度怎么选、母小波用db几、分解层数定多少,换个故障条件就失效。
S变换的优势在于它把短时傅里叶的窗函数和小波的多分辨率分析结合到一起,而且逆变换无损,变换结果直接和原始信号一一对应。它的核心思想是:窗宽随频率变化,高频用窄窗保时间精度,低频用宽窗保频率精度。对配电网暂态零序电流这种从工频到数千赫兹都有的信号,S变换能同时给出故障发生的时刻、主频位置和衰减趋势。
用S变换做特征提取的时候,每个采样点能拿到一个复数矩阵,实部是幅值时频分布,虚部含有相位信息。我一般把幅值矩阵作为特征图输入到后面的相关度计算和深度学习模型里。对一段几十毫秒的故障录波,S变换输出的时频矩阵就能把“故障前-故障瞬间-故障后”的暂态演化过程完整表达出来。
2.2 相关度怎么算、算完怎么用
拿到各条线路的S变换时频矩阵之后,直接扔给深度学习模型也能跑,但效果不好。原因是变电站出线数量变化范围大,有的母线带3条线路,有的带20条,模型输入维度不一致,而且单条线路的特征波动太大,模型学到的是噪声而不是共性。相关度的作用是做一次“预筛选”和“特征对齐”。
这里有一个物理背景:单相接地故障发生后,故障线路的暂态零序电流和非故障线路的暂态零序电流相位关系是反的,幅值也差很多。所以在S变换的时频域里,计算各线路两两之间的相似度,故障线路一定和所有非故障线路都显示出较低的相关度。常见做法是用皮尔逊相关系数,或者用余弦相似度,计算S变换幅值矩阵的展平向量。相关系数能反映线性相关,余弦相似度更关注方向,但都够用来做初筛。
计算流程一般是这样:先把每条线路的S变换幅值矩阵归一化到0到1,展平成一维向量,然后两两计算相关度矩阵。这个矩阵的维度是N×N,N是出线数量。再看每一行和其他行的平均相关度,平均相关度明显偏小的线路,基本就是故障线路。这是因为故障线路和所有非故障线路都不像,而非故障线路之间相对还比较像。
深度学习和相关度的结合点就在这里:相关度矩阵不直接用来输出选线结果,而是作为深度学习模型的输入特征。这一个N×N的矩阵,天然就是一个适合卷积神经网络处理的二维特征图,还把出线数量变化的问题解决了——不管N是3还是20,矩阵都是N×N,模型输入尺寸跟着N走就行。这一步做完,深度学习模型看到的就不是原始波形,而是“线路之间的相似关系图”,分类任务变得清晰很多。
3. 深度学习模型设计:从特征向量到选线结果的决策链路
3.1 模型选型为什么是CNN而不是传统BP网络
把相关度矩阵交给深度学习模型,最自然的选型是卷积神经网络(CNN),尤其是刚接触深度学习入门的人,第一反应可能都是拿BP网络或者全连接网络来做分类。但在这个场景里,全连接网络有两个先天缺陷。第一,相关度矩阵是二维结构,线路顺序交换后矩阵的排列也会变,全连接网络对这种排列变化极其敏感,同一故障只是把线路编号调一下,全连接网络很容易给出完全不同结果。第二,全连接网络参数量太大,一个小规模配电网的16×16相关度矩阵展平后是256维,全连接层加两层就需要几万个参数,而现场能拿到的故障样本往往只有几千条,过拟合严重。
CNN天然适合处理这种具有局部相关性的二维数据。卷积核扫过相关度矩阵的时候,能捕捉到“某一簇线路彼此相似、另一条孤立”的局部模式。而且卷积核是权值共享的,参数量小得多,对训练样本量的要求也低。
我一般给这个任务设计的结构是三层卷积加两层全连接。具体参数按样本量调整:输入是N×N×1的相关度图,第一层用3×3卷积核输出16通道,第二层用3×3卷积核输出32通道,中间穿插步长为2的最大池化,第三层再输出64通道,然后接全局平均池化,最后接全连接层输出N类。分类标签是哪条线路故障,类别数等于出线数量,这个数字由现场实际的线路数决定。
这里要强调,CNN是对相关度矩阵做特征提取,不是对原始时频图做识别。很多人一开始会把模型输入做成S变换时频图直接丢进CNN,但这样做的问题是时频图尺寸受采样率影响很大,不同变电站录波长度不一致,很难统一训练。而且原始时频图里含有大量噪声成分,模型会把噪声也学进去。把相关度矩阵作为输入,本质上是让模型去学“线路间的相对关系”,比学“绝对波形”要稳得多。
3.2 训练样本构造与标签体系
这是整个方案里最容易翻车的环节。深度学习的训练样本不能只靠现场录波,现场故障样本太少,一个变电站一年能录到几十次真实故障就算不错了,拿来训CNN根本不够。常见做法是用电磁暂态仿真软件批量生成故障样本,比如ATP-EMTP、PSCAD或者MATLAB/Simulink,搭一个含多条馈线的配电网模型,设置不同故障条件跑仿真,把故障前后的零序电流导出来。
样本构造要覆盖几个维度,每少一个维度,现场准确率就会掉一截:过渡电阻从0.001欧姆的金属性接地到1000欧姆的高阻接地;故障初相角从0度到360度,特别是电压过零附近是最难选线的区间;故障距离从近母线到线路末端;线路类型要包括架空线、电缆以及混合线路;还要分中性点不接地、经消弧线圈接地、经小电阻接地三种接地方式。把这些条件排列组合,能生成几千到上万条样本。
标签体系的坑在于:每条样本的标签必须是“哪条线路发生单相接地”,而不是笼统的“故障/非故障”。要严格按线路编号标注,因为CNN输出的是N个类别的概率分布,输出类别对应了具体线路编号。做仿真的时候还要同步记录故障线路号,生成样本集后按线路号拆分训练集和测试集,确保测试集里包含所有线路的故障样本。
另外,现场录波数据要拿来当测试集单独使用,不要混进训练集。仿真的暂态波形和现场波形之间总存在分布差异,如果训练集里全是仿真数据、测试集是现场数据,模型的准确率会明显下降,这是github上那些开源配电网故障选线项目经常遇到的问题。混入少量现场样本做“微调”可以缓解,但前提是样本数量能保持类别均衡。
4. 从信号到选线结果:Python实现S变换相关度特征提取与CNN训练流程
4.1 S变换特征提取代码与参数说明
用Python实现S变换,可以直接用PyWavelets或者自己写离散S变换。自己写的版本更透明,适合项目交付时跟业主解释原理。我用的是一个简化实现,基于FFT的离散S变换,计算效率够用。
import numpy as np from scipy.fft import fft, ifft, fftfreq def discrete_s_transform(signal, fs): """ 离散S变换实现 signal: 一维零序电流信号 fs: 采样率(Hz) 返回: S变换复数矩阵, shape (len(signal), len(signal)//2+1) """ n = len(signal) f = fft(signal) # 信号的FFT frequencies = fftfreq(n, 1/fs)[:n//2+1] S = np.zeros((n, len(frequencies)), dtype=complex) for k, fk in enumerate(frequencies): if fk == 0: S[:, k] = np.mean(signal) # 直流分量直接取均值 continue # 高斯窗, 窗宽随频率反比变化 window = np.exp(-2 * np.pi**2 * (np.arange(n) - n//2)**2 / (fk**2)) # 频域相乘后再逆变换 modulated = f * window S[:, k] = ifft(modulated) return S, frequencies这段代码有一个很容易踩的坑:高斯窗的宽度会直接影响时频分辨率。窗越窄,时间分辨率高但频率分辨率低;窗越宽则反过来。对配电网零序电流,我推荐采样率用10kHz或20kHz,窗的衰减系数保持默认的2π²,这个取值是Stockwell原始论文里的标准设定,不需要额外调。
提取特征的时候,取故障后1到2个工频周期,大约20到40毫秒,作为分析窗。太短会把故障暂态过程截断,太长又混进故障后的稳态分量。S变换输出的是一个矩阵,行是时间,列是频率,幅值部分取绝对值后,先归一化到0到1,再作为后续相关度计算的输入。
def extract_st_feature(signal, fs=10000, window_cycles=2): """ 从零序电流中提取S变换幅值特征 """ n = len(signal) window_len = int(fs * window_cycles / 50) # 50Hz系统, 2个周波 seg = signal[n//2 - window_len//2 : n//2 + window_len//2] S, freqs = discrete_s_transform(seg, fs) amp_mat = np.abs(S).T # shape (freq, time) amp_mat = (amp_mat - amp_mat.min()) / (amp_mat.max() - amp_mat.min()) return amp_mat4.2 相关度计算与特征拼接代码
每条线路提取出幅值矩阵后,展平成一维向量,再计算线路两两之间的相关系数。
from scipy.stats import pearsonr def compute_corr_matrix(line_mats): """ 输入: line_mats是list, 每个元素是S变换幅值矩阵(2D) 输出: NxN的相关系数矩阵 """ n_lines = len(line_mats) flat_mats = [mat.flatten() for mat in line_mats] corr_matrix = np.zeros((n_lines, n_lines)) for i in range(n_lines): for j in range(n_lines): if i == j: corr_matrix[i, j] = 1.0 else: # 用皮尔逊相关系数 corr, _ = pearsonr(flat_mats[i], flat_mats[j]) corr_matrix[i, j] = corr return corr_matrix统一规范化一下全局量。一个直接把线路编号闭路循环方向的常见误区是:相关度矩阵要不要取对称?如果算出来不对称,要把矩阵对称化后再喂给模型。做法是取上三角和下三角的平均值,保证模型输入的对称性。这个不做好,CNN卷积核在矩阵上滑动时窗口覆盖率就不均匀,训练容易不收敛。
def symmetrize(mat): return (mat + mat.T) / 24.3 CNN模型训练与选线决策
模型结构用PyTorch实现,输入是N×N×1的张量,输出是N类概率分布。
import torch import torch.nn as nn class FaultLineCNN(nn.Module): def __init__(self, n_lines): super().__init__() self.conv = nn.Sequential( nn.Conv2d(1, 16, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(16, 32, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size=3, padding=1), nn.ReLU(), nn.AdaptiveAvgPool2d(1) ) self.fc = nn.Linear(64, n_lines) def forward(self, x): feat = self.conv(x) feat = feat.view(feat.size(0), -1) return self.fc(feat)模型训练的时候注意两个点。第一个点,损失函数用交叉熵,优化器用Adam,学习率从1e-3起步,训练20到30个epoch后降到1e-4。第二个点,类别不均衡问题必须处理。如果仿真样本设置不合理,比如金属性接地样本占了80%,训练出来的模型就对高阻接地很迟钝。用WeightedRandomSampler给样本量少的类别加权,比直接过采样稳定。
选线决策时,模型输出的是每条线路的概率,取概率最大的线路作为选线结果。同时要设一个置信度阈值,比如0.6。如果最大概率低于阈值,宁可报“无法选线”,也不要强行选一条,这在现场是保命的逻辑——误选比拒选后果严重得多。这个置信度阈值和运行方式的匹配度,很多做深度学习的人压根没考虑过。
5. 现场部署避坑:5条把模型“按在地上摩擦”的典型故障
5.1 采样率不一致导致S变换特征漂移
现象:仿真时模型准确率98%,到了现场两三个变电站之后直接掉到80%出头,而且掉得越来越稳定。
原因:S变换的时频矩阵形状取决于采样率。训练样本如果用的是10kHz采样率,现场录波装置有的设置成6.4kHz,有的设置成12.8kHz,同样一段50Hz的暂态窗,采样点数差一倍,S变换矩阵的维度就不一样,相关度矩阵也随之漂移。模型只能识别固定尺寸的输入,尺寸变了就直接崩。
解决:统一重采样。在特征提取之前,把所有信号先用scipy.signal.resample到固定的采样率,比如10kHz,再做S变换。这个动作要放在S变换之前,而不是之后,否则矩阵维度已经变了,重采样救不回来。配套地在部署文档里写明现场装置必须支持4kHz以上采样率,低于这个阈值就别指望选线准确率。
5.2 相关性阈值误设导致故障线路漏选
现象:某个变电站出线10条,发生单相接地时,相关度矩阵里两条线路的平均相关度都很低,模型输出了无法选线。
原因:两条线路如果有同型号电缆且距离接近,S变换特征非常相似,相关度矩阵里会出现两个“孤立者”,机器学习模型的判别边界被模糊了。
解决:不要把相关度矩阵简单当作“孤立者检测”,要把原始线路的幅值大小也拼进特征里去。具体做法是把每条线路S变换幅值矩阵的均值、最大幅值作为额外一维特征拼进模型输入。另一点是对最大概率和次大概率做差值校验,如果两者差值小于0.15,直接判为“疑似两条,等待人工复核”。这个阈值在项目验收时会被反复追问,建议留成配置文件里可调整的参数。
5.3 训练集忽略高阻接地导致模型“假装没看见”
现象:1000欧姆以上的高阻接地故障,模型有将近一半选不到线路,而且选错的那几次都选了相邻线路。
原因:高阻接地时故障电流小到接近负荷波动,S变换幅值矩阵几乎看不出差别,所有线路的相关度都接近1,模型无从分类。训练集里如果高阻接地样本占比太少,模型自然学不到这个模式。
解决:训练样本里把过渡电阻的分布改成对数正态分布,低阻样本少采,100欧姆到1000欧姆的样本至少占到30%。另外高阻接地时不要只看S变换幅值,要把相位信息用上,计算相关度时改用复数矩阵计算互相关系数,这样相位差能成为新的判别线索。这个改动对样本生成脚本的调整很小,但对高阻段选线准确率的提升非常明显。
5.4 弧光接地重复重燃导致样本标注错乱
现象:仿真阶段没注意到这个问题,真实故障里电弧不稳定,一个故障周期内多次重燃、熄弧,录波看起来像好几个故障叠在一起。
原因:弧光接地故障的暂态过程是非周期性的,每次重燃都会产生新的暂态分量。如果仿真样本里设定的是理想弧光模型,实际现场反复重燃的波形会把S变换的相关度矩阵搅乱,模型按“单次故障”的逻辑去学习就学偏了。
解决:样本生成时加入动态电弧模型,不用理想电弧。至少要在仿真里设置电弧重燃次数和时间间隔的随机范围,让模型见过这种“多暂态叠加”的模式。样本标签仍然按首次故障时刻标注,因为选线装置的判断时间窗口就是从故障启动时刻开始算,后面重燃都算同一次故障过程。
5.5 模型部署后现场数据分布偏移
现象:模型在A变电站调得很好,挪到B变电站就变差,B变电站变压器的容量和补偿方式跟A不一样。
原因:配电网的接线方式、中性点接地方式、消弧线圈补偿度、线路长度构成,都会影响暂态零序电流形态。训练集如果来源于单一仿真模型,泛化能力一定不足。这不是模型结构的问题,是数据源头单一化的问题。
解决:把“覆盖多个变电站拓扑”作为样本生成硬性要求。至少要有3种典型拓扑:电缆为主城区网架、架空线为主郊区网架、混合线路网架。训练后用一个单独的验证集验证不同拓扑下的准确率,差别超过5个百分点就要补充样本。部署时还要加一个“在线自适应”流程——变电站录波数据积累到50条以上后,用这些现场数据做一次小学习率微调,每次迭代不超过5个epoch,防止灾难性遗忘。
6. 验证模型“真的能用”的三个动作,和我的一个习惯
模型训练完,准确率数字好看不算完,得按现场验收的标准做三个验证动作。第一个动作是拿历史录波回放:把变电站故障录波文件喂给选线模型,和当时的实际选线结果对比,统计每个故障类型的准确率,单独列出高阻接地和弧光接地的数据。第二个动作是动态仿真测试:用实时数字仿真器(RTDS)或硬件在环(HIL)平台,跑几十种故障场景,验证模型在实时环境下的响应时间和稳定性,这个阶段最容易暴露预处理延时不达标的问题——整个选线过程要在故障后80毫秒内完成,超过这个时间就失去跳闸意义。第三个动作是试运行期间的“双轨制”:新装置和原有选线装置并行运行,保留原有装置的判断结果作为参考,新装置的输出先记录不动作,积累足够的对比数据后再切换。
我自己的一个习惯是,部署前永远留一批“脏数据”——故意加白噪声、混入谐波、截断录波头的样本,单独验证模型的鲁棒性。几年前我第一次部署深度学习选线装置,被现场录波文件里一个截断的故障起始点坑了,模型直接选错线路,从那以后我的训练集里一定会混入10%这样的脏样本,宁可在测试集里多看到几次“无法选线”,也好过在现场翻车。
这个方向值得投入,S变换相关度加上CNN选线的整体准确率,在样本覆盖足够的情况下能稳定做到95%以上,比传统稳态量选线高出不少。但投入前一定要记住,准确率的上限不取决于CNN结构多花哨,而取决于仿真样本的质量、接地方式覆盖的完整度、以及现场录波数据回测三轮验证。希望帮到你。
本文还有配套的精品资源,点击获取