基于BiGRU-Attention的轴承剩余寿命预测(MATLAB实现):从振动信号到RUL曲线的完整闭环
本文是"轴承寿命预测"系列的第22讲。我们用一套可直接复现的 MATLAB 代码,完整跑通数据读取 → 滑动窗口构造 → 时频域特征提取 → BiGRU-Attention 建模 → 置信区间可视化 的全流程,并在 IEEE PHM 2012 轴承全寿命基准数据集上取得 RMSE = 0.0847、R² = 0.9138 的跨轴承泛化预测效果。文末附完整技术路线与参数清单,供科研与工程场景直接迁移。
一、研究背景:为什么剩余寿命预测值得认真做
在风电齿轮箱、高铁走行部、航空发动机等高端装备中,滚动轴承是最易损、也最关键的部件之一。传统的"定期维修"要么修早了造成浪费,要么修晚了酿成事故。剩余使用寿命(Remaining Useful Life, RUL)预测的目标,是让模型根据轴承运行过程中持续采集的振动信号,实时估计"它还能健康运行多久",从而支撑视情维修(CBM)与预测性维护决策。
RUL 预测的难点主要有三个:
- 单次采样时间尺度太短。PHM 2012 数据集每 10 秒采集 0.1 s、采样率 25.6 kHz,单段信号仅 2560 个点。若直接把单段信号喂给模型,模型只能看到"局部纹理",看不到轴承从健康到失效的整体退化趋势。
- 退化特征散布在多个域。时域的峭度、峰值因子反映冲击类故障,频域的重心频率、频谱平坦度反映频谱结构迁移,任何单一域特征都不足以刻画全生命周期。
- 退化是双向时间依赖的过程。当前健康状态既取决于"之前怎么退化",也隐含"未来怎么走"的信息------这正是引入双向结构的动机。
针对这三点,本文方案分别对应三个技术动作:滑动窗口拼接 扩展观测时间尺度、26 维时频域特征 全面刻画信号、BiGRU + 自注意力建模双向退化依赖。
二、数据集与任务定义
数据来源:IEEE PHM 2012 Data Challenge 轴承全寿命数据集(学习集 Bearing1_1、Bearing1_2,全测试集 Bearing1_3 ~ Bearing1_7)。每台轴承从全新运行到失效,加速度计以 25.6 kHz 采样、每 10 s 记录一段 0.1 s 的信号,每段 2560 个采样点。
任务定义 :把 RUL 归一化到 0, 1 区间------轴承刚投运时标签为 1,失效时刻标签线性衰减到 0。于是 RUL 预测转化为一个序列回归问题:
RULi=1−pi−1N−1 \text{RUL}_i = 1 - \frac{p_i - 1}{N - 1} RULi=1−N−1pi−1
其中 pip_ipi 是第 iii 个滑窗样本的窗口末端位置,NNN 是该轴承的总采样段数。
数据划分 :Bearing 1_1(2801 个滑窗样本)+ Bearing 1_2(869 个样本)作为训练集(共 3670 个样本),Bearing 3(2373 个样本)整体作为测试集------即模型在完全没见过的另一台轴承上做预测,考察的是跨个体泛化能力,而非简单的插值拟合。
三、技术路线总览

