news 2026/10/3 8:51:48

VMD排列熵与极限学习机在轴承故障诊断中的协同优化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VMD排列熵与极限学习机在轴承故障诊断中的协同优化

简介:本资源是一套面向机械故障诊断研究者与工业智能化工程师的Python实践方案,聚焦滚动轴承早期故障识别这一典型工业场景,融合VMD信号分解、排列熵特征提取与ELM快速分类三大核心技术。压缩包共407个文件(404个txt日志/数据文件、2个核心py脚本、1个CSV特征数据),总大小4.8MB,结构清晰:vmd-pailieshang.py实现VMD分解与排列熵计算,ELM.py完成模型训练与分类,大量txt文件为不同工况下的内圈故障振动样本(如inner0.txt至inner62.txt),便于多状态对比验证。已有633人学习下载,资源开箱即用,无需配置依赖,完整复现从原始信号处理、特征向量构建到故障类型判别的全流程,附带可直接运行的代码与实测数据,显著降低VMD-ELM方法在设备预测性维护中的应用门槛。

1. 为什么VMD排列熵+ELM这个组合在滚动轴承故障诊断里突然火了?

你手头有一台振动传感器采集的轴承时序数据,采样率12kHz,单通道、30秒一段,共12类工况(正常+11种故障)。传统方法跑完FFT、包络谱、小波阈值降噪,再喂给SVM或随机森林——准确率卡在92%上不去,尤其内圈轻微剥落和滚动体早期点蚀总被误判为正常。这不是模型不行,是特征没把“非线性、非平稳、微弱冲击”这三座大山真正撬开。

VMD排列熵+ELM正是冲着这个痛点来的:VMD把原始信号自适应分解成若干本征模态分量(IMF),不依赖先验基函数,比EMD少模态混叠;排列熵(Permutation Entropy, PE)从每个IMF里提取复杂度序列,对微弱冲击敏感、抗噪声强;ELM作为超快速单隐层前馈网络,用随机权重+最小二乘求解输出层,训练速度比SVM快两个数量级,且泛化能力在小样本故障数据上反而更稳。

这不是炫技组合——它解决了三个硬约束:工业现场边缘设备算力有限(ELM轻量)、故障样本稀缺(PE对样本量不敏感)、振动信号强非平稳(VMD比小波/EMD更稳)。我去年在风电齿轮箱轴承实测中,用这套流程把早期故障检出时间提前了17小时,误报率压到0.8%。如果你正被“特征工程提不出判别性指标”或“模型训得慢、上线部署卡顿”折磨,这篇就是为你写的实战笔记。


2. VMD分解:不是调个K值就完事,关键在中心频率约束与惩罚因子协同

VMD分解质量直接决定后续排列熵的判别力。很多新手直接套用vmdpy库默认参数(K=5, alpha=2000),结果分解出大量无物理意义的高频噪声分量,或者把冲击成分强行拆散到多个IMF里——排列熵一算全是平滑曲线,故障特征全丢光。必须抓住两个核心参数的耦合关系:惩罚因子alpha和模态数K。

2.1 用中心频率谱锁定真实模态数K

VMD分解后每个IMF都有其主频带,真实故障冲击对应的IMF必然在轴承理论故障频率(BPFO/BPFI/BSF/FTF)附近有能量峰值。不能靠肉眼数IMF个数,要用中心频率分布图定量判断:

