news 2026/10/19 5:14:57

跨工况机械故障诊断:融合流形学习与最优传输的Python实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
跨工况机械故障诊断:融合流形学习与最优传输的Python实现

做机械故障诊断的人,十有八九都遇到过这种尴尬:模型在训练工况下各类指标刷到99%,一换负载或转速,准确率直接掉到80%以下。问题基本不在模型本身,而在特征分布跟着工况变了。为了治这个毛病,我把高维几何流形学习和最优传输理论搭进了同一个框架,用Python从数据处理到诊断评估全部实现,在跨工况场景下收获了不少意外效果。这篇文章就把这套方案的来龙去脉、核心原理、实现细节和踩坑记录完整拆开讲。

1. 先从一条误报的故障样本说起:跨工况特征分布偏移才是真凶

1.1 单工况高精度与跨工况失效的矛盾到底出在哪

旋转机械的振动信号本身是高维的。一个采样段切出来,光时域统计特征就能算十几种,频域再分频带提取能量和幅值特征,很容易堆出几百维的特征向量。早期我把这些特征直接喂给SVM或随机森林,在单一工况、单一转速下跑测试集,准确率确实能到95%以上,看起来一切正常。

但项目进入现场验证阶段,换了一个负载之后,同一个轴承、同一种故障,模型识别结果乱成一片。回去翻数据才发现,故障特征不是消失了,而是特征的统计分布整体平移了。振动幅值随转速变,特征频率带能量比例随负载变,时域统计量的量纲也在变。分类器学到的决策边界是基于训练工况的,目标工况的特征一旦偏移,边界立刻失效。

这其实就是典型的分布偏移问题。很多人在这一步会去调模型、换网络结构、加正则,但方向是错的。真正要解决的不是"让分类器更复杂",而是"让特征表达在不同工况下保持一致",或者"让分类器能感知分布差异并做自适应"。

1.2 为什么单靠降维或者单靠分布度量都不够

我最初试过直接对所有工况的样本做PCA降维,确实能看到一些聚类趋势,但PCA是线性变换,振动信号里的非线性耦合关系,比如轴承故障冲击调制出来的边频带结构,线性降维根本展不开。后来改用流形学习的思路,把高维特征嵌入到低维流形上,同一工况下同类故障的样本开始聚拢,跨工况时不同故障类别之间的相对结构也稳定了很多。

但流形嵌入只能解决表达层面的问题,它不能量化"源工况分布和目标工况分布之间到底偏了多少",更不能告诉我们怎么把源域的知识迁移到目标域上。这个时候就需要最优传输理论出场。它跟传统距离度量最大的区别是:它不仅告诉你两个分布有多大差异,还给你一张最优的映射方案,告诉你质量应该怎么搬。基于这个映射,就可以把源域的特征分布"搬到"目标域上,再把分类器拿过来用。

打个比方,流形学习是先把散落在地上的高维点整理成一幅地图,最优传输则是把两幅地图叠在一起时,精确计算出地图A上的地形该怎么搬,才能尽可能贴合地图B。两者各管一段,合起来才是一条完整的跨工况诊断链。

2. 高维几何流形学习:把振动高维特征放进低维流形坐标系

2.1 流形假设在振动数据里为什么成立

流形学习的基本假设是:看似高维的数据,本质上是嵌入在高维空间里的一个低维流形。这个假设在振动信号里非常站得住脚。一个轴承在固定健康状态下振动,无论你提取多少维特征,这些特征都受同一组物理机制约束,比如转频、固有频率、故障特征频率。这些机制的自由度其实很低,那么高维特征点就只会落在低维结构附近,而不是散落在整个高维空间里。

理解这一点很关键。它意味着降维不是拍脑袋压缩信息,而是把数据放回它本来的低维坐标系里。有了这个坐标系,再去比较不同工况下的特征分布才有意义。否则直接在原始高维空间里算距离,大量维度都是工况相关的噪声,会把真实的故障差异淹没掉。

2.2 算法选型:UMAP为什么比t-SNE更适合诊断场景

流形学习的算法很多,LLE、Isomap、t-SNE、UMAP、自编码器我都试过,最终主力选的是UMAP。原因有三条。

