☰
基于S变换相关度与深度学习的单相接地故障选线方法解析
2026/9/30 9:26:52 网站建设 项目流程

简介:一份针对配电网单相接地故障选线难题的学术论文PDF,适配电力系统科研人员、配电网运维工程师及相关专业研究生阅读参考。该论文刊于《电力自动化设备》,提出将S变换相关度图形(SCF)与含SCF层的卷积神经网络(S-CNN)相结合的新思路,先利用S变换提取零序电流时频信息,再构建图形化特征,经Simulink仿真与实际故障数据训练测试,在强噪声、不同故障位置/相角/过渡电阻等条件下均能保持较高选线正确率和鲁棒性。资源为单文件PDF格式,共1个文件,压缩包大小3.76MB,内容包含论文全文、图表、公式及参考文献,便于直接阅读或打印归档。已有146人浏览学习,适合需要深入掌握深度学习在配电网故障诊断中应用方法的读者,可作为论文写作、课题研究或算法复现的技术参考。

1. 单相接地选线难在哪:这个方案为什么把宝押在S变换和深度学习上

做过配电网故障选线的人都有同感:单相接地占了配电网故障的七八成,但选线装置却常年被吐槽"乱选、漏选、不敢信"。故障电流小,零序电压又受消弧线圈补偿影响,传统稳态分量法、五次谐波法、零序有功方向法都有各自失效的场景。这套基于S变换相关度和深度学习的单相接地故障选线新方法,核心思路不是再去抠某个单一特征量,而是把各线路零序电流的时频特征完整捞出来,算线路之间的相关度矩阵,交给深度学习去学"哪条线是另类"。对做配网自动化、故障录波、选线装置研发的工程师来说,这是一个值得复现和改造的技术方向,我下面把原理、实现、参数和踩坑一次性讲透。

2. 先把S变换讲透:时频矩阵怎么算出来、为什么比小波更适合暂态零序电流

2.1 S变换公式拆解:高斯窗随频率自动伸缩,相位还是绝对的

S变换可以理解成短时傅里叶变换(STFT)的升级版,它的核心特点是窗宽随频率自动变化。STFT的窗是固定宽度,低频和高频用同一个窗,要么保时间分辨率、要么保频率分辨率,两头只能顾一头。S变换的高斯窗标准差是1/|f|,低频处窗宽、频率分辨率高;高频处窗窄、时间分辨率高。对于单相接地这种非平稳暂态信号,这个特性正好合适:暂态主频附近的细节要看清,起始时刻也要卡准。

S变换的时域定义是:

S(τ,f) = ∫ x(t) · [|f| / √(2π)] · e^[-(τ-t)²f²/2] · e^(-j2πft) dt

更常用的是频域等价形式,离散化之后实现起来很直接:

S(j,n) = Σ_{k=0}^{N-1} X(k+j) · e^(-2π²k²/j²) · e^(j2πkn/N)

其中X是信号的FFT结果。比小波变换强的一点在于:小波变换得到的是相对相位,S变换保留的是绝对相位信息。选线判据里方向判断依赖相位关系,这个区别在实际工程中会影响特征构造的复杂度。S变换还有一个好处是可逆,意味着从矩阵里提取特征后还能反变换回时间域去做信号校验,调试时比小波方便很多。

2.2 用FFT实现离散S变换:教学版代码与边界条件

常见的Python实现里没有像短时傅里叶那么统一的库封装,自己用NumPy写一个教学版并不难。下面这个版本按离散定义实现,只算正频率部分,适合先跑通流程。

import numpy as np def discrete_st(signal, fs): """ 离散S变换(教学版) 输入: signal: 一维零序电流波形 fs: 采样率 Hz 输出: s_mat: 复矩阵,行索引对应频率,列对应时间 """ n = len(signal) xf = np.fft.fft(signal) half = n // 2 s_mat = np.zeros((half, n), dtype=complex) for j in range(1, half): # 频谱左移 j 个索引:X[k+j] 放到位置 k x_shift = np.concatenate([xf[j:], xf[:j]]) # 高斯窗,宽度随 j 自动伸缩 gauss = np.exp(-2 * np.pi ** 2 * np.arange(n) ** 2 / j ** 2) s_mat[j, :] = np.fft.ifft(x_shift * gauss) s_mat[0, :] = np.mean(signal) # 0 Hz 用均值近似 return s_mat