import numpy as np from vmdpy import VMD import matplotlib.pyplot as plt # 假设data是你的原始振动信号 (N,) data = np.load("bearing_vibration.npy") # shape: (120000,) # 初始试探:K=8, alpha=2000 K_init = 8 alpha_init = 2000 u, u_hat, omega = VMD(data, alpha=alpha_init, K=K_init, tau=0, DC=0, init=1, tol=1e-7) # 计算每个IMF的中心频率(用FFT幅值加权平均) center_freqs = [] fs = 12000 # 采样率 for imf in u: fft_spec = np.abs(np.fft.fft(imf)) freqs = np.fft.fftfreq(len(imf), d=1/fs) # 只取正频部分 pos_mask = freqs > 0 weighted_freq = np.sum(freqs[pos_mask] * fft_spec[pos_mask]) / np.sum(fft_spec[pos_mask]) center_freqs.append(weighted_freq) # 绘制中心频率分布 plt.figure(figsize=(10,4)) plt.stem(range(1, K_init+1), center_freqs, use_line_collection=True) plt.xlabel('IMF Index') plt.ylabel('Center Frequency (Hz)') plt.title('VMD Center Frequencies Distribution') plt.grid(True, alpha=0.3) plt.show()

逻辑说明:这段代码输出的茎状图会显示8个IMF各自的中心频率。若发现第3、5、7个IMF的中心频率分别落在BPFI(~162Hz)、2×BPFI(~324Hz)、3×BPFI(~486Hz)附近,且能量占比高(可通过np.var(u[i]) / np.var(data)计算方差贡献率),则K=8合理;若第1、2个IMF中心频率>3kHz且方差贡献>40%,说明alpha太小,噪声被当成了有效模态——此时需增大alpha。

2.2 alpha与K的黄金配比:用重构误差反向校准

alpha过大会抑制高频细节,过小则无法分离模态。正确做法是固定K,扫描alpha(建议范围500~5000),计算VMD重构信号与原始信号的归一化均方误差(NMSE):

def calculate_nmse(original, reconstructed): return np.sqrt(np.mean((original - reconstructed)**2)) / (np.std(original) + 1e-8) alphas = np.arange(500, 5500, 500) nmse_scores = [] for alpha in alphas: u, _, _ = VMD(data, alpha=alpha, K=K_init, tau=0, DC=0, init=1, tol=1e-7) recon = np.sum(u, axis=0) # 重构信号 nmse = calculate_nmse(data, recon) nmse_scores.append(nmse) plt.plot(alphas, nmse_scores, 'o-') plt.xlabel('Alpha') plt.ylabel('NMSE') plt.title('NMSE vs Alpha (K fixed)') plt.grid(True, alpha=0.3) plt.show()

参数说明:

  • NMSE < 0.05:重构保真度高,alpha可接受;
  • NMSE曲线出现明显“U型谷底”:谷底对应最优alpha(通常在2000~3500区间);
  • 若NMSE随alpha单调下降:说明K设小了,需增大K重新扫描;
  • 若NMSE在alpha=1000时已达0.02,但中心频率图显示故障频带被拆散,则宁可接受NMSE=0.035也要选alpha=3000——故障诊断优先保特征完整性,而非信号保真度。

3. 排列熵计算:不是直接调sklearn,要重写以适配IMF序列特性

很多教程直接用sklearn.feature_extraction.image.extract_patches_2d或第三方PE库,但排列熵对IMF这种短序列(典型长度2000~5000点)、含强周期冲击的信号极其敏感——默认的延迟时间τ=1、嵌入维数m=3会漏掉高阶动态特征。必须手动实现并针对轴承信号优化参数。

3.1 嵌入维数m的选择:用Cao准则避免虚假饱和

m太小(如m=2)无法捕获非线性,太大(如m=7)导致相空间稀疏、熵值失真。Cao准则通过计算相邻向量距离比值E1(m)来确定最小充分m:

def cao_criterion(ts, max_m=7, tau=1): """Cao准则计算E1(m),返回推荐m值""" def get_embedding(ts, m, tau): n = len(ts) emb = np.zeros((n - (m-1)*tau, m)) for i in range(m): start = i * tau emb[:, i] = ts[start:start + emb.shape[0]] return emb E1_values = [] for m in range(2, max_m+1): emb = get_embedding(ts, m, tau) emb_next = get_embedding(ts, m+1, tau) # 计算每个点在m维空间的最近邻距离 dist_m = np.zeros(emb.shape[0]) for i in range(emb.shape[0]): dists = np.linalg.norm(emb - emb[i], axis=1) dists[i] = np.inf dist_m[i] = np.min(dists) # 计算在m+1维空间的对应距离 dist_m1 = np.zeros(emb_next.shape[0]) for i in range(emb_next.shape[0]): dists = np.linalg.norm(emb_next - emb_next[i], axis=1) dists[i] = np.inf dist_m1[i] = np.min(dists) # E1(m) = mean(dist_m1 / dist_m) ratio = dist_m1[:len(dist_m)] / (dist_m + 1e-10) E1_values.append(np.mean(ratio)) # E1(m)趋于稳定时的m即为推荐值 diffs = np.diff(E1_values) stable_idx = np.where(np.abs(diffs) < 0.05)[0] return stable_idx[0] + 2 if len(stable_idx) > 0 else 3 # 对每个IMF计算推荐m recommended_m = [] for imf in u: # u是VMD分解得到的IMF矩阵 m_opt = cao_criterion(imf, max_m=6) recommended_m.append(m_opt) print("Recommended m per IMF:", recommended_m) # 输出类似 [3, 4, 3, 5, ...]

逻辑说明:Cao准则本质是检测相空间重构是否已充分——当E1(m)变化率<0.05,说明增加维度不再带来新信息。轴承IMF因含冲击,通常m=4比m=3更能区分内圈/外圈故障。

3.2 排列熵计算:手动实现并加入白化预处理

原始PE对幅值敏感,而轴承冲击幅值受负载影响大。必须先对IMF做Z-score白化(减均值除标准差),再计算PE:

def permutation_entropy(ts, m=3, tau=1): """手动实现排列熵,支持白化""" # 白化处理 ts_norm = (ts - np.mean(ts)) / (np.std(ts) + 1e-8) # 构造相空间向量 n = len(ts_norm) vectors = np.zeros((n - (m-1)*tau, m)) for i in range(m): start = i * tau vectors[:, i] = ts_norm[start:start + vectors.shape[0]] # 生成所有可能的排列模式(m!种) from itertools import permutations patterns = list(permutations(range(m))) pattern_count = {p: 0 for p in patterns} # 对每个向量排序,映射到排列模式 for vec in vectors: # 获取排序索引(处理相等值:按位置顺序) sorted_idx = np.argsort(vec, kind='stable') # 转换为元组作为字典键 pattern_key = tuple(sorted_idx.tolist()) if pattern_key in pattern_count: pattern_count[pattern_key] += 1 # 计算概率分布 probs = np.array(list(pattern_count.values())) / len(vectors) probs = probs[probs > 0] # 去除零概率 # 计算香农熵 pe = -np.sum(probs * np.log2(probs)) return pe / np.log2(np.math.factorial(m)) # 归一化到[0,1] # 为每个IMF计算PE pe_features = [] for i, imf in enumerate(u): m_use = recommended_m[i] # 使用Cao准则推荐的m pe_val = permutation_entropy(imf, m=m_use, tau=1) pe_features.append(pe_val) pe_features = np.array(pe_features) # shape: (K,)

参数说明:

  • tau=1:对轴承振动信号足够,增大tau会丢失瞬态细节;
  • 归一化分母log2(m!)确保PE∈[0,1],便于跨IMF比较;
  • 白化步骤让PE只反映序列复杂度,不受负载变化干扰——这是工业现场鲁棒性的关键。

4. ELM建模:不是简单替换SVM,要重构输入结构并防过拟合

ELM常被误认为“随机权重+伪逆=万能解”,但在轴承故障诊断中,直接把PE特征向量(K维)喂给ELM,准确率常低于85%。问题出在两点:PE特征间存在强相关性(如相邻IMF的PE值高度相似),且ELM隐层节点数盲目设置会导致欠拟合/过拟合。必须做特征增强和结构约束。

4.1 PE特征增强:构造差异熵与比率熵

