ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

概率神经网络PNN在变压器DGA故障诊断中的MATLAB实现与调优

2026/9/12 0:48:44 拓冰建站 浏览量
概率神经网络PNN在变压器DGA故障诊断中的MATLAB实现与调优 简介基于MATLAB的概率神经网络PNN变压器故障诊断项目面向电力系统运维、电气工程学生以及机器学习应用开发者用于解决变压器运行数据类别识别与早期故障检测问题。可应用于设备状态监测、故障预警和健康管理场景。资源共6个文件包括可直接运行的MATLAB主程序、训练/测试数据文件、3张结果示意图和1份HTML说明文档压缩包大小仅16KB文件组织清晰便于快速复现。目前已有563人学习/下载适合需要掌握PNN建模流程和MATLAB神经网络工具箱用法的入门及进阶读者。内容涵盖PNN输入层—模式层—分类层的完整实现、数据归一化与预处理方法并通过结果图和HTML文档展示故障诊断流程与分类效果基于现有代码还可修改数据或网络参数用于不同工况下的变压器故障识别也可作为课程设计或毕业设计的基础框架。1. 变压器故障诊断里概率神经网络为什么值得先用一轮变压器一停电网调度、电能质量、生产计划全都跟着动。基于油中溶解气体分析DGA的三比值法和大卫三角法在现场用了很多年但它们靠编码表查故障类型样本一旦落在编码区间边缘就容易误判到邻近类别。概率神经网络PNN不查表它把每个训练样本当作一个高斯核函数的中心在特征空间里估计各类别的概率密度再按贝叶斯最小风险准则挑概率最大的类别。PNN 不需要像 BP 网络那样迭代调整权重网络搭好即训练完成非常适合变压器故障样本量不大、特征维度在十维以内的场景。用 MATLAB 做这件事newpnn 一行就能建网络真正花时间的是数据归一化、spread 选择和对诊断结果的边界分析。从 DGA 数据到一份可解释的诊断结论大半天可以走完。2. PNN 的四层结构与 MATLAB 中的概率密度估计实现2.1 PNN 的四层结构和贝叶斯决策如何落到变压器故障上PNN 的结构是固定的四层输入层、模式层、求和层和输出/决策层。输入层节点数等于特征维度比如用 DGA 五种气体做输入就是 5 个节点模式层节点数等于训练样本总数每个节点对应一个训练样本求和层节点数等于故障类别数对属于同一类的模式层输出做求和或平均输出层是一个竞争节点取求和层里概率密度最大的那一类作为最终诊断结果。提示newpnn 内部实现的求和层实际是把同类样本的高斯核输出做平均而不是简单累加。这样在各类样本数量不一致时不会因为某一类样本多就自动占据概率优势。关键在于条件概率密度估计。对第 k 类故障给定一个待诊断样本向量 xPNN 用高斯核作为 Parzen 窗f_k(x) 1 / (N_k × (2π)^(d/2) × σ^d) × Σ exp( -||x − x_ki||² / (2σ²) )其中 N_k 是第 k 类的训练样本数d 是特征维数σ 是高斯核的扩展宽度。决策层取 f_k(x) 最大的类作为输出。当各类先验概率相等时这等价于贝叶斯最小风险决策。这个公式直接决定了 spread 参数的意义σ 越大单个训练样本的影响范围越宽σ 越小只有离待测点很近的训练样本才起作用。变压器 DGA 特征中低能放电和高能放电的样本在高维空间里经常靠得很近σ 选小了这两类会被边界处的毛刺带偏选大了两类密度函数叠在一起谁都分不出来。2.2 MATLAB 中 newpnn 建网的最小代码与 spread 参数说明MATLAB 的 Deep Learning Toolbox 保留了 newpnn 函数和 newrb、newgrnn 属于同一代径向基函数网络族。下面代码是 2 分类、3 特征的最小示例用来验证 PNN 在 MATLAB 里的前向计算路径% 3 个特征、2 类故障的最小示例每类 2 个样本 X [0.5 0.6 1.2; 0.4 0.7 1.1; 1.5 1.6 0.3; 1.4 1.5 0.4]; % X 每列一个样本前 2 列是类别1后 2 列是类别2 T [1 1 2 2]; % 标签需要转成 ind2vec 的稀疏矩阵形式 Tvec ind2vec(T); % 创建 PNNspread 设为 0.1 net newpnn(X, Tvec, 0.1); % 对训练样本做一次前向预测 Y net(X); pred vec2ind(Y); disp(pred);逻辑说明X 的尺寸是 3×4三个特征分别在行上四个样本在列上newpnn 的输入约定是列样本。Tvec 是 2×4 的逻辑矩阵第一行全 1 表示样本属于类别 1。net(X) 返回 2×4 的概率密度矩阵vec2ind 找到每列最大值所在的行号作为预测类别。由于 PNN 的模式层就是把训练样本原样放进去训练集回判通常接近 100%这个数字没有参考价值真正要评估的是独立测试集上的表现。参数说明newpnn 的第三个参数 spread 是高斯核的标准差工程上常见的调整范围是 0.05 到 2.0。spread 越小分类边界越曲折对训练集的回判率越高但测试集泛化能力断崖式下降spread 越大边界越平滑抗噪声能力越好但会把原本可分的类别压在一起。变压器故障诊断中DGA 数据本身带有在线监测仪器的测量噪声spread 不宜选到 0.1 以下除非你已经对气体浓度做了滤波或平滑处理。3. 基于 DGA 数据的变压器故障 PNN 训练与测试代码3.1 变压器油中溶解气体的特征向量如何组织变压器内部发生热故障或放电故障时绝缘油和固体绝缘材料会分解出低分子烃类气体。工程上用气相色谱仪测定油中溶解气体浓度最常见的是氢气 H2、甲烷 CH4、乙烷 C2H6、乙烯 C2H4、乙炔 C2H2 五种。乙炔只在高温电弧或放电性故障时大量产生是放电类故障的标志气体乙烯和甲烷的比例关系能反映过热温度区间氢气对局部放电敏感。把这五个浓度直接拼成一个 5 维向量是最常见且信息损失最小的做法。需要说明的是CO 与 CO2 对故障类型的区分度相对低而且容易受环境温度、油龄等因素干扰工程上常作为辅助判据而不放入 PNN 的输入。3.2 一个 DGA 样本表与标签编码示例样本H2CH4C2H6C2H4C2H2故障类型145.212.55.36.80.4正常2152.388.733.6112.40.6高温过热3210.5132.445.2265.11.2高温过热495.438.215.748.918.6低能放电5178.655.321.872.4118.5高能放电6140.248.519.324.686.7高能放电浓度单位是 μL/L。正常样本的乙炔很低高温过热时乙烯和甲烷明显上升低能放电和高能放电的差异主要体现在乙炔与乙烯的比例上。标签在 MATLAB 里直接用整数 1、2、3、4、5 编码顺序按表格从上到下排。实际工程数据会把一个变压器的历史数据按时间窗口切成样本同一个故障阶段的多条样本不要同时出现在训练集和测试集否则会高估模型性能。3.3 归一化、分层划分与 PNN 的训练测试脚本浓度数据覆盖范围从不到 1 到几百量纲差异对 PNN 的距离计算影响很大。spread 是按欧氏距离的平方除 2σ² 算的乙炔浓度如果比其他气体低两个数量级它对这个样本的类别区分贡献会被稀释。所以必须先做归一化。常见做法是逐特征做最小最大值归一化所有样本的 H2 都落到 [0,1]CH4 也独立落到 [0,1]。下面脚本把整个流程串起来% 读取 DGA 数据raw 为 6×N前5行气体浓度第6行标签 raw readmatrix(transformer_dga.csv); X_raw raw(1:5, :); labels raw(6, :); % 逐特征最小最大值归一化到 [0,1] X_min min(X_raw, [], 2); X_max max(X_raw, [], 2); X_norm (X_raw - X_min) ./ (X_max - X_min eps); % 按类别分层划分训练/测试集每类随机取 70% 训练 rng(42); classes unique(labels); trainIdx []; testIdx []; for k 1:numel(classes) idx_k find(labels classes(k)); n_train round(0.7 * numel(idx_k)); perm_k randperm(numel(idx_k)); trainIdx [trainIdx, idx_k(perm_k(1:n_train))]; testIdx [testIdx, idx_k(perm_k(n_train1:end))]; end X_train X_norm(:, trainIdx); T_train labels(trainIdx); X_test X_norm(:, testIdx); T_test labels(testIdx); % 建立 PNN 并测试 spread 0.3; net newpnn(X_train, ind2vec(T_train), spread); pred vec2ind(net(X_test)); acc mean(pred T_test) * 100; fprintf(测试集准确率%.2f%%\n, acc);逻辑说明X_raw 每列是一个采样样本readmatrix 读入时要求 CSV 里样本按列排或者手动转置这里按列样本约定处理。归一化用逐行的 min/max不需要逐列因为行才是特征。分母加 eps 是为了防止某个气体浓度在所有样本里都为 0 时出现除零。分层划分用 unique(labels) 找出类别列表对每个类单独随机排列再取前 70%保证测试集里各类都有样本。rng(42) 固定随机种子不同环境运行的划分结果一致方便复盘。参数说明spread 取 0.3 是 DGA 数据归一化后的常见初始值。归一化前浓度分布跨度大spread 需要到几十甚至上百归一化后特征都在 [0,1] 区间spread 在 0.1~0.6 之间通常能覆盖住合理的决策边界。训练集上的回判准确率在 PNN 里一般都不低代码里只打印测试集准确率就是为了避免被回判准确率误导。3.3.1 为什么归一化参数不能由测试集参与计算X_min 和 X_max 在上一段代码里由所有样本一起算出这在离线研究里问题不大。如果模型要部署上线归一化参数应该只从训练集统计然后用同一组 min/max 去变换测试集和未来的新样本。这样做的原因很简单测试集代表的是模型没见过的数据它的取值范围不应当在模型构建阶段被泄露进来。泄露后测试准确率会虚高换到其他变电站的真实数据上准确率会立刻回落。3.4 混淆矩阵与典型误判C confusionmat(T_test, pred); figure; imagesc(C); colorbar; xticks(1:size(C, 2)); yticks(1:size(C, 1)); xlabel(预测类别); ylabel(真实类别); for i 1:size(C, 1) for j 1:size(C, 2) text(j, i, num2str(C(i, j)), HorizontalAlignment, center); end endheatmap 在较新版本 MATLAB 里更美观但 imagesc 加 text 的写法在近十个版本里都能运行。混淆矩阵对角线上的数字是正确诊断数非对角线上的数字通常集中在低能放电与高能放电之间说明这两个类别在 DGA 特征空间中的重叠区较大。面对这种误判正确的下一步不是马上换模型而是先回去检查特征把乙烯和乙炔的比值单独拿出做散点图看两类样本是否能被一条简单的阈值线分开。如果分不开再考虑加特征或调 spread。4. spread 调优、PCA 降维与样本不平衡时的 PNN 可靠性4.1 spread 参数网格搜索与 K 折交叉验证第 3 章的脚本把 spread 固定成 0.3但最优 spread 随数据分布变化很大。DGA 样本里如果某一类的离散度特别大0.2 和 0.4 的测试结果可能差五个百分点以上。常见做法是在对数间隔上取一组候选值用 K 折交叉验证逐个评估再在完整训练集上重建最终网络。spreadCandidates [0.05, 0.1, 0.2, 0.4, 0.8, 1.6]; bestSpread spreadCandidates(1); bestAcc 0; % 手动生成 5 折索引避免依赖额外工具箱 rng(7); foldIdx ceil(5 * rand(1, numel(T_train))); for s spreadCandidates accFold zeros(1, 5); for f 1:5 tr (foldIdx ~ f); te (foldIdx f); netCV newpnn(X_train(:, tr), ind2vec(T_train(tr)), s); pCV vec2ind(netCV(X_train(:, te))); accFold(f) mean(pCV T_train(te)); end meanAcc mean(accFold); fprintf(spread%.2f, 5折平均准确率%.2f%%\n, s, meanAcc * 100); if meanAcc bestAcc bestAcc meanAcc; bestSpread s; end end % 用最优 spread 在全部训练数据上建最终模型 netFinal newpnn(X_train, ind2vec(T_train), bestSpread);逻辑说明foldIdx 是 1×N 的整数向量值 1 到 5 表示样本属于第几折。每次循环取其中 4 折训练、1 折验证所以每个样本都会恰好被验证一次。交叉验证的目的是选择 spread不是评估最终模型最终模型的准确率应该用独立的测试集 X_test 来算。这里有个容易踩的坑网格搜索的候选值跨度太大时最优值可能落在边界上比如如果 0.05 最好说明特征分布还很拥挤可以继续往 0.01 方向收缩搜索如果 1.6 最好说明 0.4 到 1.6 的区间内还有优化空间。spread5 折平均准确率最优折与最差折差值0.0584.6%6.3%0.1088.2%4.1%0.2091.7%2.8%0.4090.5%3.2%0.8087.4%5.0%表格数值为示例。当最优折与最差折差值超过 5 个百分点时说明样本量还撑不起当前的特征维度先补样本比继续调参数更有效。参数说明newpnn 每建一次网络实际上是把训练样本复制到模式层。5 折交叉验证要建 5×630 个网络训练集样本量在几千以内时速度很快上万后才会感觉到延迟。PNN 的训练本质是零计算量的内存操作交叉验证的耗时主要花在前向传播的距离计算上。4.2 PCA 降维什么时候该用什么时候不要用五种气体浓度之间有强相关性。高温过热时甲烷、乙烯、乙烷都上升特征维度里有效信息可能只有 3~4 维。PCA 把原始特征投影到相互正交的方向能去掉这部分冗余。在 MATLAB 里做 PCA 的代码% pca 要求输入为 样本×特征 矩阵X_train 是 特征×样本所以先转置 [coeff, score, ~, ~, explained] pca(X_train); % 取累计贡献率超过 90% 的主成分个数 cumExplained cumsum(explained); nPC find(cumExplained 90, 1); % 训练集和测试集统一投影 X_train_pca score(:, 1:nPC); X_test_pca (X_test - mean(X_train, 1)) * coeff(:, 1:nPC); X_test_pca X_test_pca;逻辑说明pca 返回的 score 是训练样本在新坐标系下的坐标直接取前 nPC 列就得到降维后的训练集。测试集不能用 pca 再单独做一次分解必须用训练集得到的 mean 和 coeff 去投影否则两个特征空间不对齐。explained 是每个主成分解释的方差百分比在这个数据集上通常前两个主成分已经能解释 85% 以上的方差。那么问题来了PCA 在什么情况下不值得用DGA 特征的物理含义对运维人员很重要变压器检修人员习惯看乙炔是不是涨了这样的原生气体判断。PCA 之后的特征变成主成分的线性组合不再对应具体气体解释性要打折扣。如果诊断结果要写进检修报告建议保留原始特征靠调 spread 和样本质量来提准确率如果目标是做自动批量筛查再上 PCA。4.3 类别不平衡与先验概率修正现场收集的 DGA 样本里过热和正常样本可能占 70% 以上放电样本往往只有十几个。PNN 求和层的输出包含类别样本数信息样本多的类别在密度估计上更可靠边界区域天然偏向多数类。两个常用做法一是在求和层后面乘一个人工设定的先验权重把现场统计得到的每类故障比例乘进去再比较二是对少数类样本做扩充比如对低能放电样本加入轻微噪声后复制几份。复制样本的操作不会破坏 PNN 结构因为它本质上只是在模式层增加核函数的中心点。扩充时噪声幅度控制在特征标准差的 5% 以内避免把类别边界改得面目全非。5. 把 PNN 诊断模型部署到日常检测的验证细节5.1 模型保存必须连同归一化参数一起存% 训练流程结束后把网络、归一化参数、类别映射一起保存 save(pnn_dga_model.mat, net, X_min, X_max, labels, spread); % 新样本诊断 S load(pnn_dga_model.mat); newSample [152, 90, 32, 118, 45]; x_norm (newSample - S.X_min) ./ (S.X_max - S.X_min eps); out S.net(x_norm); [prob, cls] max(out); fprintf(诊断类别%s概率%.2f\n, S.labels(cls), prob);注意 newSample 是列向量 5×1因为网络输入约定是列样本。保存时顺带记录 spread 值方便后续打印模型配置。加载后的 out 是类别数×1 的概率向量max 的第一个返回值是最大概率值第二个是行索引。如果跑到这里概率最高值低于 0.6建议把结果标记为低置信度重新取样复测。5.2 用 K 折交叉验证的结果替代单次划分单次划分测试准确率受随机种子影响很大。做对比验证时习惯把第 3 章整套流程放进一个 for 循环里跑 10 次不同的随机划分记录每次准确率的均值和标准差。标准差超过 3 个百分点说明样本量不足以支撑细粒度分类需要回到数据层面补样本而不是继续调 spread。这个方法同样适用于对比 BP 和 SVM相同的划分顺序下比较指标结论才有可比性。5.3 干扰样本的拒判设计实际诊断里最怕的不是分错而是把无法确定的样本硬归到某一类。PNN 输出本身就是概率密度天然支持拒判。给每类设定一个最低概率阈值比如 0.5所有类别概率都低于阈值时返回待复查不输出故障类型。批量检测场景下可以把多条历史样本组成一个矩阵一次传入 net一次性得到一批诊断结果省去循环调用。这样保存的模型在半年后重新加载时只要归一化参数和网络结构没有解耦仍然能复现当时的诊断边界。本文还有配套的精品资源点击获取