代码逻辑拆开看:FFT得到频域序列X后,对每个离散频率索引j,把X循环左移j位,让频率j落到第0位,然后乘上高斯窗,再做IFFT。高斯窗的分母是j²,频率索引越高窗越窄,这就是"自适应分辨率"的来源。参数上要注意:j乘以fs/n才是实际频率,比如n=1000、fs=10kHz时,j=100对应1000Hz,频率分辨率正好是10Hz。j=0的频点直接用时间均值填充,不参与后续特征计算。

这个版本跑通没问题,但有两个边界要心里有数。第一,循环移位把尾部和头部接在一起,会造成首尾边界效应,分析长波形时建议把信号加窗或只取中间段;第二,j接近n/2时高斯窗过于尖锐,数值上容易出NaN或Inf,特征频带一般取在采样率的1/4以内,不要全频带使用。

2.3 从S变换矩阵里挑特征频带:暂态主频不是固定值

S变换拿到的是二维复矩阵,接下来怎么用是经验活。单相接地暂态零序电流的能量集中在主频附近,但主频会随系统对地电容、线路拓扑、故障点位置变化,几百赫兹到几千赫兹都可能出现。硬编码一个固定频带,换一个变电站就可能失效。

更稳的做法是先用S变换扫一遍正常短路仿真波形,找能量峰值所在频率,再圈定特征频带。宽带宽的同时把低频工频分量剔掉,因为工频段受消弧线圈影响最大,暂态高频段才是故障线与非故障线差异最明显的地方。实际处理时,我会把频带上限压在采样率的八分之一到四分之一之间,避开S变换高频区的数值不稳定区。

3. 构造相关度特征:把"方向相反、波形不相似"变成数字

3.1 零序电流的方向规律:故障线路为什么是"另类"

先回顾选线的物理基础。中性点不接地系统发生单相接地时,故障线路的零序电流等于全系统非故障线路对地电容电流之和,方向从线路流向母线;非故障线路的零序电流等于本线路对地电容电流,方向从母线流向线路。所以故障线路与非故障线路零序电流极性相反,而且幅值通常比单条健全线路大得多。

经消弧线圈接地系统会打破这个稳态规律:消弧线圈的电感电流补偿了故障点容性电流,稳态零序电流很小,方向和幅值关系都不再可靠。但高频暂态分量不一样,消弧线圈对高频呈现高阻抗,暂态电流的分布仍然主要走电容路径,故障线路与健全线路的方向相反关系在暂态段依然成立。这也是整个方法要用S变换去抓暂态的原因——S变换天然适合从短时暂态里提取分频特征,再拿这些特征做线路间比较。

3.2 相关度矩阵怎么算:从S变换谱提取特征向量

选线的判据本质是"谁跟谁不一样"。健全线路之间的零序电流波形相似,故障线路与健全线路之间波形差异大、极性还可能相反。把这种关系量化成相关度矩阵,就是给深度学习准备的标准输入。

常见做法分三步:第一步,对每条线路的零序电流做S变换,得到幅值矩阵;第二步,在选定频带内做时间平均,把每个频率点的幅值压成一个特征向量;第三步,计算线路两两之间的皮尔逊相关系数,得到N×N的对称矩阵。皮尔逊相关度对幅值尺度不敏感,这既是优点也是坑——故障线路幅值更大的信息被归一化丢掉了,所以后面我会在模型输入里再加一个幅值比通道把这个信息补回来。

