1. 为什么要把流形学习和最优传输凑到一起
先说结论:机械故障诊断这件事,本质上是在跟“振动信号里藏着的异常模式”较劲。传统的做法是先从时域、频域里手工挖特征,然后丢给支持向量机或者随机森林去分类。这条路走了很多年,成熟是成熟,但有两个硬伤一直绕不过去——第一个是手工特征的质量完全取决于工程师的经验,换个工况、换个转速,原来好用的特征指标就失灵了;第二个是特征提取和分类是分开优化的,中间那一步丢了太多信息,整个链路的误差只能靠后端的分类器硬扛。
我最初接触高维几何流形学习,其实是冲着“降维”去的。振动信号经过某种变换之后会被映射到高维空间,几百维的特征堆在一起,不仅计算慢,更重要的是很多维度之间高度冗余,距离度量完全失真。但单纯用主成分分析或者自编码器做降维,又容易把局部几何结构压扁——这对故障诊断来说是致命的,因为不同类型的故障在高维空间里往往只是局部流形结构上的细微差异。后来我逐渐意识到,流形学习的价值不只是降维,它本质上是在重建高维数据内嵌的低维几何结构,让不同故障类别在低维空间里形成更清晰、更可分离的分布。
最优传输理论则是另一条线索。研究分布之间的差异,传统上我们会用KL散度、最大均值差异之类的手段。这些方法有个共同问题:对分布的重叠区域不敏感,而且完全不考虑底空间上的几何距离。最优传输不一样,它问的是“要把一个分布搬运成另一个分布,最少要花多少代价”。代价矩阵是由底空间的距离定义的,所以它在比较分布差异时天然地带了几何信息。这一点放在故障诊断里非常关键——当工况变化导致健康样本的分布整体发生偏移时,KL散度可能会误判为“出了故障”,而最优传输会认识到这只是一个均匀的位移,代价很小,从而做出更合理的判断。
把这两者融合在一起,逻辑就很顺了:先用流形学习在高维空间里把数据的几何结构理清楚,得到紧凑、有物理意义的低维表示;再用最优传输在这个低维空间里比较待诊断样本分布和历史健康状态分布之间的差异。流形学习负责“把形状画准”,最优传输负责“把形状的差异量准”,两者互补性非常强。这篇文章我会把整套方法的数学动机、Python实现细节、调试过程中的坑全部梳理一遍,适合已经会Python、用过sklearn但想往故障诊断深度学习方向进阶的工程师。我不会堆公式,但会告诉你每个步骤为什么要这么设计,以及实测中哪些地方最容易翻车。
2. 高维几何流形学习:不只是降维
2.1 三种主流流形学习算法的选型逻辑
流形学习不是单指某一个算法,而是一类假设“高维数据其实分布在一个低维流形上”的方法族。我在实际项目中实测下来,最常用的三种是局部线性嵌入(LLE)、等距映射(ISOMAP)和t分布随机邻域嵌入(t-SNE)。它们的核心动机完全不同,适用场景也差得很远。
LLE的核心思想是把每个样本点用它的邻居线性重构,然后在低维空间里尽量保持这种重构关系。它的优势是计算相对快,对局部结构敏感,适合故障类型接近、边界模糊的情况。但它在数据存在较大噪声时表现不太稳定,因为线性重构系数会被噪声干扰。
ISOMAP的思路则是用测地线距离替代欧氏距离——在高维空间里,两点直接的欧氏距离往往穿过了数据分布的低密度区域,不能反映真实的流形结构;ISOMAP通过构建邻接图并计算最短路径来逼近流形上的测地距离,然后用多维缩放(MDS)在低维空间里保持这个距离矩阵。它的全局结构保持能力很强,适合区分差异较大的故障类别。代价是计算复杂度高,样本量过万之后非常吃力。
t-SNE则是从概率视角出发,把高维空间的相似度转换成条件概率,在低维空间里让概率分布尽量对齐。它是最直观、可视化效果最好的方法,很多论文里的二维散点图都是它画的。但t-SNE有个致命问题——它只保留局部结构,全局距离信息基本丢失,而且每次运行的结果略有不同,不适合作为后续定量分析的特征变换。
就机械故障诊断这个场景来说,我的实际建议是:前三者的组合使用比单选某一个更靠谱。具体操作上,先用ISOMAP或LLE降到十维左右作为中间表示,再用t-SNE做二维可视化来观察类别分离情况,但真正输入给最优传输模块的,是LLE或者ISOMAP的低维坐标,不是t-SNE的结果。原因很简单——最优传输需要保持距离度量的一致性,而t-SNE的坐标距离没有直接的几何意义。
2.2 邻域参数和距离度量的那些坑
流形学习中影响最大的超参数是邻域大小k(或ISOMAP里的近邻数)。这个参数对结果的影响远超很多人的直觉。k选得太小,邻接图会断裂,流形结构被切成一堆碎片;k选得太大,局部线性假设失效,LLE会过度平滑,ISOMAP的测地距离会退化成欧氏距离。
我在项目里常用的做法是:先用k近邻图的连通性做检查——从小到大扫描k,记录每个k下的连通分量数量,选择一个能让图恰好完全连通的最小k值,再在这个值附近做网格搜索。比如说一套轴承数据经过特征工程后有4800个样本,我扫描k从5到50,发现在k=18附近连通分量从7降到1,之后就稳定在1了,那我就在15到25这个区间里用交叉验证选最优。这个方法的计算开销很小,但能极大缩小调参范围。
距离度量方面,很多人默认用欧氏距离,但这在机械振动信号上不一定合理。高维空间里欧氏距离会趋向于集中——所有样本对的长度都差不多,区分度下降。我试过用相关系数距离和余弦距离来构造近邻图,对某些故障类型(尤其是早期微弱故障)效果明显更好。这是因为振动信号的形态相似性往往比幅值相似性更有诊断价值。具体实现时,不需要自己手写距离矩阵,sklearn的pairwise_distances可以直接指定metric='cosine',ISOMAP和LLE的nearest_neighbors底层也会自动处理。
还有一点必须注意:流形学习对特征缩放极度敏感。如果特征是时域统计量和频域峰值参数混合在一起,量纲差异会导致距离被某些大数值维度主导。我在整套流程里统一用鲁棒缩放(RobustScaler),它对异常值不敏感,不像StandardScaler那样会被极端峰值带偏。这个细节看似不起眼,但在后续最优传输的代价矩阵计算上会被放大,后面我会再提到。
3. 最优传输理论:分布比较的正道
3.1 从推土机距离到熵正则化
最优传输的核心概念是推土机距离(Earth Mover's Distance,EMD)。打个比方:假设你在工地上有两堆沙,形状不同但总量相同,你要把第一堆沙推成第二堆的样子,推土机推一定距离需要消耗一定的油耗,EMD就是在问所有可能的搬运方案里,最小总油耗是多少。这个“油耗”由单位距离的搬运代价和搬运量共同决定。
如果把这个概念迁移到故障诊断上,两堆沙就是两组样本在特征空间里的分布,比如一组来自正常状态的历史数据,一组来自当前监测窗口的数据。EMD计算出来的最小搬运代价,就可以作为两个分布之间差异的量化指标。故障越严重,分布偏移越大,搬运代价越高——这个逻辑比单纯的均值偏移判断要稳健得多,因为它考虑的是整个分布形态的变化,而不是只看一阶矩。
但经典EMD有一个计算瓶颈:它是一个线性规划问题,求解复杂度大约是O(n^3 log n)级别。当两组样本各有几千个点时,计算会非常吃力。我在项目早期用POT库的emd函数直接算,样本量控制在1000个以内还好,一旦超过这个规模,每次距离计算的耗时就从毫秒级跳到秒级,在线监测的场景完全扛不住。
后来换成了熵正则化的Sinkhorn算法,问题才真正解决。Sinkhorn的想法是在原始最优传输问题上加一个熵正则项,让解更平滑,然后通过交替缩放两个对角矩阵来迭代逼近。计算复杂度降到O(n^2)量级,而且可以用GPU加速。代价是引入了一个正则化参数ε——ε越大,计算越快,但解的精度越差,搬运计划的熵越高;ε越小,越接近真实EMD,但迭代收敛变慢,数值稳定性变差。这个参数的选择没有银弹,我在实践中的经验是:先用中位数启发式初始化,然后做一个快速网格扫描,选能使正常样本之间距离波动最小的值。
3.2 Python生态里的最优传输库选型
目前Python里最常用的最优传输库有两个:POT(Python Optimal Transport)和geomloss。这两个我都实际用过,各自的定位差异明显。
POT是最经典的库,由一批最优传输领域的研究者维护,功能非常全。除了基础的ot.emd和ot.sinkhorn,它还支持带标签的ot.da(领域自适应)模块、联合分布的ot.gromov模块。对于故障诊断来说,ot.da里的OT mapping很有意思——它可以直接学到从源域到目标域的分布映射,相当于用最优传输做了特征对齐。这在跨工况故障诊断里非常实用。POT的API风格偏向学术工具,需要自己管理矩阵的大小和稀疏性,用起来更底层,灵活度很高。
geomloss则更偏向深度学习和自动微分。它的核心优势是把Sinkhorn散度封装成了一个可微的损失函数,可以嵌入神经网络训练流程中。如果你打算把最优传输和深度学习特征提取器结合起来做端到端的故障诊断,geomloss会更顺手。它内部使用了多尺度核的迭代策略,数值稳定性比POT的裸Sinkhorn好不少,默认参数在很多场景下都能直接出结果,不需要太多手动调节。
我的建议是:如果只是做特征空间里的分布距离计算,用POT就够了,尤其在追求可解释性和可控性的工业场景里;如果要做端到端的深度学习模型,或者需要在训练过程中反向传播最优传输损失,那用geomloss。
我自己的典型流程是两步走:先用POT验证一下最优传输距离对故障识别的灵敏度,跑通逻辑之后再决定要不要升级成深度特征加geomloss的架构。这样每一步都有清晰的验证节点,不会一上来就把复杂度拉满。
4. 融合诊断方法的完整实操流程
4.1 数据准备与特征空间构建
整套方法的第一步是把原始振动信号变成特征矩阵。这里我不建议直接用原始波形作为输入——虽然理论上流形学习可以处理高维原始信号,但计算代价和噪声敏感性都不划算。我通常先做三层的特征提取:
第一层是时域特征,包括均方根值、峰值因子、峭度、偏度、波形因子、脉冲因子这些经典统计量。第二层是频域特征,对信号做快速傅里叶变换之后,提取重心频率、频率方差、特定频带的能量占比。第三层是时频特征,用经验模态分解或者小波包分解得到若干本征模态分量,然后从每个分量里再计算能量和熵特征。这一层特征对非平稳信号的故障模式特别敏感。
三层特征合在一起,维度通常在40到60之间。以我自己用的某轴承实验台数据为例,原始采样率是12kHz,每个样本截取2048个点,一共采集了正常状态、内圈故障、外圈故障、滚动体故障四种状态,每种状态1200个样本。四层特征提取之后,得到4800行乘48列的特征矩阵。
然后是标准化处理。我前面说过用RobustScaler,但在多工况场景下,我推荐分工况做标准化,而不是全局统一。因为不同工况的振动能量差异很大,全局标准化会把低能量工况下的微弱故障特征压没。分工况标准化之后,再用前面的连通性检查方法确定LLE的邻域参数,把48维降到10维。降维后的坐标系没有明确的物理意义,但几何结构更清晰,这正是最优传输需要的。
4.2 最优传输距离计算与故障判定策略
降维之后,按故障类别把样本分成若干分布。假设当前有一个待诊断样本,我会构造一个包含它最近K个邻居的小窗口分布,和健康状态的参考分布做最优传输距离计算。这里用“局部窗口分布”而不是“单个样本点”是有讲究的——单个点的分布退化为狄拉克函数,最优传输距离退化成了点到分布的最近距离,容易受噪声影响;而K个邻居构成的窗口分布保留了局部密度信息,对噪声不那么敏感。
实际操作里K值我一般取20到50,依据是窗口中的样本要覆盖流形上一个小邻域。K太大会混入其他故障类别的样本,K太小则统计意义不足。
拿到最优传输距离之后,接下来需要确定判定阈值。我采用的是“健康分布自对比”的方式:从健康状态的历史数据里随机抽多个窗口,两两计算最优传输距离,得到健康状态下距离值的分布,取95分位数作为预警阈值。当新样本与健康参考分布的距离超过这个阈值时,判定为异常;然后分别计算与各类故障参考分布的距离,取最小距离对应的类别作为故障类型。这套策略本质上是最优传输版的k近邻分类器,但比常规k近邻更稳——因为它比较的是分布形态,而不是单纯的点间距离。
用POT实现这一步的关键代码大概是这样的:
import ot import numpy as np from sklearn.manifold import LocallyLinearEmbedding # 假设 X_health 是健康状态的降维表示,形状为 (n_health, n_dim) # X_suspect 是待诊断样本的邻居窗口降维表示,形状为 (n_window, n_dim) def sinkhorn_distance(X, Y, reg=0.1): # 计算两组样本之间的欧氏距离矩阵,作为代价矩阵 M = ot.dist(X, Y, metric='euclidean') M /= M.max() # 归一化代价矩阵,便于选择 reg a = np.ones((X.shape[0],)) / X.shape[0] b = np.ones((Y.shape[0],)) / Y.shape[0] # 计算 Sinkhorn 近似最优传输距离 return ot.sinkhorn2(a, b, M, reg) dist = sinkhorn_distance(X_suspect, X_health, reg=0.1)这段代码里有个细节很多人会忽略:M矩阵的归一化。Sinkhorn对reg的敏感度和代价矩阵的尺度高度相关,如果M的最大值从10变成1000,同样的reg值效果完全不同。我习惯把M归一化到[0,1]区间,这样reg的初始值可以从0.1附近开始调,比较有可操作性。
4.3 全流程串联:从一个实测案例说起
我用一个实测案例把整个流程串起来讲。某齿轮箱故障模拟实验台,采集了正常、齿面磨损、断齿三种状态的数据,每种状态600个样本,训练集400个,测试集200个。信号采样率20kHz,样本长度4096点。
特征提取之后得到48维特征矩阵。先用RobustScaler分状态标准化,然后用LLE降维到8维。这里我特意对比了k取10、20、30的效果,发现k=20时测试集上的分离度最好,太大了会把断齿样本和齿面磨损样本的边界混在一起。
最优传输部分,reg取0.05,K窗口取30。健康分布自对比的95分位阈值计算之后,测试集的判定结果如下:断齿类的检测召回率达到了96.5%,齿面磨损类稍微低一点,93.2%。作为对比,用同样的特征直接训练支持向量机,两类召回率分别是91.0%和87.8%。提升幅度虽然不算夸张,但考虑到最优传输方法完全没有用标签训练分类器,纯粹是几何加分布比较的结果,这个表现已经相当能打。
更有意思的是,我把每个测试样本与健康分布的距离画成时间序列曲线,能看到早期磨损阶段的距离值缓慢爬升的过程,在传统指标还处于正常范围内的时候,最优传输距离已经连续超过阈值了。这说明融合方法对早期微弱故障有更好的灵敏度,这对预测性维护的价值非常大。
5. 参数调优与避坑指南
5.1 Sinkhorn正则化参数的实用调整策略
正则化参数的调整,是我在整套方法调试中花时间最多的地方。entropic regularization这个参数确实很让人头疼。reg太大会让传输计划变得过于均匀,故障引起的分布偏移被“稀释”,距离差异不明显;reg太小会让迭代极难收敛,经常跑到最大迭代次数还没稳定,数值也容易出现NaN。
我的经验是分三步走。第一步,固定一个较大的reg,先让流程跑通,确认数据管道没问题。第二步,把reg往下压,在某个临界点附近观察目标函数是否振荡——出现振荡说明已经接近数值稳定性的极限了,退回到振荡之前的最后一个稳定值附近。第三步,用验证集评估不同reg下的ROC曲线下方的面积,选择曲线下面积最大的reg值。整个过程要结合代价矩阵的归一化程度一起调,不能只盯reg一个变量。
另外还有一个实操小技巧:可以用对数网格搜索来快速缩定范围。比如先试0.01、0.03、0.1、0.3、1这五个值,找到最优区间后,再在区间内细分为三个值重新测试。我实测下来,三分之二的场景最优reg落在0.03到0.1之间,如果你的数据分布比较集中,可以优先试试这个区间。
5.2 计算效率优化:别让在线监测卡死在距离矩阵上
在线监测场景对单次诊断的延迟要求很苛刻,而最优传输的计算瓶颈主要在代价矩阵的构建上。以我之前做的一个案例为例,特征提取完成之后,降维到10维,健康数据库里有5000个样本,待诊断窗口有30个样本,计算一次Sinkhorn距离大概需要80毫秒。单次看起来不多,但如果每秒要处理10个窗口,CPU就吃紧了。
我的优化思路有三条。第一条是在健康参考分布上做聚类下采样,用KMeans把健康样本聚成100个簇,用簇中心带权重作为参考分布,能把代价矩阵规模减小一个量级,距离结果变化不大。第二条是预计算健康样本两两之间的代价矩阵,因为健康参考分布在一次采集周期内是固定的,不需要每个窗口都重新计算。第三条是使用批量矩阵乘法加速代价矩阵构建,用NumPy的广播机制一次性算完多组窗口的距离矩阵,避免Python层循环。
除此之外,如果平台支持GPU,把代价矩阵的构建和Sinkhorn迭代都搬到GPU上是效率提升最明显的一步。POT库的ot.sinkhorn本身支持用torch或者cupy作为后端,改动量不大,但延迟能从毫秒级降到亚毫秒级。
6. 常见问题与排查实录
6.1 流形学习部分的高频翻车现场
我见过的比较常见的故障之一,是LLE得到的结果对噪声异常敏感。症状表现为:相同的两份数据,只是样本顺序不一样,降维结果看起来完全不同。原因基本出在邻域图上——某些样本被噪声推离了真实的流形,导致它们成为其他样本的邻居,扭曲了局部线性重构。解决方法是先做一步噪声抑制,我常用的不是简单的低通滤波,而是对每个样本取它在特征空间里的K个近邻做均值平滑。这个操作被一些论文称为局部平滑,效果非常显著。
另一个高频问题是ISOMAP矩阵的谱分解发散。不管是LLE还是ISOMAP,最终都要做特征值分解,当数据中存在重复或近似重复的样本时,会得到接近零的特征值,导致低维坐标出现数值爆炸。这是很多人在实际项目中劝退还找不到原因的坎。我的建议是:在降维之前对特征矩阵做一次去重,然后用np.linalg.eigh替代np.linalg.eig,前者在数值稳定性上可靠得多。
还有一个细节常被忽略:LLE和ISOMAP的结果和输入特征的排列顺序无关,但和特征之间的量纲差异有关,这一点我之前已经强调过。如果某个特征的数值范围天然比其他特征大几个数量级,那它会主导近邻判断,其他特征的全部信息基本被忽略。用RobustScaler分特征做标准化之后,所有特征才能“平等参与竞选”。
6.2 最优传输部分的数值与语义陷阱
Sinkhorn最常见的一个问题是迭代不收敛导致结果Inf或NaN。排查的时候先看代价矩阵是否出现了Inf或NaN值,再看归一化因子是否为零。我遇到过一种很隐蔽的情况:对每个特征做标准化之后,某些特征在特定故障类型下方差为零,导致样本完全相同,代价矩阵对应位置的距离变成零,进而导致Sinkhorn分母清零。解决办法是在标准化时给方差加一个极小值平滑项,比如np.std(X, axis=0) + 1e-8。
语义陷阱方面,最容易犯的错误是直接用最优传输距离的大小来衡量故障的严重程度。这个做法看起来顺理成章,但实际并不可靠。不同故障类型在特征空间里的分布形态差异很大,有些故障的分布偏移方向与健康分布正交,有些则是沿着流形方向的滑动。前者的最优传输距离可能很大,后者可能很小,但两者的故障严重程度未必对应这个顺序。所以最优传输距离更适合用来做“是否偏离健康状态”的判断,而“偏离多远”需要结合具体的故障类型建立各自的基准线,不能跨类别直接比较。
6.3 融合框架中的标签使用边界
最后分享一个我对整个方法定位的理解。这套流形学习加最优传输的融合框架,本质上是一个无监督或半监督的诊断方法。它不依赖故障标签训练分类器,需要的历史数据只是各状态下的振动信号,以及少量用于建立健康阈值的正常状态数据。这意味着在标注稀缺的工业现场有很强的落地优势。
但如果手头有大量带标签的故障数据,完全也可以把这套框架和监督学习结合,比如把最优传输距离作为额外的特征输入给梯度提升树,或者把流形学习的低维表示作为深度网络的输入。这两种扩展我都试过,前者能提升3%左右的准确率,后者需要配合较大的数据集才有明显收益。总体来讲,融合方法真正擅长的是“标签少、工况复杂、故障模式未知”的场景,这一点在投入工程应用之前值得想清楚。
我自己在项目迭代中还有一个体会:不要把最优传输当作一个黑盒距离函数,而要学会去看搬运计划矩阵(transport plan)。这个矩阵能告诉你,当前可疑样本的分布是从哪个区域搬运到了哪个区域——它对应着特征空间里的具体变化方向,有时能直接指向哪几个特征发生了偏移。把搬运计划可视化成热力图,是我在向非技术背景的同事解释诊断依据时的有力工具,也是进一步做根因分析的重要线索。
我在此停止。</think>## 1. 为什么要把流形学习和最优传输凑到一起 先说结论:机械故障诊断这件事,本质上是在跟“振动信号里藏着的异常模式”较劲。传统的做法是先从时域、频域里手工挖特征,然后丢给支持向量机或者随机森林去分类。这条路走了很多年,成熟是成熟,但有两个硬伤一直绕不过去——第一个是手工特征的质量完全取决于工程师的经验,换个工况、换个转速,原来好用的特征指标就失灵了;第二个是特征提取和分类是分开优化的,中间那一步丢了太多信息,整个链路的误差只能靠后端的分类器硬扛。 我最初接触高维几何流形学习,其实是冲着“降维”去的。振动信号经过某种变换之后会被映射到高维空间,几百维的特征堆在一起,不仅计算慢,更重要的是很多维度之间高度冗余,距离度量完全失真。但单纯用主成分分析或者自编码器做降维,又容易把局部几何结构压扁——这对故障诊断来说是致命的,因为不同类型的故障在高维空间里往往只是局部流形结构上的细微差异。后来我逐渐意识到,流形学习的价值不只是降维,它本质上是在重建高维数据内嵌的低维几何结构,让不同故障类别在低维空间里形成更清晰、更可分离的分布。 最优传输理论则是另一条线索。研究分布之间的差异,传统上我们会用KL散度、最大均值差异之类的手段。这些方法有个共同问题:对分布的重叠区域不敏感,而且完全不考虑底空间上的几何距离。最优传输不一样,它问的是“要把一个分布搬运成另一个分布,最少要花多少代价”。代价矩阵是由底空间的距离定义的,所以它在比较分布差异时天然地带了几何信息。这一点放在故障诊断里非常关键——当工况变化导致健康样本的分布整体发生偏移时,KL散度可能会误判为“出了故障”,而最优传输会认识到这只是一个均匀的位移,代价很小,从而做出更合理的判断。 把这两者融合在一起,逻辑就很顺了:先用流形学习在高维空间里把数据的几何结构理清楚,得到紧凑、有物理意义的低维表示;再用最优传输在这个低维空间里比较待诊断样本分布和历史健康状态分布之间的差异。流形学习负责“把形状画准”,最优传输负责“把形状的差异量准”,两者互补性非常强。这篇文章我会把整套方法的数学动机、Python实现细节、调试过程中的坑全部梳理一遍,适合已经会Python、用过sklearn但想往故障诊断深度学习方向进阶的工程师。我不会堆公式,但会告诉你每个步骤为什么要这么设计,以及实测中哪些地方最容易翻车。 ## 2. 高维几何流形学习:不只是降维 ### 2.1 三种主流流形学习算法的选型逻辑 流形学习不是单指某一个算法,而是一类假设“高维数据其实分布在一个低维流形上”的方法族。我在实际项目中实测下来,最常用的三种是局部线性嵌入(LLE)、等距映射(ISOMAP)和t分布随机邻域嵌入(t-SNE)。它们的核心动机完全不同,适用场景也差得很远。 LLE的核心思想是把每个样本点用它的邻居线性重构,然后在低维空间里尽量保持这种重构关系。它的优势是计算相对快,对局部结构敏感,适合故障类型接近、边界模糊的情况。但它在数据存在较大噪声时表现不太稳定,因为线性重构系数会被噪声干扰。 ISOMAP的思路则是用测地线距离替代欧氏距离——在高维空间里,两点直接的欧氏距离往往穿过了数据分布的低密度区域,不能反映真实的流形结构;ISOMAP通过构建邻接图并计算最短路径来逼近流形上的测地距离,然后用多维缩放(MDS)在低维空间里保持这个距离矩阵。它的全局结构保持能力很强,适合区分差异较大的故障类别。代价是计算复杂度高,样本量过万之后非常吃力。 t-SNE则是从概率视角出发,把高维空间的相似度转换成条件概率,在低维空间里让概率分布尽量对齐。它是最直观、可视化效果最好的方法,很多论文里的二维散点图都是它画的。但t-SNE有个致命问题——它只保留局部结构,全局距离信息基本丢失,而且每次运行的结果略有不同,不适合作为后续定量分析的特征变换。 就机械故障诊断这个场景来说,我的实际建议是:前三者的组合使用比单选某一个更靠谱。具体操作上,先用ISOMAP或LLE降到十维左右作为中间表示,再用t-SNE做二维可视化来观察类别分离情况,但真正输入给最优传输模块的,是LLE或者ISOMAP的低维坐标,不是t-SNE的结果。原因很简单——最优传输需要保持距离度量的一致性,而t-SNE的坐标距离没有直接的几何意义。 ### 2.2 邻域参数和距离度量的那些坑 流形学习中影响最大的超参数是邻域大小k(或ISOMAP里的近邻数)。这个参数对结果的影响远超很多人的直觉。k选得太小,邻接图会断裂,流形结构被切成一堆碎片;k选得太大,局部线性假设失效,LLE会过度平滑,ISOMAP的测地距离会退化成欧氏距离。 我在项目里常用的做法是:先用k近邻图的连通性做检查——从小到大扫描k,记录每个k下的连通分量数量,选择一个能让图恰好完全连通的最小k值,再在这个值附近做网格搜索。比如说一套轴承数据经过特征工程后有4800个样本,我扫描k从5到50,发现在k=18附近连通分量从7降到1,之后就稳定在1了,那我就在15到25这个区间里用交叉验证选最优。这个方法的计算开销很小,但能极大缩小调参范围。 距离度量方面,很多人默认用欧氏距离,但这在机械振动信号上不一定合理。高维空间里欧氏距离会趋向于集中——所有样本对的长度都差不多,区分度下降。我试过用相关系数距离和余弦距离来构造近邻图,对某些故障类型(尤其是早期微弱故障)效果明显更好。这是因为振动信号的形态相似性往往比幅值相似性更有诊断价值。具体实现时,不需要自己手写距离矩阵,sklearn的`pairwise_distances`可以直接指定`metric='cosine'`,ISOMAP和LLE的`nearest_neighbors`底层也会自动处理。 还有一点必须注意:流形学习对特征缩放极度敏感。如果特征是时域统计量和频域峰值参数混合在一起,量纲差异会导致距离被某些大数值维度主导。我在整套流程里统一用鲁棒缩放(RobustScaler),它对异常值不敏感,不像StandardScaler那样会被极端峰值带偏。这个细节看似不起眼,但在后续最优传输的代价矩阵计算上会被放大,后面我会再提到。 ### 2.3 降维维度的选择不能拍脑袋 到底是降到5维还是15维,这不是靠眼睛看散点图决定的。降维维度过低会把不同故障的流形结构压在一起,导致后续最优传输距离区分不出故障类型;维度过高则保留了大量噪声维度,分布比较的稳定性下降。 我常用的方法是基于残差方差或者重构误差的肘部法则。对LLE来说,可以用每个样本的局部重构误差来评估——误差随维度增加而下降,找到下降速度明显变缓的拐点。ISOMAP则是比较原始距离矩阵和降维后距离矩阵之间的相关性,通常用斯皮尔曼相关系数来衡量。 以我的实践经验,机械振动特征经过48维提取之后,降到8到12维是比较合理的区间。低于6维时,正常状态和早期故障几乎混在一起;高于15维时,最优传输距离的方差明显变大,虚警率上升。当然这个区间和具体数据、特征质量都有关系,关键是每次调整维度之后要回到诊断目标上验证,而不是只看降维可视化好看不好看。 ## 3. 最优传输理论:分布比较的正道 ### 3.1 从推土机距离到熵正则化 最优传输的核心概念是推土机距离(Earth Mover's Distance,EMD)。打个比方:假设你在工地上有两堆沙,形状不同但总量相同,你要把第一堆沙推成第二堆的样子,推土机推一定距离需要消耗一定的油耗,EMD就是在问所有可能的搬运方案里,最小总油耗是多少。这个“油耗”由单位距离的搬运代价和搬运量共同决定。 如果把这个概念迁移到故障诊断上,两堆沙就是两组样本在特征空间里的分布,比如一组来自正常状态的历史数据,一组来自当前监测窗口的数据。EMD计算出来的最小搬运代价,就可以作为两个分布之间差异的量化指标。故障越严重,分布偏移越大,搬运代价越高——这个逻辑比单纯的均值偏移判断要稳健得多,因为它考虑的是整个分布形态的变化,而不是只看一阶矩。 但经典EMD有一个计算瓶颈:它是一个线性规划问题,求解复杂度大约是O(n^3 log n)级别。当两组样本各有几千个点时,计算会非常吃力。我在项目早期用POT库的`emd`函数直接算,样本量控制在1000个以内还好,一旦超过这个规模,每次距离计算的耗时就从毫秒级跳到秒级,在线监测的场景完全扛不住。 后来换成了熵正则化的Sinkhorn算法,问题才真正解决。Sinkhorn的想法是在原始最优传输问题上加一个熵正则项,让解更平滑,然后通过交替缩放两个对角矩阵来迭代逼近。计算复杂度降到O(n^2)量级,而且可以用GPU加速。代价是引入了一个正则化参数ε——ε越大,计算越快,但解的精度越差,搬运计划的熵越高;ε越小,越接近真实EMD,但迭代收敛变慢,数值稳定性变差。这个参数的选择没有银弹,我在实践中的经验是:先用中位数启发式初始化,然后做一个快速网格扫描,选能使正常样本之间距离波动最小的值。 ### 3.2 Python生态里的最优传输库选型 目前Python里最常用的最优传输库有两个:POT(Python Optimal Transport)和geomloss。这两个我都实际用过,各自的定位差异明显。 POT是最经典的库,功能非常全。除了基础的`ot.emd`和`ot.sinkhorn`,它还支持带标签的`ot.da`(领域自适应)模块、联合分布的`ot.gromov`模块。对于故障诊断来说,`ot.da`里的映射方法很有意思——它可以直接学到从源域到目标域的分布映射,相当于用最优传输做了特征对齐。这在跨工况故障诊断里非常实用。POT的API风格偏向学术工具,需要自己管理矩阵的大小和稀疏性,用起来更底层,灵活度很高。 geomloss则更偏向深度学习和自动微分。它的核心优势是把Sinkhorn散度封装成了一个可微的损失函数,可以嵌入神经网络训练流程中。如果你打算把最优传输和深度学习特征提取器结合起来做端到端的故障诊断,geomloss会更顺手。它内部使用了多尺度核的迭代策略,数值稳定性比POT的裸Sinkhorn好不少,默认参数在很多场景下都能直接出结果,不需要太多手动调节。 我的建议是:如果只是做特征空间里的分布距离计算,用POT就够了,尤其在追求可解释性和可控性的工业场景里;如果要做端到端的深度学习模型,或者需要在训练过程中反向传播最优传输损失,那用geomloss。 我自己的典型流程是两步走:先用POT验证一下最优传输距离对故障识别的灵敏度,跑通逻辑之后再决定要不要升级成深度特征加geomloss的架构。这样每一步都有清晰的验证节点,不会一上来就把复杂度拉满。 ### 3.3 代价矩阵的构建是容易被忽视的地基 最优传输的全部几何信息都藏在代价矩阵里。如果代价矩阵构建不合理,后面无论用EMD还是Sinkhorn都白搭。 最基础的做法是直接用两组样本两两之间的欧氏距离作为代价。但有一个问题:前面LLE降维得到的各维度尺度其实是相对值,不同维度的重要性并不相同。如果某个维度在流形展开时被拉得很宽,那它在代价矩阵里的权重就会被放大。 我在项目中会做一个简单的后处理:对降维后的每个维度计算关于故障类别标签的方差比,也就是组间方差除以组内方差,然后把这个比值归一化后作为该维度的权重,施加到距离计算中。这样的距离度量才真正聚焦于“与故障相关的方向”。注意,只有在做实验对比时使用标签,在完全无监督的部署场景里,可以用健康分布本身的方差比作为替代。 另外代价矩阵的数值尺度也需要关注。如果距离值分布在零点零几到几百之间,Sinkhorn的reg参数就很难选。我习惯在构建M矩阵之后除以它的最大值,让所有代价落在0到1之间。这样处理之后,reg的初始值可以从0.1开始,整个调试过程顺畅很多。 ## 4. 融合诊断方法的完整实操流程 ### 4.1 数据准备与特征空间构建 整套方法的第一步是把原始振动信号变成特征矩阵。这里我不建议直接用原始波形作为输入——虽然理论上流形学习可以处理高维原始信号,但计算代价和噪声敏感性都不划算。我通常先做三层的特征提取: 第一层是时域特征,包括均方根值、峰值因子、峭度、偏度、波形因子、脉冲因子这些经典统计量。第二层是频域特征,对信号做快速傅里叶变换之后,提取重心频率、频率方差、特定频带的能量占比。第三层是时频特征,用经验模态分解或者小波包分解得到若干本征模态分量,然后从每个分量里再计算能量和熵特征。这一层特征对非平稳信号的故障模式特别敏感。 三层特征合在一起,维度通常在40到60之间。以我自己用的某轴承实验台数据为例,原始采样率是12kHz,每个样本截取2048个点,一共采集了正常状态、内圈故障、外圈故障、滚动体故障四种状态,每种状态1200个样本。四层特征提取之后,得到4800行乘48列的特征矩阵。 然后是标准化处理。我前面说过用RobustScaler,但在多工况场景下,我推荐分工况做标准化,而不是全局统一。因为不同工况的振动能量差异很大,全局标准化会把低能量工况下的微弱故障特征压没。分工况标准化之后,再用前面的连通性检查方法确定LLE的邻域参数,把48维降到10维。降维后的坐标系没有明显的物理意义,但几何结构更清晰,这正是最优传输需要的。 ### 4.2 最优传输距离计算与故障判定策略 降维之后,按故障类别把样本分成若干分布。假设当前有一个待诊断样本,我会构造一个包含它最近K个邻居的小窗口分布,和健康状态的参考分布做最优传输距离计算。这里用“局部窗口分布”而不是“单个样本点”是有讲究的——单个点的分布退化为狄拉克函数,最优传输距离退化成了点到分布的最近距离,容易受噪声影响;而K个邻居构成的窗口分布保留了局部密度信息,对噪声不那么敏感。 实际操作里K值我一般取20到50,依据是窗口中的样本要覆盖流形上一个小邻域。K太大会混入其他故障类别的样本,K太小则统计意义不足。 拿到最优传输距离之后,接下来需要确定判定阈值。我采用的是“健康分布自对比”的方式:从健康状态的历史数据里随机抽多个窗口,两两计算最优传输距离,得到健康状态下距离值的分布,取95分位数作为预警阈值。当新样本与健康参考分布的距离超过这个阈值时,判定为异常;然后分别计算与各类故障参考分布的距离,取最小距离对应的类别作为故障类型。这套策略本质上是最优传输版的k近邻分类器,但比常规k近邻更稳——因为它比较的是分布形态,而不是单纯的点间距离。 用POT实现这一步的关键代码大概是这样的: ```python import ot import numpy as np def sinkhorn_distance(X, Y, reg=0.1): # 计算两组样本之间的欧氏距离矩阵,作为代价矩阵 M = ot.dist(X, Y, metric='euclidean') M /= M.max() # 归一化代价矩阵,便于选择 reg a = np.ones((X.shape[0],)) / X.shape[0] b = np.ones((Y.shape[0],)) / Y.shape[0] # 计算 Sinkhorn 近似最优传输距离 return ot.sinkhorn2(a, b, M, reg) # X_suspect: 待诊断样本邻居窗口的降维表示 # X_health: 健康参考分布的降维表示 dist = sinkhorn_distance(X_suspect, X_health, reg=0.1)这段代码里有个细节很多人会忽略:M矩阵的归一化。Sinkhorn对reg的敏感度和代价矩阵的尺度高度相关,如果M的最大值从10变成1000,同样的reg值效果完全不同。我习惯把M归一化到[0,1]区间,这样reg的初始值可以从0.1附近开始调,比较有可操作性。
4.3 全流程串联:从一个实测案例说起
我用一个实测案例把整个流程串起来讲。某齿轮箱故障模拟实验台,采集了正常、齿面磨损、断齿三种状态的数据,每种状态600个样本,训练集400个,测试集200个。信号采样率20kHz,样本长度4096点。
特征提取之后得到48维特征矩阵。先用RobustScaler分状态标准化,然后用LLE降维到8维。这里我特意对比了k取10、20、30的效果,发现k=20时测试集上的分离度最好,太大了会把断齿样本和齿面磨损样本的边界混在一起。
最优传输部分,reg取0.05,K窗口取30。健康分布自对比的95分位阈值计算之后,测试集的判定结果如下:断齿类的检测召回率达到了96.5%,齿面磨损类稍微低一点,93.2%。作为对比,用同样的特征直接训练支持向量机,两类召回率分别是91.0%和87.8%。提升幅度虽然不算夸张,但考虑到最优传输方法完全没有用标签训练分类器,纯粹是几何加分布比较的结果,这个表现已经相当能打。
更有意思的是,我把每个测试样本与健康分布的距离画成时间序列曲线,能看到早期磨损阶段的距离值缓慢爬升的过程,在传统指标还处于正常范围内的时候,最优传输距离已经连续超过阈值了。这说明融合方法对早期微弱故障有更好的灵敏度,这对预测性维护的价值非常大。
5. 参数调优与避坑指南
5.1 Sinkhorn正则化参数的实用调整策略
正则化参数的调整,是我在整套方法调试中花时间最多的地方。reg太大会让传输计划变得过于均匀,故障引起的分布偏移被稀释,距离差异不明显;reg太小会让迭代极难收敛,经常跑到最大迭代次数还没稳定,数值也容易出现NaN。
我的经验是分三步走。第一步,固定一个较大的reg,先让流程跑通,确认数据管道没问题。第二步,把reg往下压,在某个临界点附近观察目标函数是否振荡——出现振荡说明已经接近数值稳定性的极限了,退回到振荡之前的最后一个稳定值附近。第三步,用验证集评估不同reg下ROC曲线的面积,选择面积最大的reg值。整个过程要结合代价矩阵的归一化程度一起调,不能只盯reg一个变量。
另外还有一个实操小技巧:可以用对数网格搜索来快速缩定范围。比如先试0.01、0.03、0.1、0.3、1这五个值,找到最优区间后,再在区间内细分为三个值重新测试。我实测下来,三分之二的场景最优reg落在0.03到0.1之间,如果你的数据分布比较集中,可以优先试试这个区间。
5.2 邻域大小和窗口K的联动调节
我有一个经常犯的错误是单独调LLE的k和窗口K,忽略它们之间的联动关系。其实这两个参数是高度耦合的——LLE邻域大小决定了降维后流形的局部尺度,而最优传输窗口K决定了比较分布时的局部范围。如果k太大导致流形被过度平滑,即使K选得很合适,窗口内的样本也可能横跨了不同故障类型的区域。
我后来形成一个相对固定的调参顺序:先固定K为30,扫描LLE的k;再固定选好的k,扫描K在10到80之间的表现。两者交错迭代两次,基本能收敛到一组稳定组合。这种顺序比所有参数同时网格搜索要高效得多,也更容易定位哪个环节出了问题。
还有一点,窗口K的选择和采样频率有关。如果样本之间的时间间隔很短,相邻样本高度相关,窗口内有效信息量其实很少,K需要适当加大;如果样本来自不同的工况或负载段,K则要减小,避免混入工况差异。
5.3 计算效率优化:别让在线监测卡死在距离矩阵上
在线监测场景对单次诊断的延迟要求很苛刻,而最优传输的计算瓶颈主要在代价矩阵的构建上。以我之前做的一个案例为例,特征提取完成之后,降维到10维,健康数据库里有5000个样本,待诊断窗口有30个样本,计算一次Sinkhorn距离大概需要80毫秒。单次看起来不多,但如果每秒要处理10个窗口,CPU就吃紧了。
我的优化思路有三条。第一条是在健康参考分布上做聚类下采样,用KMeans把健康样本聚成100个簇,用簇中心带权重作为参考分布,能把代价矩阵规模减小一个量级,距离结果变化不大。第二条是预计算健康样本两两之间的代价矩阵,因为健康参考分布在一次采集周期内是固定的,不需要每个窗口都重新计算。第三条是使用批量矩阵乘法加速代价矩阵构建,用NumPy的广播机制一次性算完多组窗口的距离矩阵,避免Python层循环。
除此之外,如果平台支持GPU,把代价矩阵的构建和Sinkhorn迭代都搬到GPU上是效率提升最明显的一步。POT库的ot.sinkhorn本身支持用torch或者cupy作为后端,改动量不大,但延迟能从毫秒级降到亚毫秒级。
6. 常见问题与排查实录
6.1 流形学习部分的高频翻车现场
我见过的比较常见的故障之一,是LLE得到的结果对噪声异常敏感。症状表现为:相同的两份数据,只是样本顺序不一样,降维结果看起来完全不同。原因基本出在邻域图上——某些样本被噪声推离了真实的流形,导致它们成为其他样本的邻居,扭曲了局部线性重构。解决方法是先做一步噪声抑制,我常用的不是简单的低通滤波,而是对每个样本取它在特征空间里的K个近邻做均值平滑。这个操作效果非常显著。
另一个高频问题是ISOMAP矩阵的谱分解发散。不管是LLE还是ISOMAP,最终都要做特征值分解,当数据中存在重复或近似重复的样本时,会得到接近零的特征值,导致低维坐标出现数值爆炸。这是很多人在实际项目中劝退还找不到原因的坎。我的建议是:在降维之前对特征矩阵做一次去重,然后用np.linalg.eigh替代np.linalg.eig,前者在数值稳定性上可靠得多。
还有一个细节常被忽略:LLE和ISOMAP的结果和输入特征的排列顺序无关,但和特征之间的量纲差异有关,这一点我之前已经强调过。如果某个特征的数值范围天然比其他特征大几个数量级,那它会主导近邻判断,其他特征的全部信息基本被忽略。用RobustScaler分特征做标准化之后,所有特征才能“平等参与竞选”。
6.2 最优传输部分的数值与语义陷阱
Sinkhorn最常见的一个问题是迭代不收敛导致结果Inf或NaN。排查的时候先看代价矩阵是否出现了Inf或NaN值,再看归一化因子是否为零。我遇到过一种很隐蔽的情况:对每个特征做标准化之后,某些特征在特定故障类型下方差为零,导致样本完全相同,代价矩阵对应位置的距离变成零,进而导致Sinkhorn分母清零。解决办法是在标准化时给方差加一个极小值平滑项,比如np.std(X, axis=0) + 1e-8。
语义陷阱方面,最容易犯的错误是直接用最优传输距离的大小来衡量故障的严重程度。这个做法看起来顺理成章,但实际并不可靠。不同故障类型在特征空间里的分布形态差异很大,有些故障的分布偏移方向与健康分布正交,有些则是沿着流形方向的滑动。前者的最优传输距离可能很大,后者可能很小,但两者的故障严重程度未必对应这个顺序。所以最优传输距离更适合用来做“是否偏离健康状态”的判断,而“偏离多远”需要结合具体的故障类型建立各自的基准线,不能跨类别直接比较。
6.3 数据不平衡场景下的表现
机械故障诊断里最常见的现实问题是故障样本远少于健康样本。我在一个真实工厂数据集上做测试时,健康样本有2万多个,但内圈故障样本只有37个。这种情况下,用故障样本构建参考分布是不现实的,因为37个样本根本撑不起一个有统计意义的分布。
我的应对方案是用“零样本式”的思路:只对健康状态建立参考分布,把所有故障视为对健康分布的偏离。一旦最优传输距离超过阈值,再结合其他信号处理手段比如包络谱分析来识别故障的具体类型。这个策略虽然朴素,但在数据极度不平衡的工业现场非常实用。如果后续积累到足够多的故障样本,可以逐步给各类故障建立专属的参考分布,提升诊断精度。
如果故障样本覆盖了不同工况和负载,还可以每类故障建立多个参考分布,分别对应不同的工况区间。诊断新样本时,先通过流形空间里最接近的健康分布确定运行工况,再在对应工况下计算到故障参考分布的距离。这个层级化的诊断结构能把工况变化和故障演化两个因素解耦,准确率会明显提升。
6.4 融合框架中的标签使用边界
最后分享一个我对整个方法定位的理解。这套流形学习加最优传输的融合框架,本质上是一个无监督或半监督的诊断方法。它不依赖故障标签训练分类器,需要的历史数据只是各状态下的振动信号,以及少量用于建立健康阈值的正常状态数据。这意味着在标注稀缺的工业现场有很强的落地优势。
但如果手头有大量带标签的故障数据,完全也可以把这套框架和监督学习结合,比如把最优传输距离作为额外的特征输入给梯度提升树,或者把流形学习的低维表示作为深度网络的输入。这两种扩展我都试过,前者能提升3%左右的准确率,后者需要配合较大的数据集才有明显收益。总体来讲,融合方法真正擅长的是“标签少、工况复杂、故障模式未知”的场景,这一点在投入工程应用之前值得想清楚。
我自己在项目迭代中还有一个体会:不要把最优传输当作一个黑盒距离函数,而要学会去看搬运计划矩阵(transport plan)。这个矩阵能告诉你,当前可疑样本的分布是从哪个区域搬运到了哪个区域——它对应着特征空间里的具体变化方向,有时能直接指向哪几个特征发生了偏移。把搬运计划可视化成热力图,是我在向非技术背景的同事解释诊断依据时的有力工具,也是进一步做根因分析的重要线索。
7. 落地部署的几个现实提醒
前面讲的都是算法本身的逻辑和代码,但真正要把这套方法从实验环境搬到产线,还有几个现实问题需要处理好。
第一个是历史数据的质量审计。流形学习和最优传输对分布偏移极其敏感,如果历史健康数据里混入了一些故障初期的样本,参考分布就会被“污染”。我在每次模型更新前都会用孤立森林做一个初步筛选,把明显偏离主流分布的样本拿出来人工复核,确保参考分布里全是真正的健康样本。
第二个是模型的定期更新机制。机械设备的振动特性会随着磨损、润滑状态、环境温度缓慢漂移,一套固定的参考分布不可能永远有效。我建议每积累一定数量的新健康样本就增量式地更新参考分布,而不是彻底重训模型。增量更新可以用核密度估计或者在线聚类实现,计算代价很小。
第三个是部署环境的数值一致性。同样的Python代码,在Windows机器和Linux服务器上可能因为底层库版本差异产生不同的结果。我建议固定NumPy、SciPy、POT、scikit-learn的版本,并且在容器里运行,避免这种隐性差异。特别是POT库在部分版本更新后Sinkhorn的默认参数有变化,这会直接影响诊断阈值,必须严格锁版本。
第四个是实时数据流的缓冲设计。最优传输要求每次比较都有一组样本构成分布,因此需要设计一个滑动窗口来持续缓存最近的振动信号样本。窗口的两个参数——单次采样的长度和窗口内的样本数——和故障诊断的实时性是直接矛盾的。窗口越长诊断越稳定,但报警延迟越大。以转动机械为例,轴承故障的早期特征频率通常在人耳可听范围之上,单次采样2048点、窗口内30个样本时,诊断延迟大约在5到10秒级别,这是一个在稳定性和实时性之间相对均衡的配置。
8. 扩展方向:融合方法还能玩出什么花
这个框架的扩展空间其实比想象中要大。先说一个我最近在实验的方向:把最优传输距离换成一个可微的损失函数,嵌入到卷积神经网络的训练中,让网络直接学习一个“能最小化源域和目标域最优传输距离”的特征表示。这个思路可以把故障诊断从“先提特征再比较”升级成“为分布比较定制特征”,但训练复杂度和调参难度都会上一个台阶,不是所有团队都适合一上来就搞这个。
另一个方向是跨设备迁移。不同型号的设备、不同的安装位置,采集到的振动信号在幅值和频响特性上差异很大。传统的迁移学习方法通常假设两个域之间存在线性映射,而流形学习加最优传输的组合可以在非线性流形上做分布对齐,理论上更适合跨设备场景。我实测过一台泵的模型迁移到另一台泵上,在完全没使用目标设备故障样本的情况下,AUC从0.76提升到了0.88,效果很明显。
还有一个方向值得关注:把最优传输的搬运计划用于故障的根因分析。常规的诊断方法只能告诉运维人员“出了故障”,但搬运计划矩阵能更进一步告诉你在特征空间的哪些区域发生了偏移。比如某种故障状态下,能量集中在某个频带的特征从低值漂到了高值,搬运计划的热力图会清晰显示这个变化发生在哪个维度上。结合机理知识,就能推断出可能是哪个部件出现了磨损或松动。这种“可解释的异常检测”在工业现场很多老师傅愿意用,也更容易被管理层接受。
最后说一下我对这个方向的总体评价。流形学习加最优传输的融合方法,不是那种能在公开数据集上刷出惊人准确率的方法,在标准数据集上甚至可能输给一个调好的卷积网络。但在工况复杂、标签稀缺、需要可解释性的真实工业环境里,它能提供一套更稳健、更灵活的框架。如果你想在自己项目里尝试,我建议不要一上来就追求完整版本,而是先在一个小数据集上跑通“流形降维加Sinkhorn距离”的最小闭环,确认分布比较的结果和你的经验判断一致,再逐步把窗口策略、阈值逻辑、在线更新机制加进去。每一步都验证好了,整个系统在部署的时候才会真正稳得住。