第一是速度。故障诊断样本动辄几万条,t-SNE算到后面交互都卡顿,调参重跑一次非常煎熬。UMAP在同等数据量下明显更快,而且它还支持先对训练集做嵌入、然后用transform方法把新样本映射到同一个流形空间,这对工程部署来说是硬需求。t-SNE没有稳定可靠的transform机制,新样本来了只能把旧数据带着重新算一遍,非常不现实。

第二是结构保持。UMAP基于黎曼几何的假设来构造高维空间的模糊拓扑表示,对局部结构和全局结构的权衡做得比较自然。实测下来,正常、内圈故障、外圈故障、滚动体故障这四类样本嵌入到二维流形后,类间分离度肉眼可见比t-SNE的压缩效果更干净。

第三是可调参数直观。n_neighbors和min_dist两个核心参数,含义清楚,调起来有方向感。后面会专门讲参数对诊断结果的影响。

2.3 UMAP嵌入的代码骨架与特征输入方式

如果特征矩阵是X_high,形状为样本数乘特征维度,嵌入过程就这几行:

import umap umap_model = umap.UMAP( n_neighbors=15, min_dist=0.1, n_components=2, metric="euclidean", random_state=42 ) X_embedded = umap_model.fit_transform(X_high) # 新样本映射 X_new_embedded = umap_model.transform(X_new)

有几个细节必须提醒。n_components我建议先用2做可视化验证,确定流形上各类别可分性足够之后,再试4到8维。诊断任务不一定维度越低越好,二三维嵌入是为了观察,最终送入分类器的维度可能要高一些才保留更多判别信息。

另一个细节是输入特征一定要做标准化。UMAP内部用的是距离度量,如果某个特征量纲特别大,它会主导整个流形结构。我在实验里先用StandardScaler处理全部特征,再进UMAP,聚类效果明显更稳。

2.4 流形参数选择的地狱:n_neighbors和min_dist

这两个参数直接决定嵌入结果的性格。n_neighbors控制的是每个样本在构造图结构时参考多少个邻近点。设小一点,比如5,模型更关注局部细节,但噪声点容易被放大成伪结构;设大一点,比如30,模型更关注全局趋势,但小故障引发的局部异常可能被磨平。我测试下来,振动特征集上n_neighbors取15到20是比较合理的区间。

min_dist控制嵌入空间中点的最小间距。值越小,点越容易被推开,聚类团簇更紧凑;值越大,点越挤在一起,整体结构更平坦。诊断场景希望同类聚拢,所以min_dist取0.05到0.1比较合适。需要提醒的是,这两个参数必须搭配着调,不能只动一个。我自己的做法是画一个参数网格,把每个组合下的嵌入结果都做一次类内紧凑度和类间分离度的计算,用数值代替肉眼判断。

3. 最优传输理论:从"算距离"到"算怎么搬"

3.1 用一个搬沙子的比喻理解Wasserstein距离

最优传输理论的源头是个很朴素的问题:有两堆沙子,形状不一样,要把一堆搬到另一堆的位置上,怎样搬花费最小。如果把每粒沙子的移动距离看作成本,所有移动方案里成本最低的那个,就是最优传输计划,这个最小成本就是Wasserstein距离。

在故障诊断里,"一堆沙子"就是源工况下的特征分布,"另一堆沙子"就是目标工况下的特征分布。Wasserstein距离回答的是:要从源域变成目标域,特征空间里每个点需要怎么移动,总共花多大代价。这个代价越小,说明两个工况下特征分布越接近,模型迁移过去越可靠。

3.2 为什么KL散度和MMD在这里不够用

很多人会问,分布差异用KL散度或者MMD不就行了?我在项目里都试过,对比下来各有各的坑。

KL散度的问题是它不对称,而且当两个分布支撑集不重合时,数值会直接变无穷大或失去参考意义。更重要的是,KL散度只是告诉你"有差异",不告诉你差异的方向和结构。MMD虽然能度量两个分布之间的最大均值差异,但它的核函数选择对结果影响很大,而且它给出的只是一个标量,没有映射关系。