def build_corr_matrix(s_list, fs, f_low, f_high): """ 从多条线路的S变换矩阵构造相关度特征 输入: s_list: 列表,每个元素是一条线路的S变换复矩阵 fs: 采样率 f_low, f_high: 特征频带范围 返回: corr_matrix: N×N 皮尔逊相关度矩阵 energy_vec: 各线路在特征频带内的平均幅值(用于后续拼接) """ n_lines = len(s_list) freqs = np.fft.fftfreq(s_list[0].shape[1], 1/fs)[:s_list[0].shape[0]] idx = np.where((freqs >= f_low) & (freqs <= f_high))[0] feat_vecs, energy_vec = [], [] for s_mat in s_list: amp = np.abs(s_mat[idx, :]) # 频带内幅值矩阵 energy = np.sqrt(np.mean(amp ** 2, axis=1)) # 按时间平均 feat_vecs.append(energy) energy_vec.append(np.sqrt(np.mean(amp ** 2))) # 整带能量 feat_mat = np.array(feat_vecs) # (N, F) corr_matrix = np.corrcoef(feat_mat) # (N, N) return corr_matrix, np.array(energy_vec)

参数说明:f_low、f_high是特征频带的下限和上限,单位Hz,一般从暂态主频附近开始圈,同时把工频50Hz及其谐波尽量排除。fs必须跟S变换矩阵构建时保持一致,否则频率索引计算全错。energy_vec返回的是每条线路在频带内的总能量,这个向量不会进入相关度矩阵,但会在深度学习输入阶段作为第二通道拼进去,弥补相关度丢失幅值信息的问题。

相关度矩阵的对角线永远是1,矩阵对称。故障线路对应的行和列与其它线路之间的相关度明显偏低,健全线路之间则普遍偏高。注意低压电缆线路自身对地电容大、线路长度差异悬殊时,健全线路之间相关性也会离散化,不能指望设定一个固定阈值做判断,这就是后面必须上深度学习的原因。

3.3 仿真数据从哪里来:PSCAD/ATP生成样本的常用参数

训练深度学习模型需要大量带标签的故障样本,现场录波一年可能都攒不齐几百条,主流做法是用电磁暂态仿真软件批量生成。我用PSCAD和ATP都会生成一套,主要参数如下表:

参数项常用取值范围说明
系统电压等级10kV / 35kV决定零序电流幅值量级
中性点方式不接地 / 经消弧线圈消弧线圈按过补偿10%左右
馈线数6~12条混合架空、电缆线路
故障位置线路长度10%~90%按10%步长扫
故障角0°~360°重点关注0°和90°附近
过渡电阻0 / 10 / 50 / 100 / 500 / 1000Ω高阻接地必须包含
采样率10kHz / 20kHz与现场录波装置一致
仿真时窗故障前0.2s + 故障后0.3s保证暂态完整落入窗口

每组参数组合生成一个case,每个case在故障前后的零序电流波形上做定长滑窗切分,形成多个样本。这样训练集能到数万级,覆盖不同故障角、过渡电阻、故障位置和运行方式。生成的时候有个原则:故障角的0°和90°附近要加密采样,因为电压过零附近接地时暂态分量小,是最难选线的工况。

4. 深度学习选线模型:输入相关度矩阵,用CNN输出线路概率

4.1 用PyTorch搭一个相关度矩阵分类器

深度学习在这一步的角色是"模式识别器"。相关度矩阵天然是二维结构,矩阵里哪一行和哪一行明显不相关,这个模式用CNN来学比手工阈值靠谱得多。模型输入是单通道的N×N矩阵,输出是每条线路的故障概率。