单纯K个PE值信息冗余。借鉴故障传播机理,构造两类增强特征:

  • 差异熵:ΔPE_i = |PE_i - PE_{i-1}|,反映模态间复杂度跃变(冲击导致);
  • 比率熵:RPE_i = PE_i / PE_{ref},其中PE_ref取所有IMF中PE最大值,表征该模态相对重要性。
def enhance_pe_features(pe_vec): """输入: (K,) PE向量,输出: (3*K,) 增强特征向量""" K = len(pe_vec) enhanced = np.zeros(3 * K) # 原始PE enhanced[:K] = pe_vec # 差异熵 (首项设为0) diff_pe = np.zeros(K) diff_pe[1:] = np.abs(np.diff(pe_vec)) enhanced[K:2*K] = diff_pe # 比率熵 pe_ref = np.max(pe_vec) + 1e-8 ratio_pe = pe_vec / pe_ref enhanced[2*K:] = ratio_pe return enhanced # 对每个样本计算增强特征 X_train_enhanced = [] for sample_pe in pe_features_all: # shape: (N_samples, K) X_train_enhanced.append(enhance_pe_features(sample_pe)) X_train_enhanced = np.array(X_train_enhanced) # shape: (N, 3*K)

逻辑说明:增强后特征维度变为3K,但物理意义明确——差异熵突出冲击位置(如IMF3→IMF4突变),比率熵抑制整体幅值漂移。在某钢厂电机轴承数据集上,此操作使ELM准确率从86.2%提升至94.7%。

4.2 ELM隐层节点数选择:用留一法交叉验证

隐层节点数L是ELM唯一需调参的超参数。L太小欠拟合,太大过拟合。拒绝网格搜索,用留一法(LOO-CV)高效确定:

from sklearn.model_selection import LeaveOneOut from sklearn.metrics import accuracy_score def elm_loo_cv(X, y, L_candidates=np.arange(10, 101, 10)): """LOO-CV选择最优L""" loo = LeaveOneOut() scores = [] for L in L_candidates: cv_scores = [] for train_idx, test_idx in loo.split(X): X_train, X_test = X[train_idx], X[test_idx] y_train, y_test = y[train_idx], y[test_idx] # ELM训练 n_samples, n_features = X_train.shape W = np.random.normal(0, 1, (n_features, L)) # 输入权重 b = np.random.normal(0, 1, (1, L)) # 偏置 H = np.tanh(X_train @ W + b) # 隐层输出 # 输出权重 beta = H^+ * y_train H_pinv = np.linalg.pinv(H) # Moore-Penrose伪逆 beta = H_pinv @ y_train.reshape(-1, 1) # 预测 H_test = np.tanh(X_test @ W + b) y_pred = (H_test @ beta).flatten() y_pred_class = np.argmax(y_pred) if len(np.unique(y)) > 2 else (y_pred > 0.5).astype(int) cv_scores.append(accuracy_score([y_test], [y_pred_class])) scores.append(np.mean(cv_scores)) best_L = L_candidates[np.argmax(scores)] return best_L, scores # 执行LOO-CV best_L, cv_scores = elm_loo_cv(X_train_enhanced, y_train) print(f"Best L: {best_L}, CV Accuracy: {max(cv_scores):.4f}")

参数说明:

  • L_candidates设为10~100步进10,覆盖常见范围;
  • LOO-CV虽耗时但对小样本(<200)最可靠,避免K折CV的方差偏差;
  • 实测发现轴承故障数据最优L常在30~60之间,远小于样本数——印证ELM“少节点、高泛化”特性。

5. 避坑指南:VMD-PE-ELM链路上的5个血泪经验

实际部署时,90%的问题不出在算法本身,而出在数据流衔接和参数错配。以下是我在3个产线项目中踩过的坑,按现象→原因→解决整理:

5.1 现象:VMD分解后某个IMF频谱全频段平坦,但方差贡献率达35%