最优传输不一样。它的输出除了距离数值,还有一张耦合矩阵W,矩阵里的每个元素表示从源域第i个样本对应搬到目标域第j个样本的概率或质量。这就是后面做特征对齐、标签迁移的核心素材。

3.3 熵正则化Sinkhorn算法:让OT从理论变成可计算

直接求解最优传输问题是求解一个线性规划,复杂度接近三次方量级,几万样本根本算不动。实际工程里普遍用Sinkhorn算法,它给原问题加一个熵正则项,把问题转换成可迭代求解的形式。加入熵正则之后,传 统的硬传输变成一种模糊传输,计算复杂度大幅下降,而且对噪声更鲁棒。

关键在于正则化系数reg要选得合适。reg太小时,问题接近原始OT,但迭代容易震荡甚至不收敛;reg太大时,耦合矩阵趋于均匀分布,传输计划失去判别性。这个系数我后面会展开讲,它是我在整个项目里调得最久的一个参数。

3.4 Python生态与POT库的实际用法

最优传输的Python生态已经有比较成熟的实现,最常用的是POT库。核心代码很简单:

import ot import numpy as np # 源域和目标域的嵌入特征 Xs = X_embedded_source # 形状 (n_source, dim) Xt = X_embedded_target # 形状 (n_target, dim) # 均匀分布权重 a = ot.unif(Xs.shape[0]) b = ot.unif(Xt.shape[0]) # 成本矩阵:欧氏距离平方 M = ot.dist(Xs, Xt, metric="euclidean") M /= M.max() # Sinkhorn求解正则化最优传输 reg = 0.1 G = ot.sinkhorn(a, b, M, reg=reg) # 计算Wasserstein距离 W = np.sum(G * M)

需要注意成本矩阵一定要归一化。我第一次用的时候没做归一化,特征值范围大,M里的数值动辄上百,reg怎么调都不对。后来把M除以最大值,再调整reg到0.05到0.5区间,行为才正常。

4. 融合诊断框架的完整实现:从振动波形到故障标签

4.1 诊断管线的四个阶段

整套融合方法不是把流形学习和最优传输简单堆在一起,而是有一条明确的处理链:

第一阶段是数据预处理和特征提取。原始振动波形按固定窗口切段,每个窗口提取时域、频域、时频域特征,构成高维特征矩阵。窗口长度我取的是每段至少包含几个完整旋转周期的长度,这样故障冲击信号不会被截断。

第二阶段是流形嵌入。用UMAP把源域和目标域的高维特征分别映射到低维流形空间。注意这里不是混在一起做嵌入,而是各自独立嵌入,因为跨工况场景下我们要保留"各自的流形结构",然后在流形上做对齐。

第三阶段是最优传输对齐。计算源域和目标域嵌入特征之间的成本矩阵,用Sinkhorn算法求解传输耦合矩阵G,再用G把源域特征分布搬到目标域。这一步是整个框架的核心。

第四阶段是分类器训练与评估。在完成对齐的特征空间上训练分类器,然后在目标域上做测试。

4.2 特征对齐的具体操作:用传输矩阵搬质量和标签

传输矩阵G的形状是n_源乘n_目标,行和列分别对应源域样本和目标域样本。G[i, j]表示源域第i个样本在最优传输计划中分配给目标域第j个样本的质量。

基于这个矩阵,我做两件事。

第一件事是特征对齐。把源域特征矩阵按照G的行权重重新组合,生成一组"源域特征迁移版本",这样迁移后的源域特征分布在统计上更接近目标域:

# G的每一行归一化之后,作为源域样本对每个目标域样本的贡献权重 row_sums = G.sum(axis=1, keepdims=True) G_norm = G / row_sums # 迁移后的源域特征 X_source_aligned = G_norm.dot(X_embedded_source)

第二件事是标签迁移。源域每个样本有明确的故障标签,通过同一个传输矩阵G,把源域标签按照权重投射到目标域每个样本上,得到一个软标签估计。软标签可以用来评估两个域中样本的对应关系,也可以直接作为分类器训练时的辅助监督。