PHM2012 原始CSV (acc_*.csv, 25.6kHz×2560点)
│ loadBearingData.m 批量读取、按段重排
▼
单段振动信号 (2560 点/段)
│ create_sliding_window_data.m 滑动窗口
│ 窗口 w=3, 步长 s=1 → 30秒×0.3秒拼接样本
▼
滑窗样本 (7680 点/样本) + 线性递减RUL标签
│ feature_extraction.m 时域+频域特征
│ 14时域 + 12频域 = 26维特征向量
▼
特征矩阵 (3670×26 训练 / 2373×26 测试)
│ Z-score标准化 (训练集统计量)
▼
BiGRU-Attention 网络
├─ 双向GRU×2层 (隐层100, FlipLayer实现反向分支)
├─ 自注意力 (4头, key通道128)
└─ 全连接回归 (输出1维RUL)
▼
评估: RMSE / MAE / R² + 置信区间 / 残差 / 误差分布可视化
整个过程拆成两段脚本:main1_Data.m 负责"从原始 CSV 到特征矩阵",main2_BiGRU_Attention.m 负责"从特征矩阵到训练评估",中间以 feature_reconstructedData.mat 交接,改模型不用重跑数据处理,改特征不用重训网络。
四、算法步骤详解
步骤1:批量数据读取
loadBearingData.m 逐台轴承扫描目录下所有 acc_*.csv,每段取 2560 行、第 5 列(水平加速度通道),最后按 reshape 重排为 "每行一段完整信号" 的矩阵,一行就是一个采样时刻的振动片段。
步骤2:滑动窗口构造样本
直接用单段信号的问题在于时间尺度太窄。这里取 窗口大小 w = 3、滑动步长 s = 1 ,即把连续 3 段(对应 30 秒采集间隔内共 0.3 秒的振动数据,7680 个点)拼接为一个训练样本,窗口逐段滑动。这样模型既能看到整体退化趋势 (跨段信息),又保留了局部冲击特征(段内信息)。
标签在窗口生成时同步给出:窗口越靠后、越接近失效,RUL 越接近 0。
步骤3:时频域特征提取(26 维)
对每个 7680 点的滑窗样本,提取 14 个时域特征 + 12 个频域特征:
时域(14维):均值、标准差、均方根 RMS、方差、峰值、峰峰值、偏度、峭度,以及四个无量纲指标------
SF=Xrms∣x∣ˉ,CF=XpeakXrms,IF=Xpeak∣x∣ˉ,CLF=Xpeak(1N∑∣xi∣)2 SF = \frac{X_{rms}}{\bar{|x|}},\quad CF = \frac{X_{peak}}{X_{rms}},\quad IF = \frac{X_{peak}}{\bar{|x|}},\quad CLF = \frac{X_{peak}}{\left(\frac{1}{N}\sum\sqrt{|x_i|}\right)^2} SF=∣x∣ˉXrms,CF=XrmsXpeak,IF=∣x∣ˉXpeak,CLF=(N1∑∣xi∣ )2Xpeak
再加上信号能量与绝对平均值。其中峭度和峰值因子对早期点蚀类故障特别敏感,是轴承退化的经典"前哨指标"。
频域(12维) :对信号做 FFT 取单边谱后,计算频谱能量、主频率、主频幅值、重心频率 FC=∑fka^kFC = \sum f_k \hat{a}_kFC=∑fka^k、均方频率、均方根频率、频率方差/标准差、前 5 个峰值频率的平均幅值、频谱峭度、频谱偏度、频谱平坦度(几何均值/算术均值)。重心频率随磨损加剧通常向高频漂移,频谱平坦度则反映谱能量从离散谱线向宽带噪声扩散的程度------这些都是退化进程的直接证据。
步骤4:数据标准化
用训练集 的均值 μ\muμ 与标准差 σ\sigmaσ 对训练、测试集统一做 Z-score 标准化:
x′=x−μσ+ϵ x' = \frac{x - \mu}{\sigma + \epsilon} x′=σ+ϵx−μ
注意统计量只来自训练集,避免测试集信息泄露;对标准差为 0 的特征产生的 NaN 统一置 0。
步骤5:BiGRU-Attention 网络结构
这是本文的核心。网络用 MATLAB 的 layerGraph 搭建,结构如下:
输入 (26维特征序列)
├─→ GRU₁(100, sequence输出) ──────────────────────┐
│ │ FlipLayer 翻转时间轴 │
│ └→ GRU₂(100, sequence输出) → FlipLayer ──→ 拼接 cat1 (200维)
│ │
├─────────── FlipLayer ─→ GRU₄(100, last输出) ──┐ │
│ ▼ ▼
└─→ GRU₃(100, last输出) ─────────────────→ 拼接 cat2 (200维)
│
▼
自注意力层 (4头, key通道=128)
▼
全连接(1) → 回归输出
三个设计点值得展开:
(1)为什么用 GRU? GRU 相比 LSTM 少了独立的细胞状态和输出门,参数量少约 25%,在中等长度序列上精度损失可忽略,训练更快,很适合 3670 个样本这种中小规模工业数据集,不易过拟合。
(2)"BiGRU"是怎么实现的? MATLAB 标准层库没有现成的双向 GRU,代码用了一个很巧的替代方案:自定义 FlipLayer(Y = flip(X, 3))把时间序列首尾翻转 后送入第二个 GRU,输出再翻转回来,最后用 concatenationLayer 与正向分支拼接。数学上等价于:
htfwd=GRU(xt,ht−1fwd),htbwd=GRU(xt,ht+1bwd) h_t^{fwd} = \text{GRU}(x_t, h_{t-1}^{fwd}),\qquad h_t^{bwd} = \text{GRU}(x_t, h_{t+1}^{bwd}) htfwd=GRU(xt,ht−1fwd),htbwd=GRU(xt,ht+1bwd)
Ht= htfwd; htbwd ∈R200 H_t = \\,h_t\^{fwd};\\, h_t\^{bwd}\\, \in \mathbb{R}^{200} Ht=htfwd;htbwd∈R200
正向分支捕捉"从新投运到接近失效"的退化累积趋势,反向分支捕捉"从失效倒推回健康"的恢复性结构,两个视角互补。
(3)Attention 起什么作用? 双向 GRU 拼接后的序列送入 多头自注意力层(4 个头,key 通道数 128):
Attention(Q,K,V)=softmax (QK⊤dk)V \text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QK⊤)V
注意力机制让模型自动为不同时间步的特征分配权重------轴承寿命末段频谱结构剧变的时间步会获得更高的注意力权重,而健康平稳段被自然抑制。相比把 last 输出直接接全连接,这一步显著提升了模型对"临界退化点"的分辨能力。
步骤6:训练配置
采用 Adam 优化器,并做三件对工业数据很关键的事:
- 划分 20% 验证集(随机打乱后切分),监控验证损失;
OutputNetwork = 'best-validation-loss':训练结束后自动回滚到验证损失最低的那一版网络,而非最后一轮------有效对抗后期过拟合;- 梯度裁剪(GradientThreshold = 1):抑制 RNN 训练中常见的梯度爆炸。
步骤7:评估与不确定性可视化
除 RMSE / MAE / R² 外,代码还基于残差标准差构造 95% 置信区间:
y^±z0.975⋅σres,z0.975≈1.96 \hat{y} \pm z_{0.975}\cdot\sigma_{res},\qquad z_{0.975} \approx 1.96 y^±z0.975⋅σres,z0.975≈1.96
并输出四联分析图(预测对比、置信区间、残差散点、误差直方图)与性能雷达图,这在工程交付中非常重要------点预测之外,运维人员更需要知道"这个预测有多可信"。
五、参数设定清单
| 模块 | 参数 | 取值 | 说明 |
|---|---|---|---|
| 数据 | 采样点数/段 | 2560 | 25.6 kHz × 0.1 s |
| 数据 | 振动通道 | 第5列(水平) | PHM2012 标准格式 |
| 滑窗 | 窗口大小 w | 3 | 30 s 内 0.3 s 数据拼接 |
| 滑窗 | 步长 s | 1 | 逐段滑动,最大化样本量 |
| 特征 | 时域/频域 | 14 + 12 = 26 维 | 见步骤3 |
| 网络 | GRU 隐层单元 | 100 × 2 层 × 双向 | 拼接后 200 维 |
| 网络 | 注意力头数 | 4 | key 通道数 = 4×32 = 128 |
| 训练 | 优化器 | Adam | 初始学习率 0.005 |
| 训练 | MaxEpochs / MiniBatch | 150 / 64 | 每 30 步验证一次 |
| 训练 | 学习率调度 | 分段下降 | 每 50 轮 ×0.5 |
| 训练 | L2 正则 / 梯度裁剪 | 0.001 / 1 | 抑制过拟合与梯度爆炸 |
| 训练 | 验证集比例 | 20% | 取最优验证损失网络 |
运行环境 :MATLAB R2024b 及以上(需 Deep Learning Toolbox,selfAttentionLayer 要求 R2020b+);CPU 即可训练(本例约 281 s 完成 150 轮),有 GPU 时在 trainingOptions 中指定 ExecutionEnvironment 为 'gpu' 可进一步加速。
六、运行结果
在 Bearing 3(2373 个样本、完全未参与训练) 上的测试结果:
| 指标 | 数值 | 含义 |
|---|---|---|
| RMSE | 0.0847 | 归一化RUL均方根误差,约8.5%全寿命跨度 |
| MAE | 0.0722 | 平均绝对误差 |
| R² | 0.9138 | 解释了测试集退化趋势91%以上的方差 |
| 训练耗时 | 280.85 s | 150轮,CPU环境 |
从结果图可以读出三点信息:
- 总体趋势跟踪良好:预测曲线(橙)紧贴真实 RUL(蓝)的线性退化主线,R² 0.91 说明跨轴承泛化成立;
- 中段波动是主要误差来源:残差分析图显示预测值在 0.4~0.8 区间存在系统性小偏差------该阶段轴承处于早期退化、振动特征尚不明显,属于跨个体预测的固有难点;
- 误差分布近似零均值:误差直方图均值 -0.043、标准差 0.073,无显著整体偏移,模型没有系统性高估或低估寿命。