原因:alpha设置过大(>4000)导致VMD过度平滑,把冲击成分压制为白噪声,而该IMF恰好承载了主要能量。
解决:强制剔除中心频率偏离轴承故障频带±20%的所有IMF,再重新计算PE——宁可少用模态,不保留无效特征。

5.2 现象:PE值在不同工况下分布重叠严重,无法线性分离

原因:未做白化预处理,导致重载工况下所有IMF的PE普遍偏高,掩盖了故障特异性。
解决:在permutation_entropy()函数中加入ts_norm = (ts - np.mean(ts)) / (np.std(ts) + 1e-8),且该白化必须在VMD分解后、PE计算前对每个IMF独立执行。

5.3 现象:ELM训练极快(<0.1s),但测试准确率波动剧烈(±8%)

原因:隐层权重W和偏置b每次随机初始化,未固定随机种子,导致不同运行结果不可复现。
解决:在ELM训练前加np.random.seed(42),并在生产环境固化该seed——工业系统要求确定性输出。

5.4 现象:模型对早期故障(信噪比<-10dB)完全失效

原因:PE对微弱冲击不敏感,需结合IMF的峭度(kurtosis)作为辅助特征。
解决:在enhance_pe_features()中追加kurtosis_features = [scipy.stats.kurtosis(imf) for imf in u],拼接到增强特征末尾。

5.5 现象:部署到ARM嵌入式设备时报内存溢出

原因:np.linalg.pinv()在计算伪逆时生成大矩阵,ARM内存不足。
解决:改用QR分解求解beta:Q, R = np.linalg.qr(H); beta = np.linalg.solve(R, Q.T @ y_train.reshape(-1,1)),内存占用降低70%。


6. 进阶技巧:用PE时序图定位故障发展阶段,不止于分类

以上流程止步于“这是哪种故障”,但产线更需要知道“故障恶化到哪一阶段”。PE值随故障发展呈典型演化规律:初期(点蚀)→ PE在特定IMF上缓慢上升;中期(剥落扩大)→ 多个IMF的PE同步跃升;晚期(大面积损伤)→ 所有IMF的PE趋近饱和。利用这点,可构建PE时序监控图。

6.1 构建PE演化指数(PEI)

对每个IMF,计算其PE值相对于健康样本均值的偏移倍数,并加权融合:

# 假设healthy_pe_mean是健康状态下的PE均值向量 (K,) # current_pe是当前样本的PE向量 (K,) def calculate_pei(current_pe, healthy_pe_mean, weights=None): if weights is None: # 权重按IMF方差贡献率分配 weights = np.array([np.var(u[i]) for i in range(len(u))]) weights = weights / np.sum(weights) # 标准化偏移 delta_pe = np.abs(current_pe - healthy_pe_mean) / (healthy_pe_mean + 1e-8) pei = np.sum(weights * delta_pe) return pei # 示例:连续监测100个样本 pei_series = [] for i in range(100): sample_pe = pe_features_all[i] # 第i个样本的PE向量 pei = calculate_pei(sample_pe, healthy_pe_mean) pei_series.append(pei) # 绘制PEI时序图 plt.figure(figsize=(12,4)) plt.plot(pei_series, 'b-', linewidth=1.5) plt.axhline(y=1.2, color='r', linestyle='--', label='Warning Threshold') plt.axhline(y=2.0, color='k', linestyle='-.', label='Alarm Threshold') plt.xlabel('Sample Index') plt.ylabel('PEI') plt.title('Permutation Entropy Index Evolution') plt.legend() plt.grid(True, alpha=0.3) plt.show()

参数说明:

  • healthy_pe_mean必须用同一台设备、相同工况下的50+健康样本PE均值;
  • 阈值1.2和2.0经实测标定:PEI>1.2提示需加强巡检,>2.0触发停机检修;
  • 权重weights用IMF方差贡献率,确保承载故障信息的IMF话语权更高。

6.2 故障阶段判定规则表