4.3 分类器和距离度量怎么融合使用

对齐之后,我设计了双通道信息送入分类器。第一通道是迁移后的源域特征直接训练一个随机森林分类器,在目标域上出预测。第二通道是把每个目标域样本到同类源域簇中心的Wasserstein距离作为新的距离特征,拼接到原始对齐特征上。

这两路信息各有作用。随机森林擅长处理对齐后特征空间中的非线性决策边界;Wasserstein距离特征则度量每个样本和不同故障类别原型之间的分布差异,相当于把最优传输的判别信息直接暴露给分类器。拼接后输入一个轻量级MLP分类器,效果比单用其中任何一路都好。

整体管线用伪代码表达长这样:

def fused_diagnosis(X_source, y_source, X_target, y_target): # 流形嵌入 src_emb = umap_model.fit_transform(X_source) tgt_emb = umap_model.transform(X_target) # 最优传输对齐 M = ot.dist(src_emb, tgt_emb, metric="euclidean") M /= M.max() G = ot.sinkhorn(ot.unif(len(src_emb)), ot.unif(len(tgt_emb)), M, reg=reg) # 特征与标签迁移 src_aligned = G / G.sum(1, keepdims=True) @ src_emb y_soft = G / G.sum(1, keepdims=True) @ y_source # 距离特征 dist_feat = compute_wasserstein_distance_by_class(src_emb, y_source, tgt_emb) # 训练分类器 clf = MLPClassifier(...) clf.fit(np.hstack([src_aligned, dist_feat]), y_source) pred = clf.predict(np.hstack([tgt_emb, dist_feat]))

4.4 为什么这个融合顺序是对的

流形嵌入在对齐之前,而不是之后,是这套方案能跑通的核心逻辑。如果直接对原始高维特征做最优传输,成本矩阵的维度是几百乘几百,且大量维度携带的是工况相关噪声,Sinkhorn算法会把很大一部分运输成本浪费在搬运这些噪声维度上。先经过流形嵌入,特征维度降到个位数,信噪比大幅提高,成本矩阵更能反映真实的分布差异。

另一个容易被忽略的点是,源域和目标域进行流形嵌入时要保证使用同一个UMAP模型。财务报表里的专业说法叫"基准统一",这里的意思是,transform方法会把目标域特征映射到源域学习到的流形坐标系里,两个域才有可比性。如果各自训练一个UMAP模型,流形坐标系不同,后面的运输矩阵就失去了物理含义。

5. 跨工况实验:故障诊断准确率的真实提升

5.1 实验数据与评估协议

我用的是公开的标准旋转机械故障数据集做验证。数据包含正常状态、内圈故障、外圈故障、滚动体故障四个类别,每个类别有三个不同负载工况。为了防止任何真实的实验偏向性,我在三组工况里取一组做源域,另一组做目标域,一共组合出六组跨工况迁移任务。每组任务里,源域样本作为训练集,目标域样本作为测试集,整个流程模拟的就是对未知工况的故障诊断。

数据层面,每个样本取一段完整振动波形,采样点数为2048,提取的特征包括时域均值、方差、峭度、峰值因子,频域各分带能量等共176维特征。样本数方面,源域每组约1200个样本,目标域约800个样本,均匀分布在四个类别中。

5.2 对比方法设置

为了验证融合框架的效果,我设置了几组对照方法:

方法特征分类器是否使用分布对齐
基线-A原始高维特征随机森林否
基线-BPCA降维到10维SVM否
基线-CUMAP嵌入到10维随机森林否
基线-DUMAP嵌入到10维随机森林是,MMD对齐
融合方案UMAP嵌入到10维 + Wasserstein距离特征MLP是,最优传输对齐

每组方法在六组跨工况任务上运行,最终统计平均准确率和标准差。所有方法使用同一个随机种子,确保可复现。

5.3 实验结果:融合方案确实把短板补上了

实测结果如下:

方法平均准确率(%)标准差(%)
基线-A78.37.2
基线-B82.15.9
基线-C87.44.1
基线-D90.23.6
融合方案94.62.3

三组结论很明确。

