代码实现了一个基于 ICEEMDAN(改进的自适应噪声完全集合经验模态分解) 与 TCN(时间卷积网络) 的滚动轴承故障诊断流程,并引入 贝叶斯优化 进行超参数自动调优,最终利用 SHAP 对模型进行解释性分析。
1. 研究背景
滚动轴承是旋转机械中的关键部件,其健康状态直接影响设备运行安全。传统基于振动信号的故障诊断方法依赖人工特征提取,难以全面捕捉非线性、非平稳信号中的故障特征。近年来,深度学习在故障诊断中展现出强大能力,但模型结构及超参数选择往往依赖经验。因此,结合自适应信号分解与自动化超参数优化的智能诊断方法成为研究热点。
2. 主要功能
- 数据预处理:从 CWRU(凯斯西储大学)轴承数据集读取 10 种状态(正常+9种故障)的振动信号,采用滑动窗口切分成样本。
- 特征提取 :对每个样本进行 ICEEMDAN 分解,取前 8 个本征模态函数(IMF),计算每个 IMF 的 排列熵 构成特征向量。
- 分类建模 :基于 TCN 构建分类网络,利用 贝叶斯优化 自动搜索关键超参数(卷积核数、核大小、dropout、残差块数、学习率等)。
- 结果评价与解释 :输出训练集/测试集准确率、混淆矩阵,并利用 SHAP 分析各特征对模型输出的贡献程度。
3. 算法步骤
- 数据加载与样本构造
- 加载 10 个
.mat文件,每个包含 120 组 × 2048 点的振动信号(DE 端驱动端数据)。 - 通过滑动窗口(窗口步长 1000,窗口长度 2048)生成 120 个样本/类。
- 加载 10 个
- 特征提取
- 对每个样本(1×2048)进行 ICEEMDAN 分解,取前 8 个 IMF 分量。
- 对每个 IMF 计算 排列熵(嵌入维数 M=3,延迟时间 T=1),得到 8 维特征向量。
- 数据划分
- 每类 120 个样本,取前 90 个为训练集,后 30 个为测试集。
- 贝叶斯优化与 TCN 建模
- 定义 6 个超参数的优化范围,目标函数为验证集上的错误率(1 - 准确率)。
- 运行贝叶斯优化 30 次,得到最优参数组合。
- 使用最优参数重新训练 TCN 模型(完整 120 轮)。
- 结果评估与 SHAP 分析
- 计算准确率并绘制混淆矩阵。
- 选取部分测试样本,利用 SHAP 计算各特征贡献度,绘制摘要图、重要性条形图、依赖图。
4. 技术路线
原始振动信号 → ICEEMDAN(分解为 IMF) → 排列熵(特征) → 特征向量
↓
贝叶斯优化(TCN 超参数) → 最优 TCN 模型 → 故障分类
↓
SHAP 解释分析 → 特征重要性评估
- ICEEMDAN 解决传统 EMD 的模态混叠问题,提高分解稳定性。
- 排列熵 量化 IMF 的复杂度,对信号突变敏感,适合故障特征表征。
- TCN 通过因果卷积和膨胀卷积捕获长时间依赖,结构稳定,训练速度快。
- 贝叶斯优化 基于高斯过程代理模型,高效寻找超参数组合。
- SHAP 基于博弈论解释模型输出,量化每个特征的贡献。
5. 公式原理
5.1 排列熵
对长度为 (N) 的时间序列 (x(i)),嵌入维数 (m),延迟 (\tau),重构相空间:
X(i)=[x(i),x(i+τ),...,x(i+(m−1)τ)],i=1,...,N−(m−1)τ X(i) = [x(i), x(i+\tau), \dots, x(i+(m-1)\tau)], \quad i=1,\dots,N-(m-1)\tau X(i)=[x(i),x(i+τ),...,x(i+(m−1)τ)],i=1,...,N−(m−1)τ
对每个 X(i)X(i)X(i)按升序排列得到排列模式,统计各模式概率pjp_jpj,则排列熵为:
PE=−∑j=1m!pjlnpj PE = -\sum_{j=1}^{m!} p_j \ln p_j PE=−j=1∑m!pjlnpj
归一化后范围 ([0,1]),值越大表示序列越随机。
5.2 ICEEMDAN
ICEEMDAN 在 CEEMDAN 基础上改进,通过添加自适应白噪声并控制残余噪声,获得更纯净的 IMF 分量,主要迭代公式:
Rk=⟨E1(rk−1+βk−1w(i))⟩ R_k = \langle E_1(r_{k-1} + \beta_{k-1} w^{(i)}) \rangle Rk=⟨E1(rk−1+βk−1w(i))⟩
IMFk=rk−1−rk IMF_k = r_{k-1} - r_k IMFk=rk−1−rk
其中 E1E_1E1 为 EMD 算子,w(i)w^{(i)}w(i)为白噪声,⟨⋅⟩\langle \cdot \rangle⟨⋅⟩ 表示多次平均。
5.3 TCN 残差块
残差块包含两层膨胀卷积,每层后接归一化和激活函数,输出为:
o=Activation(F(x)+x) o = \text{Activation}(F(x) + x) o=Activation(F(x)+x)
其中 F(x)F(x)F(x) 为膨胀卷积变换,通过残差连接缓解梯度消失。
5.4 贝叶斯优化目标
最大化验证准确率等价于最小化:
Objective=1−Accuracyval \text{Objective} = 1 - \text{Accuracy}_{\text{val}} Objective=1−Accuracyval
使用高斯过程回归建模目标函数,采集函数选择"期望改进"(EI)指导下一组超参数选择。
6. 参数设定
| 参数 | 值 | 说明 |
|---|---|---|
| ICEEMDAN 噪声权重 Nstd | 0.1 | 控制添加噪声幅度 |
| ICEEMDAN 噪声添加次数 NR | 80 | 集成次数,抑制模态混叠 |
| MaxIter | 8 | 最多分解 IMF 数 |
| 排列熵嵌入维数 M | 3 | 重构状态空间维度 |
| 排列熵延迟 T | 1 | 相空间重构延迟 |
| 训练/测试样本数 | 90 / 30 | 每类划分 |
| TCN 最大轮数 | 120 | 完整模型训练轮数 |
| 贝叶斯优化迭代 | 30 | 超参数搜索次数 |
7. 运行环境
- 软件:MATLAB R2024b
8. 应用场景
- 工业设备智能运维:如电机、风机、压缩机等旋转机械的在线健康监测。
- 自动化故障诊断系统:结合传感器采集的振动信号,实现故障类型自动识别。
- 可解释性辅助决策:通过 SHAP 分析关键特征,辅助现场工程师理解诊断依据,提高模型可信度。