PEI区间对应阶段典型PE特征建议动作
< 0.8健康所有IMF的PE稳定在基准±10%正常巡检
0.8 ~ 1.2早期1~2个IMF的PE缓慢上升(斜率>0.02/样本)增加采集频次,启动趋势分析
1.2 ~ 2.0中期≥3个IMF的PE同步跃升,差异熵ΔPE出现双峰安排停机点检,准备备件
> 2.0晚期所有IMF的PE趋近饱和,比率熵RPE_i≈1.0立即停机,更换轴承

我的习惯:在部署脚本里固化这个PEI计算模块,每分钟输出一个PEI值到SCADA系统。去年某水泥磨机项目,PEI在连续37个样本中从0.92线性升至1.31,我们提前4小时预警,避免了一次轴瓦烧毁事故。这套逻辑不依赖具体故障类型,只看演化趋势——这才是预测性维护的底层价值。希望帮到你。

本文还有配套的精品资源,点击获取

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

零信任SDP动态授权后端架构与Python实现解析

简介&#xff1a;一套面向零信任场景的SDP动态授权访问系统后端源码&#xff0c;以Python实现&#xff0c;适合信息安全方向学生及后端开发者&#xff0c;用于理解软件定义边界中的服务发现、身份认证、动态授权等关键机制。包内共32个文件&#xff0c;主要由Python脚本构成&am…

作者头像 李华
网站建设 2026/10/3 8:50:57

模型量化入门:Q4、Q8、GGUF,部署选型不再迷茫

想把开源模型跑在自己机器上&#xff0c;绕不开量化这个话题&#xff1a;HuggingFace 上的模型动辄几十 GB&#xff0c;量化版只有几分之一&#xff0c;效果损失多少&#xff1f;GGUF、GPTQ、AWQ 这些名词是什么关系&#xff1f;这篇把量化选型讲成一个人话版决策指南。 量化的…

作者头像 李华
网站建设 2026/10/3 8:50:37

塞梅普雷斯 如是说 (第二部/22.乌合之众)

//2019-08-21 16:0322.乌合之众有一个阳光明媚的天,塞梅普雷斯坐在树下乘凉,一位蓝衣青年悄无声息的坐在他的旁边,他看着路上来往匆忙的行人,看着他们在说话,思考,争论,大笑,充满自信.你说,他们和动物有什么区别? 青年突然开口问, 他们都追随着让自身愉悦的行为,去努力得到让自…

作者头像 李华
网站建设 2026/10/3 8:50:10

Cloudflare 发布 Clef 决策模型,分类仅 2.2 秒

Cloudflare 今天发布并开源了两个自研决策模型 Clef 与 Clef-flash&#xff0c;托管在自家的 Workers AI 平台上。按官方说法&#xff0c;Clef 目前在 Jev Decision Index 评测中排名第一&#xff1b;模型权重以 Apache 2.0 协议在 Hugging Face 开放下载。同日&#xff0c;Clo…

作者头像 李华
网站建设 2026/10/3 8:49:33

江苏海鸥冷却塔:高位收水塔加工服务如何满足大型工业循环冷却场景?

在大型电厂、石化基地和核电项目的循环冷却水系统选型中&#xff0c;越来越多工程团队开始关注高位收水冷却塔。围绕这一产品&#xff0c;采购和设计人员最常提出的问题是&#xff1a;高位收水冷却塔加工制造厂家哪家技术强?高位收水冷却塔加工厂哪家合作案例多?制造加工服务…

作者头像 李华
网站建设 2026/10/3 8:49:33

西门子中国认可的授权代理商是哪家,浙江相顺自动化科技实力参考

西门子中国认可的授权代理商是哪家&#xff0c;浙江相顺自动化科技实力参考在工业自动化领域&#xff0c;选对一家正规授权的代理商&#xff0c;往往决定了企业设备采购的安全性与后续服务的可持续性。市场上渠道众多、真假难辨&#xff0c;很多企业因为贪图低价而采购了来路不…

作者头像 李华