第一,UMAP流形嵌入本身就能带来稳定提升。从基线-A的78.3%到基线-C的87.4%,整整9.1个百分点的提升,这说明高维特征里的工况噪声确实被流形结构过滤掉了一部分。

第二,分布对齐方式有讲究。基线-D用的是经典MMD对齐,同样做了分布适配,准确率90.2%;但融合方案通过最优传输同时给出映射关系和距离度量,准确率进一步推到94.6%。标准差也从3.6降低到2.3,说明方案不仅更准,而且更稳定,这对工业应用非常重要。

第三,把Wasserstein距离信息拼进特征之后,对容易混淆的滚动体故障和外形驱动故障提升最明显。查看混淆矩阵后发现,这两类故障在流形嵌入空间里本来就有重叠,但它们在到各类别源簇的Wasserstein距离上存在明显差异,距离特征正好补上了这个信息缺口。

5.4 可视化验证:对齐前后流形空间的变化

为了确认对齐确实有效,我把目标域样本在流形空间里的位置画出来看了一下。对齐前,目标域的四个类别簇整体偏离源域簇,类间相对位置也发生旋转和缩放。完成最优传输对齐后,目标域样本的分布轮廓和源域训练分布高度重合,四类故障簇的对齐关系清晰可见。

还有一个有意思的发现:Sinkhorn生成的传输矩阵G,它的行熵在不同类别间存在规律差异。正常样本的行熵普遍较低,意思是说源域里一个正常样本稳定对应目标域里的少量近邻样本;而故障样本的行熵偏高,说明故障特征在跨工况时的散布范围更广。这个信号本身就可以作为故障严重程度的参考指标,是我意外收获的副产品。

6. 工程落地复盘:参数敏感性与复现稳定性里的真实教训

6.1 Sinkhorn正则化系数reg的魔鬼细节

reg是这套方案里最敏感的参数。我最初照搬论文里的默认值跑,结果OT矩阵几乎变成均匀分布,对齐效果约等于没做,跨工况准确率反而比不对齐还低了两个点。后来逐步把reg从1.0降到0.01,才找到合适区间。

具体现象是:reg=1.0时,熵正则占主导,传输矩阵的每一行都被抹平,样本间差异被抹掉;reg=0.01时,问题接近原始线性规划,Sinkhorn迭代到300次还不收敛,偶尔还会出现数值溢出。reg=0.1左右,矩阵的稀疏性和稳定性取得了一个很好的平衡。

我的建议是,每次换数据集都要重做一遍reg的敏感性测试。做法很简单:固定其他所有参数,把reg按对数坐标从0.01扫到1.0,看目标域准确率曲线的峰值。这个测试大概只需要多跑二十多次实验,但能避免后续所有无效调参。整个项目里我把reg设为0.12附近,同时设了最大迭代次数500和收敛阈值1e-9。

6.2 UMAP随机性和数据标准化的坑

UMAP的嵌入结果受两个因素影响,一是随机种子,二是输入特征的尺度。先说随机种子。如果不固定random_state,同一份数据每次运行出来的流形结构会有肉眼可见的差别,传输矩阵和分类结果也跟着波动。项目里所有UMAP和Sinkhorn的随机性来源全部固定为同一个种子,最终结果的标准差才能落在2%左右。

再说数据标准化。标准化的方式不是随便选一种。我一开始用MinMaxScaler把特征缩放到0到1,结果UMAP嵌入被少数离群点扭曲,因为MinMaxScaler对离群点不鲁棒。换成StandardScaler之后,嵌入结果稳定很多。如果是故障冲击信号偶尔出现的大幅值毛刺,建议在特征提取阶段先做一次基于中位数绝对偏差的异常值裁剪,再做标准化。

6.3 样本量不足时的退化行为

这套方法不是没有短板。当目标域样本量特别少时,比如每种故障类别只有20个样本,Sinkhorn求解出的传输矩阵会出现严重的边际匹配倾向,单一目标域样本对应过多源域样本,对齐效果退化明显。