matlab
开始贝叶斯优化...
|=================================================================================================================================================================|
| Iter | Eval | Objective | Objective | BestSoFar | BestSoFar | numFilters | filterSize | dropoutFactor| numBlocks | InitialLearn-| LearnRateDro-|
| | result | | runtime | (observed) | (estim.) | | | | | Rate | pFactor |
|=================================================================================================================================================================|
| 1 | Best | 0.50667 | 10.045 | 0.50667 | 0.50667 | 10 | 6 | 0.068529 | 2 | 0.00029091 | 0.55608 |
| 2 | Best | 0.24 | 9.3112 | 0.24 | 0.25447 | 27 | 4 | 0.26998 | 2 | 0.00061023 | 0.87827 |
| 3 | Best | 0.17 | 6.3978 | 0.17 | 0.17006 | 21 | 6 | 0.28522 | 1 | 0.0023458 | 0.72135 |
| 4 | Accept | 0.17 | 12.26 | 0.17 | 0.17001 | 24 | 4 | 0.2174 | 3 | 0.0077339 | 0.5407 |
| 5 | Accept | 0.69333 | 12.07 | 0.17 | 0.16997 | 22 | 4 | 0.26838 | 3 | 0.0001015 | 0.89447 |
| 6 | Best | 0.14667 | 9.665 | 0.14667 | 0.14678 | 32 | 5 | 0.10397 | 2 | 0.0019675 | 0.7088 |
| 7 | Accept | 0.27333 | 9.0461 | 0.14667 | 0.14666 | 11 | 2 | 0.26063 | 2 | 0.0017248 | 0.54211 |
| 8 | Accept | 0.16 | 9.2857 | 0.14667 | 0.14653 | 32 | 4 | 0.16893 | 2 | 0.0096475 | 0.89724 |
| 9 | Accept | 0.15667 | 9.4324 | 0.14667 | 0.14656 | 32 | 3 | 0.29948 | 2 | 0.0037736 | 0.84336 |
| 10 | Best | 0.12667 | 13.373 | 0.12667 | 0.12686 | 32 | 6 | 0.11748 | 3 | 0.0040978 | 0.55717 |
| 11 | Accept | 0.18 | 13.327 | 0.12667 | 0.14728 | 32 | 6 | 0.25821 | 3 | 0.0053786 | 0.83863 |
| 12 | Accept | 0.18 | 9.8411 | 0.12667 | 0.15177 | 32 | 5 | 0.17051 | 2 | 0.0020475 | 0.80302 |
| 13 | Accept | 0.22 | 9.4135 | 0.12667 | 0.15122 | 8 | 4 | 0.28801 | 2 | 0.0099993 | 0.6163 |
| 14 | Accept | 0.23 | 9.8857 | 0.12667 | 0.12805 | 32 | 5 | 0.076808 | 2 | 0.00025939 | 0.71878 |
| 15 | Accept | 0.13333 | 6.4777 | 0.12667 | 0.13169 | 32 | 2 | 0.14502 | 1 | 0.0044374 | 0.50146 |
| 16 | Accept | 0.21333 | 6.7367 | 0.12667 | 0.13692 | 32 | 6 | 0.06316 | 1 | 0.00064732 | 0.50686 |
| 17 | Accept | 0.16667 | 12.996 | 0.12667 | 0.14567 | 27 | 3 | 0.055762 | 3 | 0.003266 | 0.59248 |
| 18 | Accept | 0.18333 | 6.5957 | 0.12667 | 0.1487 | 17 | 3 | 0.25131 | 1 | 0.0096597 | 0.53351 |
| 19 | Accept | 0.17667 | 12.711 | 0.12667 | 0.15104 | 32 | 3 | 0.17927 | 3 | 0.0039741 | 0.50507 |
| 20 | Accept | 0.16333 | 6.4125 | 0.12667 | 0.15625 | 32 | 2 | 0.29753 | 1 | 0.0033898 | 0.58651 |
|=================================================================================================================================================================|
| Iter | Eval | Objective | Objective | BestSoFar | BestSoFar | numFilters | filterSize | dropoutFactor| numBlocks | InitialLearn-| LearnRateDro-|
| | result | | runtime | (observed) | (estim.) | | | | | Rate | pFactor |
|=================================================================================================================================================================|
| 21 | Accept | 0.17667 | 6.5964 | 0.12667 | 0.1569 | 28 | 2 | 0.095665 | 1 | 0.0044607 | 0.7561 |
| 22 | Accept | 0.16 | 10.041 | 0.12667 | 0.15674 | 32 | 5 | 0.27847 | 2 | 0.0097577 | 0.84769 |
| 23 | Accept | 0.16667 | 9.597 | 0.12667 | 0.15574 | 21 | 2 | 0.16596 | 2 | 0.0044144 | 0.84913 |
| 24 | Accept | 0.36 | 6.9483 | 0.12667 | 0.15678 | 32 | 5 | 0.063301 | 1 | 0.0001022 | 0.882 |
| 25 | Accept | 0.58667 | 6.5195 | 0.12667 | 0.15669 | 8 | 3 | 0.27042 | 1 | 0.00010005 | 0.74977 |
| 26 | Accept | 0.23667 | 9.8425 | 0.12667 | 0.14796 | 18 | 5 | 0.094104 | 2 | 0.00051753 | 0.72577 |
| 27 | Accept | 0.20667 | 12.992 | 0.12667 | 0.15556 | 20 | 2 | 0.051207 | 3 | 0.001403 | 0.70874 |
| 28 | Accept | 0.17333 | 10.134 | 0.12667 | 0.15549 | 28 | 6 | 0.27947 | 2 | 0.0099785 | 0.62177 |
| 29 | Accept | 0.22667 | 6.6233 | 0.12667 | 0.1555 | 8 | 6 | 0.25517 | 1 | 0.0040193 | 0.85328 |
| 30 | Accept | 0.16 | 6.7596 | 0.12667 | 0.15413 | 17 | 4 | 0.21314 | 1 | 0.0047264 | 0.71684 |
__________________________________________________________
优化完成。
达到 MaxObjectiveEvaluations 30。
函数计算总次数: 30
总历时: 301.9111 秒
总目标函数计算时间: 281.3371
观测到的最佳可行点:
numFilters filterSize dropoutFactor numBlocks InitialLearnRate LearnRateDropFactor
__________ __________ _____________ _________ ________________ ___________________
32 6 0.11748 3 0.0040978 0.55717
观测到的目标函数值 = 0.12667
估计的目标函数值 = 0.15152
函数计算时间 = 13.3734
估计的最佳可行点(根据模型):
numFilters filterSize dropoutFactor numBlocks InitialLearnRate LearnRateDropFactor
__________ __________ _____________ _________ ________________ ___________________
32 3 0.17927 3 0.0039741 0.50507
估计的目标函数值 = 0.15413
估计的函数计算时间 = 12.5962
贝叶斯优化完成,耗时 302.68 秒
最佳超参数:
numFilters filterSize dropoutFactor numBlocks InitialLearnRate LearnRateDropFactor
__________ __________ _____________ _________ ________________ ___________________
32 6 0.11748 3 0.0040978 0.55717
使用最佳超参数训练完整模型...
在单 CPU 上训练。
正在初始化输入数据归一化。
|==========================================================|
| 轮 | 迭代 | 经过的时间 | 小批量准确度 | 小批量损失 | 基础学习率 |
| | | (hh:mm:ss) | | | |
|==========================================================|
| 1 | 1 | 00:00:04 | 3.33% | 4.2918 | 0.0041 |
| 2 | 50 | 00:00:06 | 50.00% | 1.1414 | 0.0041 |
| 4 | 100 | 00:00:08 | 50.00% | 0.9835 | 0.0041 |
| 5 | 150 | 00:00:10 | 66.67% | 0.8965 | 0.0041 |
| 7 | 200 | 00:00:12 | 60.00% | 0.8472 | 0.0041 |
| 9 | 250 | 00:00:14 | 53.33% | 0.7488 | 0.0041 |
| 10 | 300 | 00:00:15 | 66.67% | 0.8024 | 0.0041 |
| 12 | 350 | 00:00:17 | 76.67% | 0.6647 | 0.0041 |
| 14 | 400 | 00:00:19 | 80.00% | 0.4964 | 0.0041 |
| 15 | 450 | 00:00:20 | 73.33% | 0.6414 | 0.0041 |
| 17 | 500 | 00:00:22 | 86.67% | 0.6071 | 0.0041 |
| 19 | 550 | 00:00:23 | 73.33% | 0.6125 | 0.0041 |
| 20 | 600 | 00:00:25 | 80.00% | 0.5538 | 0.0041 |
| 22 | 650 | 00:00:26 | 76.67% | 0.5936 | 0.0041 |
| 24 | 700 | 00:00:28 | 86.67% | 0.5219 | 0.0041 |
| 25 | 750 | 00:00:29 | 83.33% | 0.5268 | 0.0041 |
| 27 | 800 | 00:00:30 | 66.67% | 0.6258 | 0.0041 |
| 29 | 850 | 00:00:32 | 83.33% | 0.4329 | 0.0041 |
| 30 | 900 | 00:00:33 | 83.33% | 0.5632 | 0.0041 |
| 32 | 950 | 00:00:35 | 80.00% | 0.5101 | 0.0041 |
| 34 | 1000 | 00:00:37 | 90.00% | 0.3710 | 0.0041 |
| 35 | 1050 | 00:00:39 | 66.67% | 0.6827 | 0.0041 |
| 37 | 1100 | 00:00:41 | 73.33% | 0.4780 | 0.0041 |
| 39 | 1150 | 00:00:42 | 86.67% | 0.3758 | 0.0041 |
| 40 | 1200 | 00:00:44 | 86.67% | 0.4306 | 0.0041 |
| 42 | 1250 | 00:00:45 | 80.00% | 0.4732 | 0.0041 |
| 44 | 1300 | 00:00:47 | 86.67% | 0.4318 | 0.0041 |
| 45 | 1350 | 00:00:48 | 86.67% | 0.3654 | 0.0041 |
| 47 | 1400 | 00:00:49 | 76.67% | 0.4543 | 0.0041 |
| 49 | 1450 | 00:00:51 | 90.00% | 0.3026 | 0.0041 |
| 50 | 1500 | 00:00:52 | 86.67% | 0.5255 | 0.0041 |
| 52 | 1550 | 00:00:54 | 83.33% | 0.4282 | 0.0023 |
| 54 | 1600 | 00:00:55 | 83.33% | 0.4401 | 0.0023 |
| 55 | 1650 | 00:00:56 | 93.33% | 0.2785 | 0.0023 |
| 57 | 1700 | 00:00:58 | 73.33% | 0.4456 | 0.0023 |
| 59 | 1750 | 00:00:59 | 86.67% | 0.3772 | 0.0023 |
| 60 | 1800 | 00:01:01 | 93.33% | 0.2476 | 0.0023 |
| 62 | 1850 | 00:01:02 | 76.67% | 0.4200 | 0.0023 |
| 64 | 1900 | 00:01:03 | 96.67% | 0.2318 | 0.0023 |
| 65 | 1950 | 00:01:05 | 93.33% | 0.2782 | 0.0023 |
| 67 | 2000 | 00:01:06 | 73.33% | 0.4447 | 0.0023 |
| 69 | 2050 | 00:01:08 | 86.67% | 0.2756 | 0.0023 |
| 70 | 2100 | 00:01:09 | 96.67% | 0.1550 | 0.0023 |
| 72 | 2150 | 00:01:10 | 76.67% | 0.4727 | 0.0023 |
| 74 | 2200 | 00:01:12 | 83.33% | 0.3955 | 0.0023 |
| 75 | 2250 | 00:01:13 | 96.67% | 0.2336 | 0.0023 |
| 77 | 2300 | 00:01:15 | 86.67% | 0.4461 | 0.0023 |
| 79 | 2350 | 00:01:16 | 86.67% | 0.2717 | 0.0023 |
| 80 | 2400 | 00:01:17 | 93.33% | 0.1872 | 0.0023 |
| 82 | 2450 | 00:01:19 | 80.00% | 0.3584 | 0.0023 |
| 84 | 2500 | 00:01:20 | 90.00% | 0.2717 | 0.0023 |
| 85 | 2550 | 00:01:22 | 93.33% | 0.3503 | 0.0023 |
| 87 | 2600 | 00:01:23 | 73.33% | 0.4282 | 0.0023 |
| 89 | 2650 | 00:01:25 | 90.00% | 0.2356 | 0.0023 |
| 90 | 2700 | 00:01:26 | 93.33% | 0.3177 | 0.0023 |
| 92 | 2750 | 00:01:27 | 80.00% | 0.3500 | 0.0023 |
| 94 | 2800 | 00:01:29 | 90.00% | 0.3666 | 0.0023 |
| 95 | 2850 | 00:01:30 | 93.33% | 0.2630 | 0.0023 |
| 97 | 2900 | 00:01:32 | 83.33% | 0.2816 | 0.0023 |
| 99 | 2950 | 00:01:33 | 83.33% | 0.3529 | 0.0023 |
| 100 | 3000 | 00:01:34 | 93.33% | 0.2662 | 0.0023 |
| 102 | 3050 | 00:01:36 | 83.33% | 0.4090 | 0.0013 |
| 104 | 3100 | 00:01:37 | 93.33% | 0.2154 | 0.0013 |
| 105 | 3150 | 00:01:39 | 86.67% | 0.3371 | 0.0013 |
| 107 | 3200 | 00:01:40 | 90.00% | 0.2240 | 0.0013 |
| 109 | 3250 | 00:01:41 | 90.00% | 0.2684 | 0.0013 |
| 110 | 3300 | 00:01:43 | 93.33% | 0.2226 | 0.0013 |
| 112 | 3350 | 00:01:44 | 86.67% | 0.3407 | 0.0013 |
| 114 | 3400 | 00:01:45 | 90.00% | 0.2297 | 0.0013 |
| 115 | 3450 | 00:01:47 | 93.33% | 0.2375 | 0.0013 |
| 117 | 3500 | 00:01:48 | 76.67% | 0.3120 | 0.0013 |
| 119 | 3550 | 00:01:50 | 93.33% | 0.2244 | 0.0013 |
| 120 | 3600 | 00:01:51 | 86.67% | 0.2228 | 0.0013 |
|==========================================================|
训练结束: 已完成最大轮数。
计算SHAP值: 样本 1/50
计算SHAP值: 样本 2/50
计算SHAP值: 样本 3/50
计算SHAP值: 样本 4/50
计算SHAP值: 样本 5/50
计算SHAP值: 样本 6/50
计算SHAP值: 样本 7/50
计算SHAP值: 样本 8/50
计算SHAP值: 样本 9/50
计算SHAP值: 样本 10/50
计算SHAP值: 样本 11/50
计算SHAP值: 样本 12/50
计算SHAP值: 样本 13/50
计算SHAP值: 样本 14/50
计算SHAP值: 样本 15/50
计算SHAP值: 样本 16/50
计算SHAP值: 样本 17/50
计算SHAP值: 样本 18/50
计算SHAP值: 样本 19/50
计算SHAP值: 样本 20/50
计算SHAP值: 样本 21/50
计算SHAP值: 样本 22/50
计算SHAP值: 样本 23/50
计算SHAP值: 样本 24/50
计算SHAP值: 样本 25/50
计算SHAP值: 样本 26/50
计算SHAP值: 样本 27/50
计算SHAP值: 样本 28/50
计算SHAP值: 样本 29/50
计算SHAP值: 样本 30/50
计算SHAP值: 样本 31/50
计算SHAP值: 样本 32/50
计算SHAP值: 样本 33/50
计算SHAP值: 样本 34/50
计算SHAP值: 样本 35/50
计算SHAP值: 样本 36/50
计算SHAP值: 样本 37/50
计算SHAP值: 样本 38/50
计算SHAP值: 样本 39/50
计算SHAP值: 样本 40/50
计算SHAP值: 样本 41/50
计算SHAP值: 样本 42/50
计算SHAP值: 样本 43/50
计算SHAP值: 样本 44/50
计算SHAP值: 样本 45/50
计算SHAP值: 样本 46/50
计算SHAP值: 样本 47/50
计算SHAP值: 样本 48/50
计算SHAP值: 样本 49/50
计算SHAP值: 样本 50/50
历时 197.971039 秒。
========== 优化结果摘要 ==========
优化耗时: 302.68 秒
最佳验证集准确率: 87.33%
最佳超参数组合:
numFilters filterSize dropoutFactor numBlocks InitialLearnRate LearnRateDropFactor
__________ __________ _____________ _________ ________________ ___________________
32 6 0.11748 3 0.0040978 0.55717
测试集准确率: 94.00%
>>