import torch import torch.nn as nn class CorrelationCNN(nn.Module): """ 输入: 相关度矩阵 (batch, 1, N, N) 输出: 各线路故障概率 (batch, N) """ def __init__(self, n_lines): super().__init__() self.conv = nn.Sequential( nn.Conv2d(1, 16, kernel_size=3, padding=1), nn.BatchNorm2d(16), nn.ReLU(), nn.Conv2d(16, 32, kernel_size=3, padding=1), nn.BatchNorm2d(32), nn.ReLU(), nn.AdaptiveAvgPool2d((1, 1)) # 全局平均池化,兼容不同N ) self.fc = nn.Sequential( nn.Linear(32, 64), nn.ReLU(), nn.Dropout(0.3), nn.Linear(64, n_lines) ) def forward(self, x): feat = self.conv(x) # (B, 32, 1, 1) feat = feat.flatten(1) # (B, 32) logits = self.fc(feat) # (B, N) return torch.softmax(logits, dim=1)

这个模型的容量很小,参数量集中在最后的全连接层上,因为相关度矩阵本身就信息密度高,不需要大网络硬堆。卷积核用3×3、两层卷积已经够用,加大网络反而容易在中等规模训练集上过拟合。AdaptiveAvgPool2d使模型能接受不同馈线数N的输入,这是现场刚性需求——同一个变电站的某条馈线可能检修退出,N会变化。Dropout放在全连接层前面,概率取0.3就是防止把训练集里特定线路编号的噪声记进去。

PyTorch环境配置属于常规操作,CPU版完全带得动这个网络,因为矩阵尺寸最大也就几十乘几十。真正吃资源的是仿真数据生成阶段,那一步在PSCAD/ATP里做,不占用模型训练显存。

4.2 训练数据组织与增强:故障角、过渡电阻、中性点方式

数据组织比模型结构更影响最终效果。训练集、验证集、测试集必须按case划分,而不是按样本随机划分。同一个故障case滑窗切出来的几十个样本,特征高度相关,如果同时落入训练集和测试集,测试指标会被虚高到没有参考价值。按case划分的意思是:整个case的所有窗口要么全进训练,要么全进测试。

数据增强方面,仿真数据不能像图像那样随便翻转旋转。我做三件事:一是给零序电流波形加高斯白噪声,信噪比控制在20dB到40dB之间,模拟现场互感器的测量噪声;二是对整段波形做微小的时间平移,平移量不超过半个工频周期,打破滑窗的固定对齐;三是在相关度矩阵上做极小的元素扰动,防止模型死记矩阵数值。频带内的能量归一化不要做,前面已经讨论过,幅值信息在后面会单独用。

训练时类别不需要加权,因为仿真数据每条线路的故障样本是均衡生成的。但真实录波数据微调阶段一定要做类权重,否则模型会偏向样本多的线路。优化器用Adam,学习率1e-3,批大小32,训练最多100个epoch,配合早停。验证指标不要只看准确率,单相接地选线场景下健全线路被误判的代价远大于故障线路漏判,需要单独看误选率。

4.3 损失函数与评价指标:准确率之外还要看什么

损失函数常规用交叉熵,但如果真实数据阶段类别不平衡明显,换Focal Loss能压低易分样本的梯度贡献,让模型更聚焦在难分的场景上。Focal Loss的调制因子γ取2,α按故障线路数的倒数设置,这是我在真实数据微调阶段验证过有效的一组参数。

评价指标按配网选线惯例,至少看四个:选线准确率(正确选出故障线路的样本占比)、误选率(选到健全线路的占比)、拒动率(模型所有概率都低于阈值无法判定)、以及按故障工况切分的分项准确率。最后一个指标最容易被人忽略,但5.4节里那个"仿真好、现场翻车"的坑,恰恰要靠分项指标才能早发现。后续5.4会展开说。

5. 现场踩坑记录:采样率、消弧线圈、数据失衡、仿真到现场迁移

5.1 录波装置采样率不够,S变换高频段直接失真

现象:仿真数据上准确率96%,拿到现场故障录波数据一测,掉到70%,而且误选集中在电缆线路占比高的变电站。

原因:配电网故障暂态零序电流的主频往往在几百到三千赫兹之间,按香农定理至少需要双倍采样率。很多现场录波装置采样率只有2.5kHz或5kHz,采集到的暂态高频分量被混叠折叠到低频段,S变换算出来的高频幅值根本不是真实值。更隐蔽的是,有些装置默认只录50Hz的稳态波形,暂态段被前置滤波器直接削掉了。

解决:先查装置采样率,再决定特征频带。采样率偏低时,特征频带上限压缩到采样率的八分之一以内,宁可损失高频信息,也不要用混叠后的垃圾数据。如果现场装置确实录不到暂态,那就提高录波启动灵敏度,把触发条件从零序电压10%降到5%相电压,让暂态段完整包含在录波数据里。

5.2 消弧线圈把稳态特征补没了,方向判据失效

现象:同一个模型在不接地系统测试正常,投运到经消弧线圈接地的变电站后,故障线路概率长时间处于模糊状态,甚至把健全线路排到前面。

原因:消弧线圈过补偿后,故障线路的稳态零序电流方向可能发生反转,不再满足"故障线反方向、健全线同方向"的经典规律。如果在做S变换时把特征频带覆盖到工频段,等于把被补偿污染的稳态特征也当成了有效信息,方向判据自然失效。

解决:特征频带上限从基频往上涨,下限至少提到150Hz以上,实际我常用300Hz到2000Hz。高频暂态分量受消弧线圈影响很小,故障线路与健全线路的反相关系在暂态段仍然存在。另外,在训练数据里把消弧线圈的补偿度从欠补偿到过补偿都扫一遍,让模型学会自动忽略补偿度相关的稳态差异,而不是依赖某一个固定方向关系。

5.3 故障样本百年一遇,训练集严重失衡

现象:真实故障录波一年攒下来只有十几个case,健全线路的日常零序波形倒是有几万条,模型训练出来几乎输出恒定概率,永远指向样本最多的那条线。

原因:现场数据分布里,健全样本占绝对多数,交叉熵损失下模型靠"全部判健全"就能把损失压得很低。这不是模型笨,是损失函数在失衡数据下的正常行为。

解决:把仿真数据作为主力训练集,保证故障类别均衡;现场数据只有在做微调和最终测试时才拿进来。微调阶段用Focal Loss抑制易分样本,或者每条线路乘一个与样本数成反比的权重。还有一招:训练完看验证集的混淆矩阵,如果某条线的召回率明显低于其它线,先查是不是这个case在按场景划分时不小心全落进了训练集,数据泄漏比类别不均衡更常见也更伤。

5.4 仿真模型再精细,现场也开始翻车:域偏移问题

现象:PSCAD仿真测试集准确率97%,现场回放只有85%,且误差集中在某一两条电缆馈线上。仿真里加入各种扰动也无济于事。

原因:仿真模型永远简化了现实。电缆实际对地电容与型号手册存在偏差,互感器角度误差导致零序电流相位偏移,线路三相不平衡使健全线路之间本来就有天然的相关度差异。这些因素叠加起来,训练集和现场数据分布出现系统性偏移。

解决:两件事。第一,仿真阶段给每条线路的对地电容加正负15%随机扰动,互感器相位误差按正负2度叠加,把域差异提前压进训练集。第二,模型输出概率而不是硬标签,概率低于设定阈值(我习惯0.7)就认定为"无法判定",直接报警提示人工复核,而不是硬选一条线。允许模型承认自己不确定,比硬着头皮乱选在工程上更被认可。

6. 落地验证技巧:离线回放先行,混淆矩阵分场景看短板

模型训练完别急着进装置。我习惯的流程是:先拿现场历史录波文件做离线回放,把COMTRADE格式的零序电流数据喂给模型,输出选线概率随时间的曲线,逐条比对人工判定的结果。这一步能暴露训练数据里没有的真实干扰形态,比如负荷切换、电容器投切的暂态扰动。

验证阶段最有价值的工具是把混淆矩阵按故障场景切片。不切片只有一个总的准确率,切片后你会发现:电压过零点附近接地时准确率明显掉下来,因为暂态能量本来就小;过渡电阻高于500Ω时模型开始犹豫;不接地系统表现优于消弧线圈系统。知道短板在哪,才能决定是补数据还是调阈值。

一个高性价比的模型改进是把相关度矩阵和幅值比向量拼成双通道输入,幅值比通道保留"故障线路幅值更大"这个关键物理特征,避免相关度归一化把信息丢掉。通道1用相关度矩阵,通道2用每条线路频带内能量占最大能量比例组成的N×1列向量复制成N×N铺满,两个通道一起进卷积网络。

我最后说一个自己的习惯:任何选线模型上线前,必须跑满2000个仿真case、50个现场case且全部人工复核过才能投运;模型输出概率低于0.7时宁可弃选,也不让现场运维被一个错误结果带偏方向。这套流程走下来,至少能保证模型在下一次升级之前不犯大错。做选线这个场景,少误导一次比多选对一次重要得多,这个认知是我在项目里反复踩坑换来的。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询