资讯动态

概率神经网络在变压器故障诊断中的应用:从DGA特征到平滑参数调优

发布时间:2026/9/18 12:11:28 来源:尧图企业网站定制
简介基于概率神经网络的变压器故障诊断方法研究论文面向电力系统运维、故障诊断和机器学习应用领域的研究人员与工程师。论文以变压器绝缘油中溶解气体为输入构建概率神经网络模型实现对高能放电、低能放电、过热和正常状态的识别。文中采用Matlab的sim、newpnn函数完成仿真使用27组训练样本和46组检测样本系统分析径向基函数扩展系数Spread对诊断效果的影响确定Spread为70时识别正确率达100%同时与ANN、SVM等方法比较验证了该方法无需复杂数据预处理、一次性分类、训练速度快且鲁棒性好的优势。内容覆盖PNN网络结构、贝叶斯判别原理、故障诊断流程及实验对比图表适合作为相关课题的设计参考或学习资料。资源为单篇PDF文档共1个文件大小1.44MB可离线阅读和按需打印。该PDF来自《工业控制计算机》2017年期刊内容精炼、数据详实已有148人学习下载。1. 变压器故障诊断为什么需要概率神经网络油浸式变压器内部一旦出现放电或过热绝缘油会分解出氢气、甲烷、乙烷、乙烯、乙炔等特征气体这就是溶解气体分析DGA的基本依据。工程上的难题在于气体浓度和故障类型之间不是线性关系同一组气体数据可能对应高温过热也可能对应低能放电边界重叠得很厉害。概率神经网络PNN恰恰是为这种“小样本、非线性、边界模糊”的分类问题设计的。它不需要像BP网络那样反复迭代训练而是把所有训练样本直接作为模式层神经元用高斯核函数做概率密度估计最后按贝叶斯决策规则输出每一类故障的后验概率。对做变压器故障诊断的工程师来说这意味着可以从几十个典型故障样本出发得到一个能解释“为什么判成这类故障”的分类器而不是只能看到黑盒输出。这篇内容就围绕PNN的输入特征怎么组织、平滑参数怎么调、训练和评估怎么做以及样本稀少时怎么兜底展开。2. 变压器故障诊断的特征构建从气体浓度到入模向量2.1 IEC三比值编码把无标签的气体数据变成故障特征原始DGA记录通常包含七种气体浓度H2、CH4、C2H6、C2H4、C2H2、CO、CO2。直接把这七个数值灌进PNN不是不行但CO和CO2主要反映固体绝缘材料的老化状态与放电和过热故障的映射关系弱工程上一般会先做一轮筛选。常见做法是保留H2、CH4、C2H6、C2H4、C2H2五种烃类气体再叠加IEC三比值编码后的三个比值。IEC三比值的原始逻辑是CH4/H2反映热分解温度C2H4/C2H6反映过热严重程度C2H2/C2H4反映是否存在放电。每个比值按阈值映射成0、1、2三个码组合出的三位码对应低温过热、高温过热、局部放电、高能放电等典型故障类型。这里的阈值在不同规程里略有差异我一般按下面这组常用参数写比值编码0编码1编码2CH4/H20.1 r ≤ 1r ≤ 0.1r 1C2H4/C2H61 r ≤ 3r ≤ 1r 3C2H2/C2H4r ≤ 0.10.1 r ≤ 1.5r 1.5这样编码后每个样本会多出三个离散特征。不过要注意PNN内部用的是高斯核输入特征的分布越连续核密度估计越平稳。完全把三比值离散成0/1/2会让大量样本落在同一个坐标点上反而削弱分类器对浓度差异的区分能力。2.2 用Python把DGA样本整理成PNN输入向量所以在真正入模前我一般会保留烃类气体浓度和IEC连续比值两套特征按特征拼接的方式送入网络。下面是一段可以直接跑的构造逻辑。import pandas as pd import numpy as np df pd.read_csv(dga_samples.csv) # 数据列device_id, h2, ch4, c2h6, c2h4, c2h2, fault_type feature_cols [h2, ch4, c2h6, c2h4, c2h2] gas_data df[feature_cols].values # 连续三比值特征避免除零 ratio1 df[ch4] / df[h2].replace(0, 1e-6) ratio2 df[c2h4] / df[c2h6].replace(0, 1e-6) ratio3 df[c2h2] / df[c2h4].replace(0, 1e-6) X_raw np.column_stack([gas_data, ratio1, ratio2, ratio3]) y df[fault_type].values代码里先取五组烃类气体作为基础特征再追加三个连续比值。把比值作为浮点数直接输入而不是转成IEC三段码好处是保留了气体比例在阈值附近的细微差异。后续归一化时气体浓度用Z-score比值本身已经是相对量不需要再做标准化。2.3 样本划分别让同一台变压器的数据同时出现在训练集和测试集变压器故障诊断的样本天然存在设备相关性。同一台变压器在一个故障周期内会被多次取样气体浓度高度相似。如果随机切分训练集和测试集这些相似样本会一边训练一边验证测试精度虚高。工程上应该按device_id分组切分。from sklearn.model_selection import GroupShuffleSplit X X_raw groups df[device_id].values splitter GroupShuffleSplit(n_splits1, test_size0.3, random_state42) train_idx, test_idx next(splitter.split(X, y, groups)) X_train, X_test X[train_idx], X[test_idx] y_train, y_test y[train_idx], y[test_idx]分组切分的目的是确保同一台设备的样本不会被拆到两个集合里。这样才能评估PNN面对“没见过的新设备”时的泛化能力。诊断模型部署后遇到的都是新变压器按照这个思路划分训练集评估结果才接近真实使用场景。3. 概率神经网络的四层结构与平滑参数调优3.1 PNN的输入层、模式层、求和层、决策层PNN的结构比BP简单只有四层。输入层接收特征向量节点数等于特征维度这里就是8。模式层每个训练样本对应一个径向基神经元用高斯核计算待测样本与每个训练样本的距离求和层按故障类别将模式层输出做平均得到各类别的类条件概率密度决策层取概率密度最大的类别作为输出。关键机制是PNN的训练过程不需要反向传播不需要设置学习率更不需要指定迭代次数。拟合阶段做的事情只是把训练样本保存下来真正计算发生在推理阶段。这个特性对变压器故障诊断非常合适因为故障样本数量少也不需要像深度网络那样通过大量数据拟合映射关系。下面是一个简洁的PNN实现核心都在高斯核计算和类别概率归一化上。class PNN: def __init__(self, sigma0.5): self.sigma sigma self.X None self.y None self.classes None def fit(self, X, y): self.X np.asarray(X, dtypefloat) self.y np.asarray(y, dtypeint) self.classes np.unique(y) def _gauss(self, x): # 每个训练样本与待测样本的欧氏距离平方 d2 np.sum((self.X - x) ** 2, axis1) return np.exp(-d2 / (2 * self.sigma ** 2)) def predict_proba(self, x): g self._gauss(x) proba [] for c in self.classes: mask (self.y c) # 对同类样本的高斯响应取平均再归一化 proba.append(np.sum(g[mask]) / max(np.sum(mask), 1)) proba np.array(proba) return proba / proba.sum() def predict(self, x): proba self.predict_proba(x) return self.classes[np.argmax(proba)]求和层没有用简单的加和而是除以该类别样本数取平均。这样做的原因是训练样本中各类别数量往往不均衡某个故障类型的样本多直接加和会让该类别在距离较远时仍然获得很大响应诊断结果会偏向高频类别。3.2 平滑参数sigma对诊断边界的影响sigma也叫平滑因子直接控制高斯核的带宽。sigma很小的时候每个训练样本的影响范围很窄待测样本基本只被最近的几个样本影响决策边界会变得非常曲折逼近最近邻分类器。sigma特别大时每个高斯核都铺得很开各类别的概率密度趋近于先验比例边界过于平滑细小的故障特征差异会被吞掉。具体到变压器故障诊断sigma在0.1到1.0之间比较常用。特征经过归一化之后这个范围的sigma能够区分出烃类气体比例的中等差异。如果特征没有归一化而直接调sigma气体浓度的数量级会主导欧氏距离H2浓度几百个单位、C2H2浓度几个单位后者几乎不起作用这也是常见的入模错误。3.3 网格搜索sigma用混淆矩阵评估诊断效果sigma不靠经验拍脑袋。用交叉验证在训练集内部做网格搜索再对每个候选sigma评估准确率选择表现最好的取值。代码如下。from sklearn.model_selection import StratifiedKFold from sklearn.metrics import accuracy_score sigma_candidates np.logspace(-1, 1, 15) cv StratifiedKFold(n_splits5, shuffleTrue, random_state42) best_sigma None best_acc 0.0 for sigma in sigma_candidates: accs [] for train_idx, val_idx in cv.split(X_train, y_train): model PNN(sigmasigma) model.fit(X_train[train_idx], y_train[train_idx]) pred model.predict(X_train[val_idx]) accs.append(accuracy_score(y_train[val_idx], pred)) mean_acc np.mean(accs) print(fsigma{sigma:.3f} acc{mean_acc:.4f}) if mean_acc best_acc: best_acc mean_acc best_sigma sigma print(fbest sigma: {best_sigma:.3f})这里对每一个sigma重复五折交叉验证取平均准确率作为评价指标。sigma的搜索范围如果跨多个数量级用logspace比linspace更合理因为高sigma区间的精度变化梯度非常平缓线性等分会浪费大量计算。网格搜索完成后用最优sigma重新在完整训练集上拟合模型再对测试集做预测。混淆矩阵比准确率更有参考价值。准确率只告诉73%还是89%而混淆矩阵能暴露“高温过热样本总被误判成中温过热”这类问题。如果故障类型配置为局部放电、低能放电、高能放电、低温过热、中温过热、高温过热六类PNN通常在过热和放电的大类内部发生混淆跨大类误判的情况相对少这是由气体比例特征本身的物理含义决定的。4. 概率神经网络与BP、SVM在故障诊断数据上的对比4.1 对比实验的基准设置只看到PNN自己的准确率不够还要和常用分类器对比。这里选两个典型对手BP神经网络和支持向量机。BP代表需要迭代训练的神经网络SVM代表带核函数的判别模型。三者在同一份训练集和测试集上验证输入特征完全一致避免特征工程带来的差异。对比维度包括测试集准确率、训练耗时、是否依赖超参数搜索、能否增量更新。具体数字会随样本集波动我给出一个在常见DGA数据集上会看到的参考范围。模型测试准确率训练耗时超参数数量增量学习PNN85% ~ 90%秒级以下1sigma天然支持BP78% ~ 85%秒级到分钟级层数、节点数、学习率、迭代次数需要重训SVMRBF核84% ~ 89%秒级C、gamma不支持PNN在准确率上不一定总是最高但它训练阶段几乎不消耗计算资源没有局部最优和收敛性问题。BP在这个数据量级上容易过拟合尤其是训练样本只有几十条时隐藏层稍微加厚验证集精度就会掉头向下。4.2 为什么PNN在边界重叠场景下更稳变压器故障诊断的难点在于故障类型之间的特征重叠。例如中温过热和高温过热都伴随高C2H4占比区别只在比例系数上低能放电和高能放电的C2H2占比也存在过渡区域。BP网络用梯度下降拟合决策边界样本重叠度高时误差曲面容易出现多个局部极小值每次训练得到的边界可能不同。SVM通过最大化间隔寻找分界面在重叠区域会非常依赖核函数参数的选择。PNN的不同之处在于它不对决策边界做全局假设。每个训练样本都以自身为中心贡献一个高斯脉冲最终分类边界是这些脉冲叠加的结果。样本密集的区域概率密度高样本稀少的区域概率密度自然低。这种局部建模方式让PNN在类别重叠区域能够保持相对平滑且稳定的分类结果不会出现BP网络“训练三次三种边界”的情况。4.3 混淆矩阵揭示的PNN误判特征下面是某个典型样本集上PNN对测试集预测的混淆矩阵形态。预测局部放电 低能放电 高能放电 低温过热 中温过热 高温过热 实际局部放电 12 1 0 0 0 0 实际低能放电 2 20 3 0 0 0 实际高能放电 0 4 18 0 0 1 实际低温过热 0 0 0 10 2 0 实际中温过热 0 0 0 3 14 1 实际高温过热 0 0 1 0 2 16从这个矩阵可以看到两个规律其一放电类故障和过热类故障之间几乎没有交叉误判说明烃类气体比例对这两大类物理过程有很好的区分度其二误判主要发生在“低能放电/高能放电”“中温过热/高温过热”这种同大类不同子类的边界上。这个现象提示后续如果想进一步提高精度应该针对同大类细分而不是盲目调整sigma。5. 故障样本稀少时概率神经网络的诊断极限与增量修正变压器故障样本的获取成本很高实际工程中经常遇到某个故障类型只有四五个样本的情况。PNN在这种条件下的行为值得单独讨论。当某类样本数极少时该类别的概率密度估计会非常尖锐。具体表现为训练样本附近概率很高稍远一点就迅速衰减到接近于零。推理时如果待测样本恰好落在这个狭窄区域内输出概率会意外地高如果落在区域边缘则任何类别都可能被选中。解决思路是在评估时看置信度而不仅仅看类别标签。下面的代码演示了如何结合置信度输出诊断结论。def diagnose(model, sample, feature_mean, feature_std, threshold0.6): sample (np.asarray(sample) - feature_mean) / feature_std proba model.predict_proba(sample.reshape(1, -1)) best_idx np.argmax(proba) best_label model.classes[best_idx] prob proba[best_idx] if prob threshold: print(f低置信度{best_label}概率仅{prob:.2f}建议人工复核) return None print(f诊断结果{best_label}后验概率{prob:.2f}) return best_label阈值设成0.6还是0.7取决于现场对漏报的容忍度。诊断倾向保守时提高阈值倾向灵敏时降低阈值。这个函数建议作为诊断系统的出口所有低置信度样本都进入人工复核流程。另一个PNN的工程优势是增量学习。新增一个故障样本不需要重新训练整个模型只需要把样本追加到模式层即可new_sample np.array([...]) # 归一化后的特征 new_label 5 model.X np.vstack([model.X, new_sample]) model.y np.append(model.y, new_label) model.classes np.unique(model.y)这种更新方式在收集到新的故障案例时非常有价值。传统BP模型每追加一个样本就要设计新的训练轮次还要担心灾难性遗忘PNN直接把新样本作为新的模式层神经元加入原有样本的核函数不受影响旧知识完整保留。代价是模式层会随着样本增加而膨胀当样本数超过数千条时每个待测样本要和全部训练样本逐个计算高斯核推理速度会变慢届时要考虑样本修剪或转用SVM。变压器故障诊断场景下样本规模很难达到这个量级所以PNN的存储代价在工程上完全可以接受。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价