ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

K均值聚类+SVM+BP神经网络融合的变压器故障诊断方法

K均值聚类+SVM+BP神经网络融合的变压器故障诊断方法 简介这是一份面向电力设备状态监测与故障诊断研究的MATLAB源码包针对电力变压器故障识别问题融合k-均值聚类、支持向量机与神经网络形成混合诊断流程代码适配MATLAB 2014/2019a/2021a采用参数化编程注释细致适合电子信息、计算机、数学等专业学生用于课程设计、期末大作业或毕业设计。压缩包共22个文件、容量4.5MB核心为8个.m程序分别实现不同组合策略的混合方法另有8个.mat模型参数与遗传算法最优解文件、4个.xlsm训练/测试/验证数据集以及README和故障诊断流程说明可直接配套运行。已有99人学习浏览。学习后可获得完整可复现的实验框架既能对照数据与脚本理解聚类、特征选择、SVM和神经网络联合建模的细节也能快速修改参数和工况数据进行故障诊断对比实验与毕业设计扩展。1. 电力变压器故障诊断把k-均值聚类、支持向量机和BP神经网络串起来不是模型堆砌单独看支持向量机和BP神经网络都能做电力变压器故障诊断但真正在油中溶解气体DGA数据上跑过的人都知道故障样本通常只占历史数据的一到两成高能放电、局部放电等少数类样本往往不足几十条。这种重尾分布会让单一模型要么把多数类学得过死要么在故障边界上给出高置信度的错误答案。标题里把k-均值聚类、支持向量机和神经网络三级串起来的方案本质是让三类模型各管一段k-均值聚类负责样本清洗与类间平衡支持向量机在小样本条件下做主体分类神经网络再对支持向量机决策值置信度低的样本做二次判读。这套组合不需要几千条样本也不依赖服务器一台能跑Matlab的机器就够了适合手里有DGA历史数据、正准备做故障诊断算法的工程师。2. 用k-均值聚类对DGA样本做清洗K值选择、特征标准化与簇级去重2.1 k-均值聚类在这里的边界聚出的是簇不是故障类型很多人拿到这套思路后会直接做一步操作对样本跑kmeans把得到的簇编号当成故障类型标签再交给支持向量机训练。这一步是错的。k-均值聚类的划分依据是特征空间里的欧氏距离它只能把相似的样本归到同一个几何结构里并不知道这些簇对应的是正常、过热还是放电聚类结果里的簇编号换个顺序语义就完全变了。把簇标签当真实故障标签训练出来的模型换上一批现场数据马上失效因为现场样本会落在两个簇之间。在DGA故障诊断里k-均值聚类的合理职责是三项第一识别出与正常样本分布差异显著的小簇作为疑似故障的待关注集合第二对占总量七成以上的正常样本做簇级降采缓解类别不平衡第三为后续特征可视化和支持向量机核参数的初设提供依据。换句话说它是SVM和BP神经网络的前置清洗模块而不是并列的第三分类器。2.2 MATLAB里kmeans的正确调用与肘部法选KDGA数据常见的特征列是五种气体浓度H2、CH4、C2H6、C2H4、C2H2再加一列IEC故障编码。直接对这五列跑kmeans之前必须做zscore标准化否则浓度基数大的气体会在距离计算里压制低浓度气体。下面这一段是选K的常规做法。% 数据表约定第1-5列是五类气体浓度第6列是IEC故障类型编码 data xlsread(dga_dataset.xlsx); X_raw data(:, 1:5); y_iec data(:, 6); mu mean(X_raw); sigma std(X_raw); X (X_raw - mu) ./ sigma; % 先标准化后进聚类 Klist 2:8; wss zeros(size(Klist)); for i 1:length(Klist) [~, ~, sumd] kmeans(X, Klist(i), MaxIter, 500, Replicates, 10); wss(i) sum(sumd); end plot(Klist, wss, -o); xlabel(K); ylabel(Sum of within-cluster distances);这段代码里的sumd是kmeans返回的每个样本到所属簇中心的距离之和把所有簇的sumd加总就得到组内离差平方和。横轴K取2到8纵轴做肘部图曲线拐点处的K就是聚类结构从有效分组进入过度拆分的转折点。需要注意的是DGA样本里各类故障的分布密度差异很大肘部法给出的K只代表几何结构不代表故障类别数所以不要拿K等于IEC里的故障类型数量去硬套。参数上MaxIter默认100在小样本上够用但样本量到几千条时经常出现迭代未收敛警告直接提到500更稳。Replicates设成10让kmeans从10组不同初始中心里挑最优解能明显降低局部最优概率这个参数对DGA这种簇块大小不均匀的数据特别重要因为初始中心一旦落在正常样本密集区小故障簇很容易被并掉。2.3 用簇级占比修正不平衡降采正常样本前先看每簇分布肘部法确定K之后下一步不是直接删样本而是统计每个簇内部的故障类型构成。正常样本虽然总量大但在特征空间里往往集中在少数几个簇故障样本则以小簇形态散布在外围。rng(42); % 固定随机种子保证复现 [cluster_id, centers] kmeans(X, 4, MaxIter, 500, Replicates, 10); for c 1:4 idx_c (cluster_id c); fprintf(簇%d 样本数%d\n, c, sum(idx_c)); tabulate(y_iec(idx_c)); % 打印该簇内各故障类型的频数占比 end运行这段代码后看每簇的tabulate输出通常会看到两种值得处理的情形一种是某个簇里正常样本占比在90%以上那这个簇里的正常样本可以按比例随机降采降到和故障簇规模接近即可另一种是某个簇只有十几条样本而且故障类型高度集中那这些样本是少数类故障的高价值样本不能因为量少就删。这个处理顺序和直接在全体样本上随机降采不同簇级降采保留了故障样本在特征空间里的局部结构后续训练支持向量机时决策边界不会因为多数类簇太胖而发生偏斜。3. 用支持向量机做主体分类fitcecoc多分类SVM的核函数与参数设置3.1 为什么主体分类选SVM而不选随机森林或深度学习经过k-均值聚类清洗后的DGA样本规模通常只有几百到两千条特征维度在五到十二个之间这正是支持向量机的优势区间。支持向量机只依赖边界附近的支撑向量决定决策面不关心远离边界的样本分布因此在故障样本稀疏、类别重叠度高的DGA数据上它的决策边界比随机森林稳定得多。随机森林在几百条样本上容易把噪声学进树的划分里BP神经网络单独跑时样本量不够就难以收敛到稳定解。支持向量机的边际最大化机制天然适合这种低维度小样本问题这也是它在工业故障诊断里长期占据主体地位的原因。3.2 fitcecoc最小训练代码RBF核、BoxConstraint与KernelScaleMATLAB里多分类SVM不需要手动组合多个二分类器fitcecoc已经封装好一对其余或一对一策略。DGA的故障类型一般有六类左右推荐用一对一编码每个子分类器只面对两个类别多数类偏向会更小。% 输入X来自上一章清洗并标准化后的特征矩阵 rng(42); cv cvpartition(y_iec, HoldOut, 0.3); X_train X(training(cv), :); y_train y_iec(training(cv), :); X_test X(test(cv), :); y_test y_iec(test(cv), :); tpl templateSVM( ... KernelFunction, rbf, ... BoxConstraint, 1, ... KernelScale, auto); svm_mdl fitcecoc(X_train, y_train, ... Learners, tpl, ... Coding, onevsone, ... ClassNames, unique(y_iec)); [y_pred, svm_score] predict(svm_mdl, X_test);这段代码先通过cvpartition留出30%的独立测试集剩下的70%用于训练。fitcecoc的Coding设为onevsone六类故障会分解成十五个二分类子问题每个子模型用templateSVM定义的RBF核独立训练。KernelScale设为auto时MATLAB会按启发式从训练数据里估计RBF核的带宽对首次跑通模型很友好。ClassNames传unique(y_iec)是必须的一步如果训练集里某类故障样本恰好为零fitcecoc的标签对齐会出问题。predict的第二个返回值svm_score是每个类别在二分类器上的原始决策值不是概率。后面做神经网络融合时需要先把它变换到接近概率的尺度常见做法是套一层sigmoid变换p 1 ./ (1 exp(-svm_score))。如果不做这个变换直接把原始得分和神经网络的softmax输出做加权平均两个变量的数值范围完全不对齐融合权重没有任何可解释性。3.3 核函数与C、gamma的调参对照表RBF核在DGA数据上是默认首选但不是唯一选择。下面这张表是实际调参时常用的判断依据核函数适用场景关键参数高频错误线性核特征维度高、样本量大、类别近似线性可分无DGA三比值特征直接当线性问题现场准确率往往低于RBF高斯RBF特征维度不高、类别边界不规则、无先验BoxConstraint、KernelScaleKernelScale设太小测试集全判成多数类多项式核特征间有明显高阶交互PolynomialOrderorder超过3后计算溢出训练时间骤增BoxConstraint对应SVM的惩罚系数C默认1是起步值C越大对误分类的惩罚越重决策边界越贴合训练样本也越容易过拟合C越小边界越平滑对故障样本这种噪声较多的标签容忍度更高。KernelScale是RBF核宽度的另一种表达方式KernelScale越小核函数越尖锐模型越复杂KernelScale太大则所有样本的核值趋同模型退化成近似线性分类器。如果不想手调这两个参数可以把fitcecoc的OptimizeHyperparameters设为auto让MATLAB做贝叶斯搜索但要注意默认优化目标是综合准确率类别不平衡时最好把目标函数改成宏平均F1否则搜索出来的参数仍然偏向多数类。4. 神经网络做输出层校准patternnet与SVM得分加权融合4.1 融合结构特征共享、决策分开、概率加权支持向量机的决策边界在样本稀疏区域会出现置信度虚高的问题特别是当测试样本落在两类故障交界处时svm_score的绝对值并不总能反映真实的后验概率。BP神经网络的分类输出虽然在小样本上不及SVM稳定但它的softmax层天然输出的是类别概率分布两类模型在同一批特征上各自给出判断最后在概率层做加权融合是这类组合方法最常见的落地形态。这个结构里k-均值聚类的输出同时喂给SVM和神经网络两个分类器共享同一套标准化参数和同一个测试集划分不允许各自单独划分数据否则融合结果无法对照。SVM侧得到的是经sigmoid变换后的类别概率神经网络侧得到的是softmax概率融合公式为final_prob w1 * svm_prob w2 * net_prob其中w1加w2等于1w1和w2在验证集上搜索确定。4.2 MATLAB里patternnet训练代码为什么不用feedforwardnet做多分类时MATLAB里常见的误用是直接拿feedforwardnet训练但feedforwardnet的输出层默认是线性激活输出范围不受约束训练出来的结果解释不了概率。分类场景应该用patternnet它的输出层自带softmax配合交叉熵损失直接输出类别概率。T full(ind2vec(y_train)); % 训练标签转one-hot矩阵patternnet要求 net patternnet([10 5], trainscg); net.divideParam.trainRatio 0.7; net.divideParam.valRatio 0.15; net.divideParam.testRatio 0.15; [net, tr] train(net, X_train, T); net_prob net(X_test); % 输出矩阵类别数 x 测试样本数 net_prob net_prob; % 转置成测试样本数 x 类别数train函数会自动把输入分成训练、验证、测试三份但注意这个划分和前面fitcecoc的cvpartition没有关系patternnet内部还有一次随机划分。hidden layer设为两层节点数10和5经验上隐藏层总节点数不要超过输入维度的两倍太多DGA特征在五到十二个之间时单层10个节点已经够用。trainscg是量化共轭梯度法内存占用比Levenberg-Marquardt小样本在两千条时收敛速度更快如果样本量很小换成trainlm可以加快收敛但需要更多内存。ind2vec转换要求标签是正整数编码DGA的IEC故障编码如果从0开始需要先加1再转换。训练完成后net(X_test)输出的是每个类别的softmax概率行数等于故障类别数列数等于测试样本数融合前必须转置成和svm_score相同的维度排列。4.3 融合权重用验证集网格搜索不要拍脑袋定w1w1和w2的比例不能靠经验拍需要在一部分不参与训练的数据上做网格搜索。做法是把训练集里再切出一小块验证集分别用训练好的SVM模型和训练好的神经网络模型在验证集上输出概率然后扫描w1从0到1、步长0.1选择宏平均F1最高的一组权重。w_grid 0:0.1:1; best_macro_f1 0; for w1 w_grid w2 1 - w1; fused w1 * svm_prob_val w2 * net_prob_val; [~, fused_label] max(fused, [], 2); f1 compute_macro_f1(y_val, fused_label); % 调用章节5.2的宏F1函数 if f1 best_macro_f1 best_macro_f1 f1; best_w [w1 w2]; end end这一段不包含归一化操作前提是svm_prob_val已经做过sigmoid变换net_prob_val已经做过softmax两者都在0到1区间。网格搜索结束后如果best_w落在0或1的边界说明其中一个模型在验证集上完全没有贡献这时不要强行保留融合逻辑需要回到数据层面检查是不是SVM的核参数不合适或者patternnet的训练没有收敛。权重搜索本身也有过拟合风险所以验证集只用来定w1定完之后再放到独立的测试集上做最终评估。5. MATLAB代码zip的验收流程Toolbox核对、宏F1与三处必调参数5.1 解压zip后先核对数据和Toolbox拿到这个故障诊断的zip压缩包后不要直接双击main.m运行。先解压到当前工作目录下用which命令确认两个关键函数在当前环境里可用缺了哪一个都会在运行中段报出未定义函数错误。unzip(transformer_fault_diagnosis.zip, ./fd); cd(./fd); which fitcecoc % 确认Statistics and Machine Learning Toolbox可用 which patternnet % 确认Deep Learning Toolbox可用打开主脚本后先定位数据读取段核对Excel或mat文件里的列顺序是否与代码注释一致——如果代码里约定第1到5列是气体浓度实际数据文件里列顺序不同聚类和SVM的结果会全部错位且不会报错。再确认全局随机种子是否固定通常是rng(42)或rng(default)没有这一行的话每次跑出来的混淆矩阵都不一样。5.2 用宏平均F1验证模型不要只看准确率DGA数据里正常样本通常占大头测试集即使把全部样本都判为正常准确率也能到70%以上但这个数字没有诊断价值。代码包里如果只画了准确率柱状图建议补一个宏平均F1的计算逻辑cm confusionmat(y_test, y_pred); num_classes size(cm, 1); prec zeros(num_classes, 1); rec zeros(num_classes, 1); for i 1:num_classes tp cm(i, i); prec(i) tp / max(sum(cm(:, i)), 1); rec(i) tp / max(sum(cm(i, :)), 1); end macroF1 mean(2 * (prec .* rec) ./ max(prec rec, eps));宏平均F1先算每个类别的精确率和召回率再对F1取平均少数类故障表现差时这个数值会立刻掉下来比整体准确率更能反映故障诊断模型的实际水平。运行这段之前先把fitcecoc预测得到的y_pred和真实标签y_test对齐确认相同的位置索引。5.3 三个必调参数与两个高频坑落地时优先检查三个参数kmeans的Replicates必须大于1否则聚类结果受初始中心影响每次生成的训练集都不同templateSVM里的BoxConstraint先从1开始如果训练集上准确率高、测试集上明显下降把C调小到0.5左右再试patternnet隐藏层节点数先从输入维度的两倍以内取不要一上来就是几十个节点小样本下隐藏层越宽验证集损失波动越大。高频坑集中在数据划分上一个是把聚类簇标签直接当故障标签训练前面2.1节已经说过模型在训练集上看着很准换数据就失效另一个是在测试集上重新做了标准化导致训练和测试分布不一致。标准化必须在训练集上计算均值和标准差然后用同一组参数处理测试集。调整完这几处后再跑一次宏F1并对比SVM单独输出和融合输出的差异确认融合是真的提升了少数类指标。最后把训练好的模型和权重存成trained_models.mat新数据来的时候直接load做推理不用每天重训一遍。本文还有配套的精品资源点击获取
返回列表