简介:变压器的故障诊断对电力系统安全运行至关重要,而油中溶解气体分析(DGA)是识别变压器内部潜伏故障的有效手段。这份PDF资料以提升诊断准确性为目标,系统阐述基于改进粒子群算法(PSO)优化径向基函数(RBF)神经网络的故障诊断方法,面向电力设备运维人员、故障诊断学习者及机器学习应用开发者。资料为1个PDF文档,大小1.62MB,内容覆盖神经网络与RBF网络原理、粒子群优化机制、改进PSO抑制早熟现象的策略,以及MATLAB平台下的算法编程与结果对比;既有理论分析,也有诊断实例验证。已有152人学习下载,读者可从中掌握如何借助改进PSO为RBF网络选择更优参数,降低误判风险,并获得从算法原理到工程实现的完整参考路径。对于正在研究智能算法在电力设备故障诊断中应用的学生或工程师,是一份结构清晰、可直接对照学习的技术文档。
1. 变压器故障诊断为什么绕不开PSO+RBF这个组合
拿到《基于改进PSO优化RBF神经网络的变压器故障诊断.pdf》这个标题时,我第一反应不是去找论文里的公式,而是先确认它解决的是不是那个几乎所有电力试验人员都会头疼的问题:油中溶解气体(DGA)数据在手,怎么判断变压器到底处于哪种故障状态。做过的人都清楚,三比值法简单,但编码边界一抖就翻车;机器学习模型又容易在样本少、类别不均时造假象。PSO负责把RBF神经网络的中心和宽度搜出来,RBF负责把气体浓度模式映射到故障类别,这套组合最典型的应用场景就是小样本、表格型特征、类别明确的诊断任务。适合读这份笔记的人,是在做设备状态检修、想用智能算法替代阈值规则的工程师,以及正在用类似题目做毕业设计、需要把方法本身讲清楚的学生。
2. 从DGA数据到故障类别:建模前先把数据问题想清楚
2.1 输入特征怎么选:七种气体到底喂几种
变压器油中溶解气体分析,常规检测出来的是七种组分:氢气H2、甲烷CH4、乙烷C2H6、乙烯C2H4、乙炔C2H2、一氧化碳CO、二氧化碳CO2。很多改进算法一上来就把七种全喂进去,看起来信息完整,实际未必是最优做法。
我的习惯是先做物理判断再做相关性筛选。H2、CH4、C2H6、C2H4、C2H2这五种和放电、过热的关系最直接:局部放电产氢多,低温过热主要产甲烷和乙烷,高温过热和电弧放电会拉高乙烯和乙炔。CO和CO2主要来自固体绝缘材料老化,受运行年限、负荷、检修历史影响很大,同一台变压器不同季节测出来的值波动可能比故障引起的波动还大。很多诊断论文把CO2剔掉,主要就是为了减少这种非故障因素带来的干扰。
特征选择上有两条路线:一条是直接归一化后喂五种或七种原始气体含量,让RBF自己组合;另一条是沿用无编码比值,比如CH4/H2、C2H2/C2H4、C2H4/C2H6,用三对比值做输入,相当于先把物理常识压缩进去。两条路线我都在实际数据上跑过,结论是:当样本量超过三百条时,原始含量往往更好,因为比值压缩会丢失绝对浓度里的信息;样本量很少时,比值特征更稳,因为维度从五降到了三,RBF参数空间更小。建议你在这个环节多留一组对照实验,不要拍脑袋。
还有一点容易被忽略:气体含量数据跨样本差异非常大,同一故障类型下,轻度过热和严重过热的产气量可能差一两个数量级,归一化几乎是强制操作。归一化要在训练集上做,用训练集的min和max去变换验证集和测试集,而不是把全部样本合在一起归一化。这里埋着一个常见的坑,第五章会专门说。
2.2 故障标签怎么定:三比值编码不能直接当特征
DGA诊断的经典参照是IEC 60599的三比值法,用C2H2/C2H4、CH4/H2、C2H4/C2H6三组比值编成三位编码,再查表对应到局部放电、低能放电、高能放电、低温过热、中温过热、高温过热这几类。三比值法的问题在于编码区间是硬切的,比值稍微跨过阈值,编码和结论就完全变了,而且部分编码组合在表里没有定义,实测数据经常落在这些盲区里。
用RBF做诊断时,输出标签一般按七类设:正常、低温过热(<300℃)、中温过热(300~700℃)、高温过热(>700℃)、局部放电、低能放电、高能放电。输出层用one-hot编码,类别数就是输出节点数。如果你的现场数据里过热类占比特别高、放电类样本只有十几条,我建议降维合并成四类:正常、局部放电、过热、放电。类别少了,每个类能分到的训练样本就多了,模型稳定性比精致标签更有价值。
一个高频翻车点是把三比值编码直接当成输入特征。三位编码本身是类别ID,0/1/2之间的差值没有连续物理意义,神经网络会把这种离散编码当成有序变量去拟合,等于人为制造了不存在的线性关系。正确做法要么用one-hot,要么干脆不编码、直接喂原始气体含量。
2.3 为什么是RBF而不是BP:局部逼近和参数可解释
同属前馈神经网络,BP神经网络结构图大家都熟,误差反传、全连接隐层,训练时一旦样本少就容易过拟合,隐层节点数和学习率都得反复试。RBF神经网络的思路不一样:每个隐节点就是一个以中心点为中心的高斯核,输入离中心越近,激活越强,离中心越远,响应迅速衰减。这意味RBF是一个局部逼近器,每个隐节点只负责输入空间里一小块区域,对应到DGA数据上,可以理解为每种故障类型的气体浓度模式。
这种局部性在变压器故障诊断里特别有价值。故障样本通常只有几百条,分布不均匀,BP这类全局逼近网络容易为了拟合某个局部区域而扭曲其他区域;RBF因为每个中心只管周围一片,不会出现这种全局牵连。另外RBF的中心、宽度、输出权值都有明确物理含义:中心可以理解为一类故障的典型气体浓度组合,宽度表示这个模式的容忍范围,输出权值决定该隐节点对每个故障类别的贡献权重。
现在一提神经网络就有人想上卷积神经网络或者transformer,变压器故障诊断不是图像识别也不是长序列建模,样本量几百条、特征是表格型气体浓度,transformer的收益撑不起它的参数规模,卷积神经网络也拿不到空间结构。RBF在这个场景里的性价比往往比这些复杂模型更高。如果你真想对比,把PSO-RBF作为基线,再跑BP和LSTM各一次,大概率RBF不差,而且训练快得多。
3. 手写RBF神经网络:中心、宽度与输出权值的分工
3.1 RBF网络需要优化的三个环节
一个标准的RBF神经网络,输出计算分两步。隐层第j个节点对输入向量x的响应是:
h_j(x) = exp( -||x - c_j||² / (2σ_j²) )
其中c_j是第j个中心,σ_j是第j个节点的宽度。输出层就是这些响应的线性组合:
y = H * W
这里H是样本在隐层上的响应矩阵,W是输出层权值。三个环节需要确定:中心位置c_j、宽度σ_j、输出权值W。很多初学方案把这三个全部丢给PSO去搜,粒子维度变得很大,搜索效率低,而且W和中心、宽度在适应度上互相干扰,优化过程容易震荡。
常见做法是把输出层权值留给最小二乘求解,PSO只搜中心和宽度。原因很直接:一旦中心c和宽度σ确定,H矩阵就完全确定了,W的解析解是W = H⁺T,H⁺是H的伪逆。这相当于把一个大问题的后半段用代数方法精确求解,PSO只需要负责最难受的非线性参数搜索。粒子维度从“中心+宽度+权值”降到“中心+宽度”,等于把搜索空间砍掉了一截,收敛速度和稳定性都能看到提升。
3.2 伪逆与岭回归:输出层权值不用PSO去搜
用伪逆求W,理论上是求最小二乘解,公式是W = pinv(H) * T。但在变压器故障诊断这种小样本场景,我一般不直接调pinv,而是在伪逆里加一个岭回归项:
W = (HᵀH + λI)⁻¹ HᵀT
这个λ叫正则化系数,常见取值1e-3到1e-2。它的作用有两个:一是当H矩阵接近病态、部分列近乎线性相关时,加λ能稳住求逆;二是抑制W过大,防止输出层把隐层响应放大出离谱的数值。小样本下隐层节点数一旦略多,HᵀH经常接近奇异,直接伪逆会出现个别权值动辄上百的情况,训练集误差很小,测试集一塌糊涂。加岭回归是性价比最高的补丁。
你可以把伪逆求解理解成:PSO负责回答“故障模式长什么样”,最小二乘负责回答“每个模式以多大权重映射到哪类故障”。这样分工之后,粒子群要处理的维度从几十上百降下来,适应度函数的计算也不需要在每次迭代里做大规模矩阵求逆,训练速度有明显改善。
提示:如果你看到训练过程中出现NaN或Inf,排查顺序是:宽度σ是否接近0、H矩阵是否有全零列、训练标签one-hot是否有空类,最后才查PSO参数。
3.3 最小可运行代码:MATLAB手写RBF+PSO流程
下面这份代码不依赖神经网络工具箱,MATLAB 2016b之后版本可以直接跑。先用模拟数据跑通流程,再替换成你自己的DGA数据。数据生成部分,我按6个类别、每类60个样本、5维特征来构造,类别用高斯簇模拟。
% 模拟数据构造:6类故障,每类60条,5维气体特征 rng(42); K = 6; % RBF隐节点数 = 类别数 M = 5; % 输入特征数:H2 CH4 C2H6 C2H4 C2H2 N_per_class = 60; X = []; T = []; centers_true = rand(K, M) * 0.8; for k = 1:K Xk = centers_true(k,:) + randn(N_per_class, M) * 0.1; X = [X; Xk]; Tk = zeros(N_per_class, K); Tk(:, k) = 1; T = [T; Tk]; end % 分层打乱并划分训练/测试 idx = randperm(size(X,1)); train_idx = idx(1:300); test_idx = idx(301:end); Xtr = X(train_idx,:); Ttr = T(train_idx,:); Xte = X(test_idx,:); Tte = T(test_idx,:); % 只基于训练集统计归一化,测试集沿用同一组参数 xmin = min(Xtr); xmax = max(Xtr); Xtr = (Xtr - xmin) ./ (xmax - xmin + eps); Xte = (Xte - xmin) ./ (xmax - xmin + eps);这段代码里,rng(42)固定随机种子是为了让结果可复现。K取6是因为模拟了6个类别,真实场景里如果你用七类故障,这里就改成7。归一化加eps是防止某个特征在训练集里最大值等于最小值时出现除零。
然后是适应度函数,这是PSO和RBF之间的桥梁。粒子传入的是中心和宽度的编码,适应度返回的是训练集上的均方误差:
function err = rbf_fitness(x, X, T, K) [N, M] = size(X); centers = reshape(x(1:K*M), K, M); sigmaCodes = x(K*M+1:end); widths = 0.02 + 0.8 * sigmaCodes; % 宽度映射到[0.02, 0.82] H = zeros(N, K); for j = 1:K d2 = sum((X - centers(j,:)).^2, 2); H(:,j) = exp(-d2 ./ (2 * widths(j)^2)); end lambda = 1e-3; W = (H'*H + lambda*eye(K)) \ (H'*T); % 岭回归求输出权值 Y = H * W; err = mean(sum((Y - T).^2, 2)); end宽度编码是这里最容易出错的地方。我没有直接让PSO在宽度空间里搜索,而是让粒子在[0,1]区间里给一个编码值sigmaCodes,解码时映射到[0.02, 0.82]。原因很实际:PSO不管边界约束设得多好,粒子速度碰撞时仍有可能把宽度顶到0附近,一旦宽度接近0,高斯函数分母趋近0,H矩阵出现极端值,后面求逆直接爆掉。用0.02作为下限,等于从编码设计上杜绝了这条事故链。
最后是PSO主循环:
Np = 30; % 种群规模 Tmax = 100; % 迭代次数 w_max = 0.9; w_min = 0.4; c1_s = 2.5; c1_e = 0.5; c2_s = 0.5; c2_e = 2.5; v_max = 0.2; D = K * M + K; % 粒子维度:K个中心坐标 + K个宽度编码 lower = zeros(1, D); upper = ones(1, D); % 混沌初始化,代替均匀随机初始化 pos = init_by_chaos(Np, D, lower, upper); vel = zeros(Np, D); pbest_pos = pos; pbest_fit = inf(Np, 1); for i = 1:Np pbest_fit(i) = rbf_fitness(pos(i,:), Xtr, Ttr, K); end [gbest_fit, gbest_idx] = min(pbest_fit); gbest_pos = pbest_pos(gbest_idx, :); stall = 0; for t = 1:Tmax % 非线性递减惯性权重:前期大步探索,后期精细收敛 w_cur = w_max - (w_max - w_min) * (t / Tmax)^2; c1 = c1_s + (c1_e - c1_s) * (t / Tmax); c2 = c2_s + (c2_e - c2_s) * (t / Tmax); updated = false; for i = 1:Np r1 = rand(1, D); r2 = rand(1, D); vel(i,:) = w_cur * vel(i,:) + ... c1 * r1 .* (pbest_pos(i,:) - pos(i,:)) + ... c2 * r2 .* (gbest_pos - pos(i,:)); vel(i, vel(i,:) > v_max) = v_max; vel(i, vel(i,:) < -v_max) = -v_max; pos(i,:) = pos(i,:) + vel(i,:); pos(i, pos(i,:) > upper) = upper; pos(i, pos(i,:) < lower) = lower; f = rbf_fitness(pos(i,:), Xtr, Ttr, K); if f < pbest_fit(i) pbest_pos(i,:) = pos(i,:); pbest_fit(i) = f; end if f < gbest_fit gbest_pos = pos(i,:); gbest_fit = f; updated = true; end end % 全局最优连续5代不更新,加小扰动跳出局部最优 if updated stall = 0; else stall = stall + 1; if stall >= 5 gbest_pos = gbest_pos + 0.03 * randn(1, D); gbest_pos = max(min(gbest_pos, upper), lower); gbest_fit = rbf_fitness(gbest_pos, Xtr, Ttr, K); stall = 0; end end end主循环里每个参数都有具体作用。v_max=0.2表示粒子每次只能移动搜索域宽度的20%,太小会缓慢爬行,太大会越过好区域。速度钳制不是把速度向量整体缩放,而是对每个维度单独截断,这样能防止某个维度速度超标拖累其他维度。混沌初始化函数单独拆出来,它对最终效果的影响不亚于惯性权重:
function pos = init_by_chaos(Np, D, lower, upper) pos = zeros(Np, D); x0 = rand(1, D) * 0.5 + 0.25; % 避免初值取到0或1 for i = 1:Np x0 = 4 * x0 .* (1 - x0); % Logistic混沌映射 pos(i,:) = lower + x0 .* (upper - lower); end endLogistic映射在参数取4时是经典混沌系统,相邻两条随机序列会快速分离,覆盖范围比均匀随机更均匀。初值避开0和1是因为混沌映射在这两个值上是固定点,一旦取到就永远卡在同一位置。真实数据上跑出结果后,用最优gbest_pos重建H矩阵、求W,再对测试集做预测,就是完整的诊断流程。
4. 改进PSO算法:自适应惯性权重、混沌初始化与停滞扰动
4.1 基础PSO参数怎么设:先记住这组经验值
标准PSO的速度更新公式是:
v_i(t+1) = wv_i(t) + c1r1*(pbest_i - x_i) + c2r2(gbest - x_i)
第一个分项是惯性,控制粒子沿原方向继续飞的趋势;第二项是认知项,让粒子往自己的历史最优位置靠;第三项是社会项,让粒子往整个种群的最优位置靠。三个系数直接决定搜索风格:w太大,粒子逛的范围广但收敛慢;w太小,种群快速聚拢,但可能聚到局部最优。
我一般用这组参数做起点:w从0.9线性或者非线性降到0.4,c1从2.5降到0.5,c2从0.5升到2.5,种群30到50,迭代100到200次,速度上限取搜索域宽度的20%。这组值不是拍脑袋,它对应一种常用策略:前期让粒子多探索自己的个体区域,后期把注意力集中到群体最优附近。对RBF参数搜索这种中等维度的优化问题,这个配置基本够用。
v_max值得单独说,把它设成搜索域宽度的30%以上,粒子经常一步跨过最优区域,后期靠碰撞边界来减速,收敛曲线会一直震荡。设太小则种群移动缓慢,100代可能才走完搜索域的一半。0.2这个比例在大多数RBF参数优化问题上表现不错,但如果你发现收敛曲线后期还在明显下降,可以把v_max降到0.1并增大迭代次数。
4.2 三个改进点:非线性惯性权重、时变学习因子、混沌初始化
基础PSO的问题是对初值敏感、后期容易早熟。改进PSO算法最常见的做法是朝三个方向动手。
一是惯性权重从线性递减改成非线性递减。线性递减公式是w = w_max - (w_max - w_min)*(t/Tmax),非线性递减我一般用平方形式:
w(t) = w_max - (w_max - w_min) * (t/Tmax)²
曲线前期下降慢,w长时间保持在大值附近,种群在前期有充分时间做广度探索;后期下降快,w迅速变小,粒子快速收敛。如果你发现原版PSO总是前30代就把种群挤到一小块区域,换成这个平方递减通常能明显改善。
二是学习因子时变化。c1前期大、后期小,c2反过来。前期粒子主要信任自己的历史经验,不容易被一个偶然的早期全局最优带偏;后期加强社会项,全种群协同往gbest周围精修。c1从2.5到0.5、c2从0.5到2.5都是连续变化,不要直接跳变,否则速度更新会产生突然的冲击。文中第3章主循环里已经按这个方式落地。
三是混沌初始化。PSO算法对初始种群的位置分布很敏感,均匀随机初始化在维数较高时容易出现局部区域粒子扎堆。用Logistic混沌映射生成的序列,粒子在搜索域中的分布更均匀,相当于让优化从多个有代表性的起点出发,减少初始随机性的玄学成分。这个方法改动量极小,只替代了rand那一行初始化,收益却稳定:在小样本任务上跑十次,改进PSO的方差通常比随机初始化小一截。
4.3 全局最优扰动:如何判断粒子群陷入局部最优
粒子群早熟的典型表现是:迭代到30代左右,gbest适应度曲线已经平了,但训练集误差仍然明显高于预期,此时粒子速度和位置都趋于零。让粒子在这个状态下继续迭代,实际上什么都不会发生。
我的做法是加一个停滞计数器。每当一次完整迭代中gbest没有任何更新,stall加1;一旦gbest更新,stall清零;如果stall大于等于5,就对gbest施加幅度为0.03的高斯扰动,然后重新计算gbest的适应度。扰动幅度是关键,太小了起不到跳出作用,太大了等于把已经找到的好解丢掉,0.03对应搜索域宽度的3%,是比较稳妥的值。扰动后必须用新的位置重新算适应度,否则gbest_fit和gbest_pos就不一致,后面的迭代会出现粒子被错误引导的情况。
这个扰动对RBF参数优化特别有效,因为RBF的适应度曲面存在不少平坦区域:中心稍微偏一点,高斯核还能覆盖住大部分样本,适应度变化很细微,PSO差分信号微弱,容易直接停住。加上扰动后,相当于隔一段时间给群体一个侧向推力,逼它去检查旁边是否还有更好的位置。需要提醒的是,扰动在迭代后期要慎用:如果你已经发现训练集误差降到目标范围,再扰动gbest只会破坏已收敛的解,建议只在迭代进行到80%之前开启,最后20%让群体自己安定下来。
5. 常见问题排查:数据泄漏、病态矩阵与三比值编码的五个坑
5.1 归一化泄漏:训练集和测试集精度差距大的时候先查这里
现象:训练集准确率99%,测试集突然掉到70%以下,而且每次随机划分结果浮动很大。原因:很可能是你在归一化时把全部数据放在一起计算了min和max,测试集的信息提前混进了训练流程。这不是模型问题,是数据处理流程问题。解决:先切分,再只基于训练集做归一化,测试集用同一组min和max做变换。第三章代码里已经按这个顺序写了。如果你还做了特征筛选或标准化的步骤,同样要放进训练集内计算,不能用全量数据的统计量。这个坑的隐蔽之处在于,模型结构完全没变,只是数据预处理顺序差了几行代码,效果就天差地别。
5.2 病态矩阵和NaN:宽度sigma取值不当的连锁反应
现象:PSO迭代过程中适应度出现NaN,或者训练阶段没有异常但测试输出全是同一个类别。原因:RBF宽度σ在优化过程中被顶到接近0,高斯函数分母趋近0,H矩阵出现极大值或全零列,矩阵求逆直接崩溃。另一种常见场景是两个中心初始化距离过近,导致H矩阵两列近乎完全线性相关,HᵀH接近奇异。解决:把宽度做下限保护,不要在原始宽度空间里直接搜索,采用0.02固定下限的编码映射,这是我在第三章用的方案;同时在适应度函数里加岭回归λ=1e-3,条件数再差也不会直接爆出Inf。如果你坚持直接在宽度空间搜索,至少要在适应度函数里加一句widths = max(widths, 0.01)的保护。
5.3 三比值编码直接当特征:类别变量连续化的典型翻车
现象:模型在测试集上整体准确率还行,但画混淆矩阵发现,中温过热和高温过热两类几乎完全混淆,而且预测结果出现“正常类压倒性占优”。原因:把IEC三比值编码的0/1/2三位整数直接拼到特征向量里,神经网络把编码值的数值大小当成了连续变量。编码0和2之间的距离被模型解读成“差两倍”,但实际三比值编码0和2只是类别编号,没有远近关系。解决:不用三比值编码,直接喂归一化后的气体含量;如果一定要用编码特征,转成one-hot再拼接。这个坑特别容易出现在参考了传统三比值论文的初学者代码里。
5.4 优化器提早停滞:粒子群陷入局部最优的排查思路
现象:改进PSO和普通PSO跑出来的最终精度几乎一样,改进项看不到收益。原因:可能不是改进无效,而是两组实验都停在了同一个局部最优附近,此时混沌初始化和惯性权重的作用被局部最优淹没了。排查方法是画收敛曲线:如果普通PSO在20代内就平坦,改进PSO到60代还在缓降,说明改进确实改变了搜索路径;如果两条曲线前20代就重合,先检查是不是粒子维度、边界设置或适应度函数有bug,不要急着下“改进无效”的结论。解决:先确认改进的PSO没被同样的局部解困住,再看测试集差异。扰动只对活力不足的种群有效,如果粒子群一直保持高动能,扰动反而干扰精修,这时应该把扰动幅度降低到0.01或者只对部分粒子施扰。
5.5 小样本下的准确率错觉:数据集划分和评价方式问题
现象:测试集准确率86%,看起来很漂亮,但实际诊断时低能放电样本几乎一个都认不出来。原因:数据里正常类占比高,放电类样本只有十几条,整体准确率被头部类别拉高了,少数类贡献很低甚至为负。解决:做分层抽样,保证训练集和测试集里每个类别的比例一致;评价时报告混淆矩阵和每类召回率,而不是只看总准确率。我见过不少诊断类项目把总体准确率当作唯一指标,结果现场一用就发现问题集中在少数类。另外如果类别不平衡严重,可以对少数类样本做SMOTE过采样,或把类别权重视作适应度函数的惩罚项,让PSO优化时不只是照顾多数类。这个坑不解决,后续所有“改进”都只是在好看的数字上自我安慰。
6. 用混淆矩阵和交叉验证收尾:别让“改进”停留在精度数字上
6.1 先看混淆矩阵,再谈“提升”
跑完一次训练,很多人第一件事是看准确率多少。准确率高不代表诊断可用,尤其在故障类别不平衡的数据上。我会先画混淆矩阵,逐个看每个类别的召回率,特别是局部放电、低能放电这种样本少但危害大的类别。如果正常类召回率98%、低能放电召回率40%,这个模型在工程上是不合格的。
% 用保存的最优粒子gbest_pos在测试集上重建输出 centers = reshape(gbest_pos(1:K*M), K, M); widths = 0.02 + 0.8 * gbest_pos(K*M+1:end); Hte = zeros(size(Xte,1), K); for j = 1:K d2 = sum((Xte - centers(j,:)).^2, 2); Hte(:,j) = exp(-d2 ./ (2 * widths(j)^2)); end W = (Hte'*Hte + 1e-3*eye(K)) \ (Hte'*Tte); Yte = Hte * W; [~, pred] = max(Yte, [], 2); [~, true] = max(Tte, [], 2); C = confusionmat(true, pred); recall = diag(C) ./ sum(C, 2);这段代码把测试集上的混淆矩阵和每个类别的召回率一次算出来。sum(C,2)是每一类的真实样本数,diag(C)是每类被正确预测的数量,两者相除就是召回率。如果某个类别对角线上的数字很小,说明这个故障模式没有被模型学到。我在实际项目里会固定好几个随机种子反复重跑,最后报告的是多次运行的平均召回率而不是最好的一次,因为诊断算法在现场要面对的是不确定的数据划分。
6.2 一个可复用的验证流程
现在我跑变压器故障诊断方案,不管用不用改进PSO,都按这个流程走:先分层切出训练集和测试集,在训练集内做归一化和特征筛选;跑改进PSO时需要记录收敛曲线和最终训练误差,确认不是随机初始化的偶然结果;测试集上输出混淆矩阵,算每类召回率;再把同样的流程用BP神经网络、普通PSO-RBF各跑一次,做对照。如果改进PSO只在训练集上高两个点、测试集上打平,那说明改进的价值不大;如果测试集上每类召回率都有提升,尤其是少数类,这个方案才值得投入。顺手可以把LSTM也试一下,我见过不少时序DGA数据上LSTM表现不如RBF的情况,因为样本量撑不起循环神经网络的参数。另外,如果你想在这个方向继续深入,小波Elman神经网络这类变体也可以尝试,但核心优化思路不变:先把RBF每个参数的含义讲清楚,再做网络结构上的扩展。这些年诊断模型越做越多,我养成的一个习惯是:任何一次试验都固定随机种子、存下混淆矩阵、记录测试集划分方式,然后再写结论。这也是我读这类改良算法论文时最先做的事。希望帮到你。
本文还有配套的精品资源,点击获取