ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

S变换与深度学习在配电网单相接地故障选线中的应用

S变换与深度学习在配电网单相接地故障选线中的应用 简介《基于S变换相关度和深度学习的配电网单相接地故障选线新方法》是一项面向配电网故障诊断的学术研究成果PDF原文共1个文件大小3.76MB已有146人学习下载。这项成果来自华中科技大学电气与电子工程学院发表于《电力自动化设备》2021年第7期针对传统零序电流幅值比较法易受故障条件和环境噪声影响的问题利用S变换提取零序电流全频段时频信息并计算线路故障相关度进而提出S变换相关度图形SCF构建方法搭建含SCF层的卷积神经网络模型S-CNN。文章给出了Simulink仿真与真实配电网故障数据测试结果验证了强噪声、不同故障位置、故障相角、过渡电阻及采样不同步等场景下的高正确率选线性能。内容偏重理论与算法实现适合电力系统专业研究生、配电网保护研发工程师及从事深度学习电力应用的研究者阅读参考对配电网故障选线方案设计与智能化升级具有直接借鉴价值。1. 单相接地故障选线为什么要从频谱分析绕不开S变换配电运维人员看故障录波图时最头疼的场景是母线零序电压已经越限好几条出线的零序电流波形却长得一模一样。小电流接地系统里单相接地后的故障电流本来就小消弧线圈还会把基波分量补偿掉能拿来判断故障位置的只剩下暂态过程那几十毫秒里频率随时间变化的微弱信号。这种非平稳信号拿固定窗长的短时傅里叶变换去切分辨率顾了高频就丢了低频而S变换Stockwell变换的窗口宽度会随频率自动收缩高频段看清暂态起始点低频段盯住衰减分量天然适合做选线特征提取。S变换相关度负责把多条馈线之间的相似性和差异性量化成矩阵深度学习再从这个矩阵里自动学出“哪条线路内部特征跟集体不一致”这一步就是故障选线。这篇文章写给做配网自动化、状态检修或继电保护相关系统的工程师目标是让你从原理、特征构造到模型训练完整复现这条技术路线。2. S变换的时频分析原理与最小可运行实现2.1 S变换和短时傅里叶、小波变换的差异S变换的定义可以理解为短时傅里叶变换的“变种”但窗函数不再是固定宽度的高斯窗而是随频率变化的。对于一个连续信号x(t)S变换定义为S(τ,f) ∫ x(t) · (|f| / √(2π)) · exp(-(τ-t)²f² / 2) · e^(-j2πft) dt其中高斯窗的标准差σ(f) 1/|f|。这个式子最直接的含义是频率f越高窗越窄时间分辨率越高频率越低窗越宽频率分辨率越好。对比短时傅里叶变换固定窗宽带来的“顾此失彼”S变换在分析电力暂态信号时能同时保留故障发生时刻的突变点和高频振荡分量。和小波变换相比S变换的输出直接落在时间-频率平面上频率轴的刻度就是物理Hz不需要做尺度到频率的换算。小波变换在分析非平稳信号时同样自适应但工程人员在使用时面对的是一组尺度系数必须额外做映射S变换的输出形式对后面的机器学习工程更友好矩阵的行列都有明确的物理标签。特性短时傅里叶变换连续小波变换S变换窗函数固定宽度尺度自适应频率自适应高斯窗频率刻度线性Hz尺度需换算直接为Hz高频时间分辨率差好好低频频率分辨率差好好逆变换有有条件有配电网暂态信号有个特点故障起始瞬间包含大量的高频分量随后迅速衰减几十毫秒后只剩工频和衰减直流。这正好对应S变换在时间-频率平面上的“两头兼顾”。2.2 用Python写一个能跑的离散S变换论文里通常直接给公式真正动手复现时才会发现离散实现有很多细节。下面的代码用时域卷积方式实现S变换逻辑直观适合理解原理工程上要追求速度时可以换成基于FFT的快速实现但输出矩阵的结构相同。import numpy as np def stockwell_conv(x, fs, fmin20.0, fmax5000.0, n_std3): 时域卷积方式计算离散S变换。 参数 ---- x : np.ndarray, shape (n,) 输入信号例如零序电流的采样序列 fs : float 采样率单位 Hz fmin, fmax : float 需要分析的频率范围单位 Hz n_std : int 高斯窗保留的宽度取 3 个标准差以上会截断 返回 ---- st_matrix : np.ndarray, shape (n_freq, n) 行对应频率列对应采样时刻 freqs : np.ndarray 频率轴 n len(x) t np.arange(n) / fs freqs np.linspace(fmin, fmax, int((fmax - fmin) / 2) 1) # 构造解析信号去掉负频率带来的镜像干扰 analytic np.fft.ifft(np.fft.fft(x) * (2 * (np.arange(n) n // 2))) analytic analytic.real st_matrix np.zeros((len(freqs), n), dtypenp.complex128) for idx, f in enumerate(freqs): if f 0: continue sigma 1.0 / f if f 0 else 1.0 # 高斯窗宽度与频率成反比 half int(n_std * sigma * fs) half min(half, n // 2) # 对基波做频率搬移后做局部加权 base analytic * np.exp(-2j * np.pi * f * t) win np.exp(-(t - t[n // 2]) ** 2 / (2 * sigma ** 2)) # 卷积中保证窗的峰值对准不同时刻 weighted base * win st_matrix[idx, :] np.fft.fftshift(np.fft.ifft(np.fft.fft(weighted))) return st_matrix[:, :n], freqs这段代码的核心思路是对于每个目标频率f先把信号搬移到基带再乘上一个宽度为1/f的高斯窗最后卷积。代码里的analytic构造了解析信号目的是消除负频率分量的影响否则在低频段会产生明显的交叉干扰。fmin和fmax控制了输出矩阵的行数实际分析中不要无脑从0Hz开始——配电网暂态信号的能量主要分布在100Hz到5kHz直流附近的频率既没有诊断价值还会因为窗太宽而引入数值噪声。2.3 配电网零序信号分析的频率段和时间窗设置S变换虽然数学形式漂亮但直接用在故障选线上需要先确定两个重要参数采样率与分析时间窗。现场故障录波装置常见采样率是10kHz即每周期200个点对暂态高频分量来说已经足够不需要额外插值。时间窗的选择更考究。故障前取5ms到10ms作为参考段故障后取40ms到80ms这样既能覆盖暂态首波又能看到高频衰减到稳态的过程。如果时间窗取太长例如一个完整工频周期加暂态共120msS变换矩阵里高频分量的能量会被低频部分稀释后面深度学习模型要关注的重点反而被压制。我一般让时间窗内的采样点数在1000到2000之间这样S变换直接计算的时间在几百毫秒量级完全能满足批量预处理的需求。还有一个容易踩的坑零序电流互感器的二次侧信号通常有较强的直流偏置和低频漂移直接做S变换会在频率轴最低端产生一片伪能量。处理办法是先做50Hz陷波和100Hz以下的高通滤波把漂移去掉再进S变换。滤波阶数不宜过高二阶巴特沃斯就够避免把有用的低频衰减分量一并滤掉。3. 从S变换到相关度特征构造深度学习能用的样本3.1 为什么要计算S变换相关度而不直接把矩阵塞进网络S变换输出的是一个二维复数矩阵幅值谱和相位谱能描述单个信号的时频特性但故障选线本质上是一个多通道比较问题。某个馈线是否故障取决于它和其他馈线的行为差异而不是它自己单独长什么样。把多条馈线的S变换矩阵直接拼接成一个高维向量喂给网络网络确实能学但需要大量样本来拟合“谁跟谁不一致”这种关系。相关度计算在这里相当于把比较逻辑显式地做进了特征里让模型不需要从头总结“不一致”的统计规律。常见做法是计算两类相关度一是每条馈线的零序电流S变换与母线零序电压S变换之间的相关系数二是馈线两两之间的S变换幅值谱相关系数矩阵。前者的物理意义是故障线路的暂态电流和母线电压的波形特征更接近后者刻画的是健全线路之间的时频结构相似度故障线路在相关度矩阵里会体现出明显的“离群”。3.2 计算S变换相关度矩阵并做成单通道样本在采集到多通道零序信号后第一件事是把每一条馈线的S变换幅值谱做归一化因为它们量纲相同但幅值可能差一个数量级。归一化后再计算相关度矩阵就稳定得多。下面的代码展示了如何把8条馈线的S变换幅值谱整理成一个相关度矩阵。def feeder_corr_matrix(st_magnitudes): 输入多馈线S变换幅值谱输出馈线间的相关度矩阵。 参数 ---- st_magnitudes : np.ndarray, shape (n_feeder, n_freq, n_time) 所有馈线的S变换幅值谱 返回 ---- corr : np.ndarray, shape (n_feeder, n_feeder) 这是给深度学习模型用的二维特征图 n_feeder st_magnitudes.shape[0] corr np.eye(n_feeder) # 每条馈线分别做 L2 归一化避免幅值差异主导相关系数 norm_feats [] for i in range(n_feeder): flat st_magnitudes[i].flatten() normed (flat - flat.mean()) / (flat.std() 1e-8) norm_feats.append(normed) for i in range(n_feeder): for j in range(i 1, n_feeder): r np.corrcoef(norm_feats[i], norm_feats[j])[0, 1] corr[i, j] r corr[j, i] r return corr用np.corrcoef计算Pearson相关系数是最直接的做法。注意代码里做了一次L2归一化因为馈线的零序电流幅值往往不在同一个量级如果不归一化相关系数会被幅值最大的那条馈线主导弱故障特征反而被淹没。把相关度矩阵当作特征图输入模型时数据维度不大8条馈线对应的就是8×8的矩阵。如果你的配电网出线数不固定需要先确定一个最大馈线数M不足M条的补零否则模型输入会变长导致训练不稳定。相关度矩阵也可以和S变换降采样后的幅值谱做多通道输入让网络同时看到绝对特征和相对特征但这种做法要求样本量足够大否则过拟合风险高。3.3 故障样本覆盖范围与数据增强工况参数典型取值说明故障角0°、30°、60°、90°、120°90°附近暂态能量最强0°附近最弱接地电阻0Ω、100Ω、500Ω、2000Ω、5000Ω高阻接地是选线的主要难点消弧线圈补偿度欠补偿5%、过补偿5%、过补偿10%补偿度影响残流大小噪声水平SNR 20dB、30dB、40dB模拟现场录波噪声馈线结构架空线、电缆、混合线路阻尼率不同暂态衰减速率不同仿真时可以把这些参数做全组合一个典型配电网模型能生成几千个样本。但样本之间不能直接按随机顺序切分训练集和测试集必须以“仿真场景”为单位划分同一个故障角、同一组接地电阻的样本如果同时出现在训练集和测试集里评估出来的准确率会虚高后面换到现场数据时立刻露馅。数据增强方面常见做法是在S变换前对原始波形做小幅时间抖动和幅值缩放模拟录波装置触发时刻的微小差异。这种做法比增强S变换后的矩阵更合理因为增强发生在物理域而不是特征域不会破坏时频结构的一致性。4. 深度学习模型选型与训练把故障选线做成分类任务4.1 用轻量级CNN从相关度特征中学出故障线路故障选线的样本量通常不大几千条仿真样本已经算多所以模型结构不能用力过猛。大部分论文会用VGG或ResNet来展示效果实际工程上更加合适的做法是先从一个三层卷积网络开始验证特征有效性后一步步加深。下面的PyTorch模型就是为8条馈线的选线任务设计的。import torch import torch.nn as nn class FeederSelector(nn.Module): def __init__(self, n_feeder8, in_channels2): super().__init__() # 输入通道2一个通道是馈线相关度矩阵另一个是各馈线S变换幅值的频域轮廓 self.features nn.Sequential( nn.Conv2d(in_channels, 32, kernel_size3, padding1), nn.BatchNorm2d(32), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size3, padding1), nn.BatchNorm2d(64), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), ) self.classifier nn.Sequential( nn.AdaptiveAvgPool2d((4, 4)), nn.Flatten(), nn.Dropout(0.3), nn.Linear(64 * 4 * 4, 128), nn.ReLU(inplaceTrue), nn.Dropout(0.2), nn.Linear(128, n_feeder) ) def forward(self, x): x self.features(x) x self.classifier(x) return x模型输入是2通道的二维特征图输出是长度为8的向量对应8条馈线各自成为故障线路的概率。第一层卷积使用BatchNorm2d因为相关度矩阵经过补零后边缘数值会有跳变批归一化可以稳定前面几层梯度的分布。池化层用MaxPool2d保留强响应位置这对“找出离群线路”的任务是合理的因为故障线路的特征差异通常体现在少数时频区块上。隐藏层的通道数控制在32和64这是有意的选择。故障选线样本量少特征维度太高很容易过拟合验证集准确率会在第10轮左右开始不再上升。如果一定要加深网络必须在每层后面紧跟Dropout并把Dropout率提高到0.4否则训练集能到99%以上测试集掉到80%是很常见的现象。4.2 训练参数设置和损失函数选择模型输出层没有经过Softmax配合PyTorch的CrossEntropyLoss使用即可它在内部已经做了Softmax和交叉熵的计算不需要自己再做一层。参数推荐取值注意事项优化器AdamW比Adam多一个权重衰减项防止模型在少量样本上产生大范数权重初始学习率3e-4高于1e-3会导致损失不收敛权重衰减1e-4和Dropout搭配使用批大小32样本量低于2000时用16更稳训练轮数50以验证集Early Stopping为准类别权重按馈线样本数反比避免馈线数量不平衡训练时会发现一个现象验证集准确率在90%附近徘徊但误选掉的那部分样本几乎都集中在高阻接地场景里。这不是模型问题而是高阻接地时故障馈线与健全馈线的S变换相关度差值确实很小任何分类器都难以区分。处理方案有两个方向一是把接地电阻大于2000欧姆的样本单独建模二是训练分类器时对低置信度样本增加损失权重。实践里前者效果更好因为建模目标更单纯。4.3 评估指标要看误选率和拒选率而不是准确率故障选线的评价体系和通用图像分类不太一样。图像分类里90%准确率可以接受但选线任务里选错线路意味着把健康线路当作故障线路来停电代价远大于“选不出来”。所以工程上更倾向把模型输出看成两个环节先判断哪条线路最可能再判断这个判断是否可靠。常见评价指标包括选线准确率、误选率和拒选率。拒选率指的是当模型输出的最大类别概率低于某个阈值时系统主动放弃本次选线由人工介入。举例来说假设阈值设成0.6模型输出的softmax概率是[0.55, 0.15, ...]那么系统不应该选0号线路而是直接报“无法判定”。这个机制在现场非常有价值。def select_with_reject(logits, threshold0.6): 带拒选逻辑的故障选线输出。 参数 ---- logits : torch.Tensor / np.ndarray, shape (n_feeder,) 模型输出的原始logits threshold : float, 默认0.6 最低置信度阈值 返回 ---- select_idx : int / None, 选中的馈线编号或None表示拒选 confidence : float, 最大的softmax概率 probs torch.softmax(torch.tensor(logits), dim-1).numpy() top1_idx int(probs.argmax()) top1_conf float(probs.max()) if top1_conf threshold: return None, top1_conf return top1_idx, top1_conf这个代码直接把模型输出转成带拒选结果的判断后端装置接到None时可以发告警给值班员而不是自动去跳闸。阈值的选取可以基于验证集上的分布曲线保证拒选率不超过10%的前提下阈值设得越高越保守现场有人值守的变电站阈值可以设到0.7以上无人站可以放宽到0.5具体的数值取决于自动化程度和停电成本。5. 模型落地时的边界条件与调优技巧5.1 从仿真到现场最先失效的往往是样本分布仿真样本里母线电压严格正弦、故障瞬间干净利落现场录波数据则夹杂着负荷投切、谐波源和电压互感器铁磁谐振带来的干扰。直接把仿真数据训练出的模型拿到现场测试准确率可能从95%掉到60%以下。常见应对方案是把仿真数据和现场录波数据混合训练现场数据不用太多20到50条有效故障样本就能对迁移效果产生明显帮助。5.2 多时段特征融合的选线技巧S变换对整个时间窗做平均会丢掉暂态早期的重要信息。故障发生后前5ms内高频分量最丰富、故障线路特征最突出故障后20ms到80ms高频衰减后主要依靠功率频率附近的残流差异。常见做法是分别用两个时间窗计算S变换相关度矩阵一个取故障后5ms另一个取故障后60ms把两个矩阵作为两个通道一起喂给模型。这种多时段融合结构比我用单个宽窗的效果明显稳定特别是高阻接地场景下短窗口能保留故障特征长窗口能提供稳态对比。5.3 对新配电网的快速迁移当模型要适配一条网络拓扑完全不同的馈线时不需要重新做整套仿真。把已有模型的全连接层换成随机初始化的新层冻结卷积层用目标网络少量标注样本只训练最后两层学习率降到1e-5通常几十轮迭代就能收敛。这种迁移学习方式能让一个已经训练好的选线模型在新配电网里迅速达到可用的置信度并且为后续补充仿真样本争取时间。冷启动时不要直接拿新网络的数据去微调全部参数样本量太小时底层特征会被噪声淹没。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进