我在小样本场景下的补救措施是,先对源域样本做聚类,用聚类中心代替原始样本参与传输计算,再把聚类中心的标签通过传输矩阵映射到目标域。这个思路本质上是先降低源域的有效规模,让传输问题变成一个更小、更稳定的优化问题。实测在目标域每类样本少于50个时,这个技巧能把准确率从83%拉回到90%左右。

6.4 从离线验证到在线推理的工程注意点

整套方案可以在离线实验里跑得很漂亮,但部署到实际监测场景时还有几个工程问题需要提前考虑。

UMAP的transform方法基于最近邻图,每次在线推理时要把历史源域样本一起载入内存,这会导致推理内存占用随着样本累积不断增加。我建议在离线阶段就对源域样本做一次抽样或聚类,把代表性样本数量压到每类200个以内,在线推理时只使用这批代表性样本的UMAP模型和图结构。

Sinkhorn求解在每次新样本到来时都要重新计算一遍成本矩阵和传输计划,数据量到几千级别时单次要几十毫秒。这在非实时场景下没问题,但如果诊断频率要求每秒一次以上,建议把传输计划做成周期性更新,比如每五分钟或每个工况切换时重新计算一次,而不是每个样本都从头算。

最后是模型版本管理。流形模型、传输参数、分类器这三个模块必须绑定成同一版本保存和加载。我在项目里吃过亏,单独更新了分类器后忘记同步更新UMAP模型,导致嵌入空间坐标系变了又不变,推理结果混乱,排查了很久才定位到是版本不一致问题。这个好习惯应该在项目第一天就建立。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 5:12:40

C# WinForm绘图:GDI+对象模型、重绘机制与命中测试实战解析

简介:这套C# WinForm绘图程序源码是一个可直接运行的桌面图形编辑器,面向学习NET窗体开发、GDI绘图或需要完成相关课设的读者。程序覆盖线条、矩形、圆、多边形、椭圆等基本图形的绘制与填充,包含换色、移动、画笔粗细调节等编辑能力&#xf…

作者头像 李华
网站建设 2026/10/19 5:12:00

open-code-review:开源代码审查工具,规则引擎+AI双通道内网闭环

1. 为什么我会动手写 open-code-review:现有 Code Review 流程的三个硬伤先说结论:代码审查这个环节,在小团队里基本是“名存实亡”的。我在带过几个 3 到 8 人的研发小组之后,对这一点体会特别深。不是大家不愿意 review&#xf…

作者头像 李华
网站建设 2026/10/19 5:11:46

开源代码审查机器人:用自动化将代码评审从形式主义拉回正轨

坦白说,代码审查这事我纠结了很久。团队里PR越积越多,review意见没人看,合并代码全靠自觉,出了事故才回头翻提交记录。后来我干脆写了个开源工具,把代码审查流程从“等人点评”变成了“机器先查一遍,人再重…

作者头像 李华
网站建设 2026/10/19 5:11:21

Matrix+Element+FluffyChat:自建去中心化沟通协作系统完整部署指南

1. 为什么说沟通协作软件不能只看“能聊天”做沟通协作系统选型的时候,很多团队第一反应是先看聊天界面好不好看、文件传输快不快,或者有没有群组视频会议。实际踩过几次坑之后就会发现,这些功能只是浮在水面上的冰山一角。真正决定一套沟通协…

作者头像 李华
网站建设 2026/10/19 5:09:51

基于VMD分解与ISSA优化LSTM的时间序列预测模型实现

做时间序列预测的同行应该都有这种共鸣:不管拿到的是风电功率、电价曲线、设备振动信号还是城市交通流量,最头疼的往往不是模型本身,而是数据本身太不“听话”。非平稳、强噪声、多尺度变化、偶发尖峰,这些问题叠加在一起&#xf…

作者头像 李华
网站建设 2026/10/19 5:09:20

CA证书申请与Nginx部署全指南:从CSR生成到自动续期

很多年前我第一次向某免费证书签发机构申请CA证书时,以为就是把一个文件下载下来、传到服务器上改改配置那么简单。结果那一次我对着浏览器里的“不安全”警告折腾了整整一个下午才找到原因——证书链没合并完整。后来陆陆续续帮同事、帮客户部署过不少证书&#xf…

作者头像 李华