七、应用场景
这套"振动信号 → 时频特征 → BiGRU-Attention → RUL"的范式,可直接迁移到:
- 风电主轴/齿轮箱轴承监测:结合 SCADA 振动数据流做在线寿命估计,支撑海上风电降本运维;
- 高铁走行部状态修:为动车组轴承从"里程修"走向"状态修"提供量化依据;
- 数控机床主轴健康管理:预测换刀/保养窗口,减少非计划停机;
- 工业设备数字孪生:RUL 预测模块作为孪生体的核心推理引擎,置信区间输出可直接对接维修决策优化(如机会维护调度)。
方法论上,滑动窗口 + 多域特征 + 双向序列模型 + 注意力的组合,对任何"传感器序列 → 连续健康指标"的退化建模任务(如锂电池 SOH、涡轮叶片退化、泵阀磨损)都有参考价值。
八、小结与改进方向
本文用 MATLAB 代码跑通了 RUL 预测的完整闭环,核心结论:
- 滑动窗口(w=3) 解决了单段信号时间尺度不足的问题;
- 26 维时频域特征 比 End-to-End 原始信号输入在小样本工业场景下更稳、更可解释;
- FlipLayer + 双分支 GRU + 拼接 是 MATLAB 下实现 BiGRU 的标准范式;
- 验证损失回滚 + 梯度裁剪 + L2 三板斧让 3670 个样本也能训练出 R² 0.91 的泛化模型。
后续可尝试的改进:① 用分段退化标签 (三段式:健康期恒为1 / 线性退化 / 加速失效)替代纯线性标签,更贴近真实退化物理;② 引入CNN 前端从原始信号自动提特征,与人工特征融合;③ 对注意力权重做可视化,定位模型关注的退化关键时间步,增强可解释性;④ 用 Bootstrap 或 MC Dropout 替代单一残差标准差,获得更严格的预测区间。
如果本文对你有帮助,欢迎点赞、在看、转发三连,也欢迎在评论区聊聊你遇到的 RUL 预测难题。
(声明:本文为技术方法分享,数据集来自 IEEE PHM 2012 Data Challenge 公开数据。)