简介:这份资源是一篇关于基于概率神经网络(PNN)的串联电弧故障检测技术PDF论文,面向电气工程、深度学习及故障诊断方向的研究人员和学生。文章针对传统傅里叶变换忽略时域信息、BP神经网络收敛慢且易陷入局部最小值等问题,提出以小波变换提取电流波形特征值,输入PNN模型进行故障半周期数判定,从而实现对串联电弧故障的准确识别。PDF全文共1个文件,大小约1.45MB,内容包含概率神经网络理论、实验数据与测试结果,结构清晰,适合作为电气安全检测与神经网络应用方向的参考。目前已有153人学习该资源,对想了解电弧故障检测前沿方法、PNN建模流程及小波特征提取应用的读者具有较好的参考价值。
1. 串联电弧故障检测的难点在于“看不见”,概率神经网络解决的是“怎么认出来”
串联电弧和并联电弧的区别很多人一开始就搞反。并联电弧是绝缘击穿后形成的大电流弧光,过流保护和剩余电流保护都能动作,危害来得快也暴露得快;而串联电弧发生在回路中的接触不良点,比如接线端子松动、线芯断裂却还贴着一点,电弧和负载串联,故障电流被负载压住,幅值上根本触发不了断路器的过流阈值。它真正危险的地方是持续放电产生局部高温,隔着外壳看不到,等发现时常是已经引燃了周围可燃物。检测这类故障的问题是信号太弱、特征太杂,而概率神经网络(PNN)这种训练成本低、判决依据清晰的分类器,正好适合在这种“样本不多、特征维度不高、但必须快速迭代”的故障诊断任务里落地。下面按“特征—模型—实现—验证—部署”的顺序把整条链路打通。
2. 概率神经网络的判定逻辑:从电弧波形到贝叶斯后验
2.1 串联电弧的电气特征:零休、宽频噪声与随机性
做串联电弧故障检测,第一步不是选模型,而是想清楚到底从电流波形里看什么。串联电弧在电流过零附近最容易熄灭,也最容易重燃,所以电流波形在过零处会出现一个明显的“零休”时段,也就是电流贴着零轴停留的时间比正常正弦波更长。纯阻性负载时这个特征非常清楚;但换成开关电源、调光灯这类非线性负载,波形本来就存在畸变和谐波,零休现象天然就有,单靠这一条做判据,误报率会高到没法用。
第二个可用的特征是宽频噪声。电弧本质上是一个随机放电过程,每次放电都向线路注入宽频的脉冲电流,频谱能量集中在几十kHz到数MHz区间。这个频段在家用电器的正常电流里很少出现,所以通过对采样电流做带通滤波然后计算包络能量,得到的“高频带能量”指标对负载类型不敏感,是区分串联电弧和正常非线性负载的核心依据。
第三个特征是随机性。电弧的起弧、熄灭、重燃和触点的微观状态强相关,相位和幅值都在漂移。于是相邻工频周波之间,波形相似度明显下降。把连续几个周波做互相关,正常负载的相关性通常很稳定,而电弧存在时相关系数波动大。这三个特征组合起来,就构成了一条完整的证据链:零休说明弧隙在低压区徘徊,高频能量说明存在电离放电,低重复性说明放电过程不稳定。三者同时出现时,判定串联电弧的把握就很大了。
2.2 PNN 的四层结构与贝叶斯判别
概率神经网络结构上非常直观,从输入到输出一共四层:输入层原样接收特征向量;模式层每个神经元对应一个训练样本,输出该样本与当前输入的高斯距离;求和层把同一个类别下的模式层输出取平均;输出层把每类的平均响应做归一化,当作该类别的后验概率,最后选取最大值对应的类别作为判决结果。
数学视角更本质:PNN 是在用 Parzen 窗方法估计每个类别的概率密度函数。设某类c下共有n个样本,特征维数是D,那么当前特征向量x属于类别c的概率密度估计值是
f_c(x) = 1 / ( n * (2π)^(D/2) * σ^D ) * Σ_i exp( -||x - c_i||² / (2σ²) )分子上的累加项就是高斯核展开。等式里唯一需要人工设置的参数是平滑因子σ,也有人叫 spread。σ决定高斯核的“宽度”:σ过小,分类器只认训练样本,泛化能力差;σ过大,概率密度被抹平,不同类别的差异被抹掉。下表把这四层各自的角色列出来,便于对照后面的代码实现。
| 层名称 | 每个神经元的输入 | 输出计算 | 权重来源 |
|---|---|---|---|
| 输入层 | 归一化特征向量 | 原样透传 | 无 |
| 模式层 | 特征向量 x | exp(-‖x - c_i‖² / 2σ²) | 训练样本 c_i |
| 求和层 | 某类所有模式层输出 | 求平均 | 类别标签 |
| 输出层 | 各类求和层输出 | 最大化概率 | 无 |
2.3 为什么是 PNN,而不是 BP 网络或 SVM
电弧检测项目里常见的坑,是一上来就上卷积神经网络或者 LSTM,但如果只有几千个带标注的样本,数据量撑不起深度模型。BP 网络需要反复迭代调权重,对学习率、初始化敏感,还容易陷进局部最优里;SVM 在核函数选择上比较讲究,而且在线增量更新时要重新求解对偶问题,代价偏高。
PNN 的训练过程基本没有“学习”可言,它只是把训练样本原封不动地存成模式层的中心,不需要反向传播,也不存在迭代收敛问题。新增一条样本,直接往模式层里追加一个神经元就可以,这在需要现场补充数据、抑制新负载误报的场景里非常方便。代价是推理时要逐样本算距离,训练集太大后计算量会线性上涨。因此工程上通常会把这条链路设计成:滤波器做特征提取、PCA降维、再用聚类将模式层中心压缩到几百个以内。这个权衡后面第 6 章会展开讲。
3. 特征工程:把电流波形变成一张能训练的向量表
3.1 先定采样率,再定特征参数
串联电弧的高频成分上限通常在数 MHz 级别,但工程上普遍选择 1 MHz 采样率做录波,兼顾高频频段覆盖和存储开销。如果硬件条件受限,200 kHz 也能跑通,只是 200 kHz 以上频带的信息拿不到。无论采样率多少,特征提取都必须在整工频周期上做,50 Hz 系统就是 20 ms 一个窗口,60 Hz 系统则按 16.67 ms 切分。半周期特征会丢失燃弧和熄灭的完整过程,不建议采用。
常用的特征参数表如下,这些特征计算量都很小,适合在 MCU 上周期执行。
| 特征名 | 计算公式 | 区分度 | 负载敏感性 |
|---|---|---|---|
| 零休时间比 | 半波内 |i(t)| < 0.1·I_pk 的时长占比 | 中 | 敏感 |
| 电流峰值因子 | I_pk / I_rms | 低 | 敏感 |
| 高频带能量 | 20~200 kHz 带通滤波后 RMS 值 | 高 | 不敏感 |
| 周波重复系数 | 连续两个工频波形的 Pearson 相关系数 | 高 | 低 |
| 零休后脉冲个数 | 零休结束后 2 ms 内高频包络过阈值次数 | 高 | 中 |
需要注意最后一行参考文献里经常出现“零休后脉冲计数”这个指标,它刻画的是重燃瞬间的高频冲击强度。捕获这个现象需要在零休结束的位置开一个短时窗,再做阈值比较。
3.2 用 Python 提取特征的最小实现
下面这段代码以一段双周波电流数组seg为输入,输出上述特征向量。采样率按 1 MHz 设计,提取过程注意把带通滤波和高频包络解耦开,便于在线部署时对每个特征单独验证。
import numpy as np from scipy.signal import butter, filtfilt def extract_arc_features(seg, fs=1_000_000): # seg: 连续两个工频周期(40ms@50Hz)电流采样,形状为 (int(fs*0.04),) n = len(seg) half = n // 2 cycle1 = seg[:half] cycle2 = seg[half:] i_pk = max(np.max(np.abs(cycle1)), np.max(np.abs(cycle2))) i_rms = np.sqrt(np.mean(seg**2)) # 特征1: 零休时间比,阈值为10%峰值电流 thr = 0.1 * i_pk zero_time_ratio = np.mean(np.abs(seg) < thr) # 特征2: 峰值因子 crest_factor = i_pk / (i_rms + 1e-9) # 特征3: 高频带能量,通带20kHz~200kHz low = 20_000.0 / (fs / 2) high = 200_000.0 / (fs / 2) b, a = butter(4, [low, high], btype='bandpass') hf_sig = filtfilt(b, a, seg) hf_energy = np.sqrt(np.mean(hf_sig**2)) # 特征4: 周波重复性,两个周期做相关系数 c1 = cycle1 - np.mean(cycle1) c2 = cycle2 - np.mean(cycle2) repeatability = np.sum(c1 * c2) / (np.linalg.norm(c1) * np.linalg.norm(c2) + 1e-9) # 特征5: 零休结束后的高频脉冲个数,包络阈值取3倍高频均方根 env = np.abs(hf_sig) thr_env = 3.0 * np.sqrt(np.mean(hf_sig**2)) zero_idx = np.abs(seg) < thr pulses = 0 for i in range(1, len(zero_idx) - 1): # 统计零休结束沿,并在其后2ms窗口内检测高频包络尖峰 if zero_idx[i-1] and not zero_idx[i]: win = env[i:i+int(fs*0.002)] pulses += int(np.sum(win > thr_env)) return np.array([zero_time_ratio, crest_factor, hf_energy, repeatability, pulses])这段代码里,butter的参数fs是按 1 MHz 采样率折算到 0~1 的归一化频率,带通上下限分别对应 20 kHz 与 200 kHz,最高端避开了采样率一半的奈奎斯特边界。filtfilt做零相位滤波,比lfilter多一次反向处理,防止相位偏移破坏时域对齐。零休后的脉冲搜索是从零休结束的上升沿出发,检查其后 2 ms 窗口内的高频包络是否越过 3 倍均方根阈值,能捕捉重燃瞬间的击穿冲击。注意每个特征的值域差异很大,训练 PNN 前必须做标准化,否则距离计算会被幅值大的特征主导。
3.3 特征质量检查与降维
拿到特征后先别急着训练。我一般会把正常负载和电弧故障两类的特征矩阵分别拿出来,用均值±标准差的方式逐个特征可视化,看两类分布的重叠程度。零休时间比在非线性负载上和故障样本几乎没有区分度,此时就需要把它降权或去掉。更系统化的方法是直接用 PCA 降到 2 维画出散点图,观察两类样本是否大致分开,如果混成一团,回到原始录波数据检查滤波参数和特征计算的边界条件。
常见的问题出在窗函数:切周波窗时不要在采样点序号上硬切,应该用过零检测定位每个周波的起始点,否则相位偏移会让相邻周波的对齐误差累加,重复性指标会系统性失真。
4. 手写一个概率神经网络分类器:训练零迭代,调参只剩一个 sigma
4.1 用 NumPy 实现 PNN 的矩阵化推理
PNN 的实现难点不是网络本身,而是怎么把模式层距离计算写快。在不借助深度学习框架的情况下,把训练集当成矩阵,输入向量与全部中心计算欧氏距离并指数化,可以用广播和矩阵运算一次性完成。下面给出一个可以直接放进项目的 PNN 类,也定义了和 scikit-learn 兼容的接口,方便接进GridSearchCV或cross_val_score。
import numpy as np class PNNClassifier: def __init__(self, sigma=0.1): self.sigma = sigma self.centers = None # 模式层中心矩阵,(n_samples, n_features) self.y = None # 每个中心的类别标签 self.classes_ = None # 去重后的类别列表 def fit(self, X, y): # PNN的"训练"就是存样本: 模式层神经元直接使用训练样本 self.centers = np.asarray(X, dtype=np.float64) self.y = np.asarray(y) self.classes_ = np.unique(self.y) return self def _activate(self, x): # x: (n_features,) -> 返回与该类别所有中心的核激活值 diff = self.centers - x # (n_samples, n_features) sq_dist = np.sum(diff ** 2, axis=1) # (n_samples,) return np.exp(-sq_dist / (2 * self.sigma ** 2)) def predict(self, X): X = np.asarray(X, dtype=np.float64) preds = [] for x in X: acts = self._activate(x) class_scores = [] for cls in self.classes_: mask = (self.y == cls) # 平均而不是求和,避免样本数多的类别天然得分高 class_scores.append(np.mean(acts[mask])) preds.append(self.classes_[int(np.argmax(class_scores))]) return np.array(preds)fit中把传入的X直接复制为centers,没有迭代训练,也没有可学习权重。预测阶段的_activate用向量化距离计算替代 for 循环逐样本求距离,在 Python 层面只循环测试样本,训练集规模在几千量级时性能可以接受。求和层用np.mean而不是np.sum,这对于样本量不平衡的数据集非常重要,否则样本数多的类别在求和层天然占优。如果只做二分类,还可以修改predict让它返回概率值,便于后面做 ROC 曲线分析。
4.2 唯一的超参数 sigma,怎么用交叉验证搜索
σ 选多大,直接影响边界的平滑程度。经验上先对特征做标准归一化,让每个特征均值为 0、方差为 1,然后 σ 的合理搜索区间是 0.01 到 1.0,按对数刻度取网格。推荐的手法是五折交叉验证,把准确率均值最高的那组值固定下来。下面的代码直接在 sklearn 框架里完成。
from sklearn.model_selection import GridSearchCV, StratifiedKFold from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline pipe = Pipeline([ ('scaler', StandardScaler()), ('pnn', PNNClassifier()) ]) param_grid = {'pnn__sigma': np.logspace(-2, 0, 20)} cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) grid = GridSearchCV(pipe, param_grid, cv=cv, scoring='accuracy') grid.fit(X_train, y_train) print('best sigma:', grid.best_params_['pnn__sigma'])StandardScaler放在管道里,确保每一折交叉验证的均值和标准差只从训练折上计算,避免数据泄漏。σ 从 0.01 到 1.0 取 20 个点做对数均匀分布,如果最优值落在边界上,就扩大搜索范围重跑。若训练折数少,还可以加上scoring='f1'从漏报角度筛选。
4.3 训练集规模与类别不平衡的工程处理
PNN 的模式层数量等于训练集样本数。1000 条样本、8 维特征时,单次预测要做 1000 次欧氏距离计算,在工控机上微秒级完成,没有问题。但当样本集扩张到数万条,预测延迟开始显现。此时常用两种压缩方式:一是用 KMeans 对每个类别的样本分别聚类,用聚类中心替换原始样本作为模式层神经元;二是先用随机森林的特征重要性筛选特征,把维度降到 6 维以内,再重新训练 PNN,推理时间的下降非常明显。
类别不平衡问题在电弧检测中很常见:正常运行时间远大于故障时间,采样后正常样本可能是故障样本的十倍。除了求和层用平均之外,更稳妥的做法是对故障样本做重采样,或者在交叉验证里增加类别权重的评估指标。
5. 在 Simulink 中仿真串联电弧,跑通“数据采集—特征提取—PNN 判决”闭环
5.1 用 Mayr 模型搭串联电弧负载回路
做算法验证,最理想的办法是拿实测录波数据。没有实测条件时,仿真电弧是快速迭代的可行替代。常见做法是在 Simulink 中搭单相交流回路,电源通过线路阻抗串联一个电弧模型再接到负载。电弧模型选 Mayr 模型,因为串联电弧电流相对小,Mayr 在电流过零附近的表现比 Cassie 模型更接近真实电弧物理过程。
Mayr 模型的状态方程用离散时间形式描述,可以在 MATLAB Function 模块里写成如下形式,然后配合一个单位延迟模块打断代数环:
function g = mayr_step(u_arc, i_arc, tau, P, dt, g_prev) % 输入: % u_arc: 电弧电压(V), i_arc: 电弧电流(A) % tau: 时间常数(s), P: 散热功率(W) % g_prev: 上一时刻电导(S) % 输出: % g: 当前时刻电弧电导(S) dg = (g_prev / tau) * (u_arc * i_arc / P - 1); g = max(g_prev + dg * dt, 1e-6); end这个模块的物理意义是:当电弧瞬时功率u_arc * i_arc大于散热功率 P 时,电导增大,弧道变强;反之电导衰减,趋向熄灭。g_prev / tau * (...)的形式源自 Mayr 方程推导,max(g, 1e-6)是防止电导变成负值导致仿真发散。整个回路的收敛取决于dt的选取,建议仿真步长设为 0.1 μs,与 1 MHz 采样率匹配。用受控电压源承载电弧电压,电流测量模块把 i_arc 反馈给电弧函数,再用 1/z 延迟打断环路,就能稳定仿真。
5.2 批量生成训练样本:组合负载与故障相位
仿真平台搭好后,下一步是生成足够多的训练样本。标准方法是把负载分成三组:纯阻性负载(电热炉、白炽灯)、感性负载(异步电机带载)、非线性负载(开关电源、调光灯),每组分别在正常和串联电弧两种状态下记录电流波形。故障注入的时机也要错开:电弧随机出现在工频相位的 30°、60°、90°、120° 等多个位置,燃弧持续时间和重燃强度通过调整 Mayr 模型的tau和P来覆盖不同的放电强度区间。
把仿真输出保存成 CSV 后,用前面第 3 章的extract_arc_features函数把每条电流记录转成特征向量,再打上标签。数据划分时注意不要按样本随机切分,而是按“负载类型”分组切分。比如训练集只包含阻性和感性负载,测试集放非线性负载,检验模型在新负载类型上的泛化能力。很多论文里 99% 的准确率就是这么缺了含金量,同类负载的数据混在一起,特征分布重叠度太高。
5.3 评估指标不能只看准确率:用混淆矩阵和漏报率说话
串联电弧检测是典型的宁可少报不可乱报的场景吗?实际倒过来。漏报意味着放任电弧持续发热,可能引发火灾;误报意味着频繁跳闸,用户会关掉保护功能。因此指标上重点看两个值:故障样本被正确检出的比例,即召回率,也就是漏报的互补量;正常样本被正确放行的比例,即特异性,对应误报大小。下表给出一组虚构测试结果,用来演示如何读评估输出。
| 负载类型 | 准确率 | 召回率 | 特异性 |
|---|---|---|---|
| 阻性负载 | 0.97 | 0.95 | 0.99 |
| 感性负载 | 0.93 | 0.88 | 0.97 |
| 非线性负载 | 0.71 | 0.52 | 0.89 |
非线性负载组明显出现性能悬崖,说明零休类特征和新负载的正常波形撞车了。此时不要急着调 σ,而是回到特征层,把高频能量的权重提上来,或者对非线性负载的正常数据做单类建模,用密度估计替代二分类。PNN 这时体现出优势:收集到新负载的误报样本后,把正常样本追加进模式层,不需要重新训练整个网络,模型就能学会区分新负载的正常状态。
6. 部署到在线检测系统要迈过的三道坎
6.1 滑窗判决与报警确认
在线检测不能对每个周波单独判一次,一次误报就跳闸,用户真会拆掉你的设备。常见做法是滑动窗加确认机制:窗口长度取 10 个工频周期,即 200 ms,窗口每次滑过一个周波,模型输出的决策序列里连续两次判为“故障”才触发报警。这样单周波偶发的滤波尖峰不会被当成电弧。
6.2 模型体积压缩与嵌入式移植
PNN 的推理在嵌入式平台上主要是 exp 运算和距离累加。先把模式层中心用 KMeans 压缩到每类 20 到 50 个,准确率通常只掉 1 到 2 个百分点。σ 的 exp 计算用查表替代,表项按 0.01 间隔均匀采样,误差控制在 1% 以内即可。模型的全部参数就是一组浮点数组加一个 σ,完全可以固化成 C 语言头文件直接编译进固件。
6.3 采样率变更后必须同步更新滤波器系数
最后一个容易踩的坑是采样率重构。调试时用 1 MHz,部署到低功耗硬件后发现吞吐率不够,改成 200 kHz 重新跑,但带通滤波器的butter参数没有同步更新,高频能量特征直接失效。所有涉及fs的系数都要从配置表读取,然后跟着采样率版本一起写入模型快照,而不是散落在各个函数的硬编码里。把 σ、归一化均值、标准差、滤波器系数集中到一个结构体里固化,以后现场复现问题会少走很多弯路。
本文还有配套的精品资源,点击获取