基于CNN-BiLSTM的轴承剩余寿命预测,MATLAB代码

用 CNN-BiLSTM 做轴承剩余寿命预测:一份可复现的 MATLAB 实现与结果复盘

一台电机、风机或轧机上的轴承,从装上到失效往往要跑几个月甚至几年。真正让人头疼的不是它什么时候坏,而是它在坏之前那段时间里,还剩多少可用寿命。剩余寿命(Remaining Useful Life,RUL)预测要回答的就是这个问题:给定当前振动信号,估计轴承还能撑多久。

这篇内容围绕一份完整的 MATLAB 工程展开。它用公开的 PHM 2012 轴承加速退化数据,从原始振动信号一路做到归一化 RUL 曲线,模型部分是 1D-CNN 加双向 LSTM。训练完成后在测试轴承上得到 RMSE 0.0888、MAE 0.0717、R² 0.9054。下面把研究背景、代码结构、公式、参数和结果中的问题一次讲清楚。


一、研究背景

轴承是旋转机械里最容易失效的部件之一。早期故障的冲击成分很弱,常被强噪声和工频干扰盖住,等振动幅值明显升高时,损伤往往已经进入中后期。工业现场需要的不是"坏了再修",而是提前排产、备件、安排停机窗口。

传统做法有两种:一是基于物理模型(裂纹扩展、润滑寿命公式),需要大量先验参数,个体差异一变大就失准;二是基于统计特征加浅层回归(RMS、峭度等指标配合 SVR、随机森林),能跑起来,但特征需要人工挑选,且难以刻画退化过程中的长程依赖。

深度学习的切入点是:让网络自己从振动数据里学退化表征。CNN 擅长在局部时间窗内捕捉冲击和调制模式,LSTM 擅长把前后时刻的状态连起来。把两者串起来,就构成了这份代码的核心思路。

数据来自 IEEE PHM 2012 Data Challenge。实验台是 PRONOSTIA,轴承在恒定载荷下加速退化直到失效,振动信号采样率 25.6 kHz,每 10 秒采集一次,每次 0.1 秒、2560 个采样点。工程使用 Bearing1_1 至 Bearing1_7 共 7 组全生命周期数据。


二、代码主要功能

工程分两个主脚本,职责很清楚:

文件 作用
main1_Data.m 读取 7 组轴承的 CSV 振动数据,滑窗切分,提取 26 维时频特征,保存为 feature_reconstructedData.mat
main2_CNN_BiLSTM.m 以 Bearing1_1、1_2 为训练集,Bearing1_3 为测试集,训练 CNN-BiLSTM,输出指标与 8 张分析图
loadBearingData.m 批量读取 acc*.csv,抽取第 5 通道(水平振动),按 2560 点分段
create_sliding_window_data.m 构造滑动窗口样本并生成 1→0 线性递减的 RUL 标签
feature_extraction.m 14 个时域特征 + 12 个频域特征
evaluateModel.m 计算 RMSE、MAE、R²
plotBearingData.m、radarChart.m 时域波形与雷达图

除了预测曲线,脚本还产出 PCA 特征分布图、三维退化轨迹图、卷积核权重热力图、误差对比图、分阶段损失图。这些图不是装饰,后面会看到它们恰好暴露了模型的两个短板。


三、数据与特征工程

3.1 为什么一定要滑窗

单次采集只有 0.1 秒。这个时间尺度上,网络看到的是局部冲击,很难判断轴承处在寿命的哪个阶段。代码把连续 3 次采集拼成一个窗口(window_size = 3,stride = 1),相当于用 30 秒跨度内的 0.3 秒信号作为一条样本。窗口越大,退化趋势越明显,但样本数会减少;窗口越小,样本多但趋势信息弱。3 是这份工程选定的折中值。

切窗后每个样本是 7680 个采样点,标签按窗口末端位置线性映射:

yi=1−ei−1N−1 y_i = 1 - \frac{e_i - 1}{N - 1} yi=1−N−1ei−1

其中 eie_iei 是第 iii 个窗口末端在整段寿命中的位置,NNN 是该轴承的总采样次数。这样每组轴承的标签都从 1 平滑降到 0,表示"剩余寿命占全寿命的比例"。需要说明,这个标签是归一化后的相对量,不是小时数。

3.2 26 维时频特征

对每个 7680 点窗口,代码提取两类特征:

时域 14 维:均值、标准差、RMS、方差、峰值、峰峰值、偏度、峭度、波形因子、峰值因子、脉冲因子、裕度因子、能量、绝对均值。

其中几个无量纲指标的物理含义比较直接:

RMS=1N∑n=1Nxn2,K=1N∑n=1N(xn−xˉ)4σ4,Cf=max⁡∣xn∣RMS \mathrm{RMS}=\sqrt{\frac{1}{N}\sum_{n=1}^{N}x_n^2},\qquad K=\frac{\frac{1}{N}\sum_{n=1}^{N}(x_n-\bar{x})^4}{\sigma^4},\qquad C_f=\frac{\max|x_n|}{\mathrm{RMS}} RMS=N1n=1∑Nxn2 ,K=σ4N1∑n=1N(xn−xˉ)4,Cf=RMSmax∣xn∣

RMS 反映振动能量,随损伤加重整体抬升;峭度对冲击成分敏感,早期点蚀阶段就会明显变大;峰值因子、脉冲因子、裕度因子都在描述"峰值相对整体水平有多突出",是轴承故障诊断里的常用无量纲指标。

频域 12 维:频谱能量、主频率、主频幅值、频率中心、均方频率、均方根频率、频率方差、频率标准差、前 5 峰值平均幅值、频谱峭度、频谱偏度、频谱平坦度。

频率中心和频率方差用归一化幅值谱构造概率分布:

pi=∣Xi∣∑j∣Xj∣,fc=∑ifipi,σf2=∑i(fi−fc)2pi p_i=\frac{|X_i|}{\sum_j |X_j|},\qquad f_c=\sum_i f_i p_i,\qquad \sigma_f^2=\sum_i (f_i-f_c)^2 p_i pi=∑j∣Xj∣∣Xi∣,fc=i∑fipi,σf2=i∑(fi−fc)2pi

共振频带随损伤扩展发生偏移,频率中心和高阶谱矩能捕捉到这种迁移。频谱峭度、频谱偏度则是在频域上重复峭度、偏度的统计思路。

3.3 标准化

训练集和测试集用同一组统计量做 z-score:

x~=x−μσ \tilde{x}=\frac{x-\mu}{\sigma} x~=σx−μ

μ\muμ、σ\sigmaσ 只从训练集算,避免测试信息泄漏。代码里还有一步 isnan(...)=0,用来处理标准差为 0 的常量特征,属于必要的兜底。


四、技术路线

整条链路可以概括为六步:

  1. 原始信号:7 组轴承的水平振动加速度,25.6 kHz 采样。
  2. 滑窗构造样本:3 次采集拼一条,步长 1,标签线性归一化。
  3. 特征提取:每窗 26 维时频特征,形成"样本 × 特征"矩阵。
  4. 标准化:训练集统计量统一处理训练与测试数据。
  5. 序列化:把每个 26 维特征向量视为"1 通道 × 26 时间步"的序列,送入网络。
  6. 回归与评估:输出 1 维 RUL,计算 RMSE/MAE/R²,并生成诊断图表。

第 5 步是这个工程里比较巧的一处。原始特征本来是 26 个并列的统计量,没有时间顺序。代码把特征索引当作时间步,用 1D 卷积沿"特征维度"做局部组合,再用 BiLSTM 建模特征之间的依赖。这种处理不是严格意义上的时序建模,但它保留了原有 BiLSTM 代码的输入输出维度,改动量小,也让卷积核学到了特征之间的组合模式。


五、算法原理与公式

5.1 1D-CNN 特征提取

一维卷积在特征序列上滑动,第 kkk 个卷积核的输出为:

hk(i)=ReLU(∑c=1C∑τ=0K−1wk,c(τ) xc(i+τ)+bk) h_k(i)=\mathrm{ReLU}\left(\sum_{c=1}^{C}\sum_{\tau=0}^{K-1}w_{k,c}(\tau)\,x_c(i+\tau)+b_k\right) hk(i)=ReLU(c=1∑Cτ=0∑K−1wk,c(τ)xc(i+τ)+bk)

这里 K=3K=3K=3,即每次看相邻 3 个特征。第一层 32 个卷积核、第二层 64 个,Padding 设为 same,保证卷积前后长度不变。每层卷积后接窗口为 2、步长为 2 的最大池化:

pk(i)=max⁡0≤j<2hk(2i+j) p_k(i)=\max_{0\le j<2} h_k(2i+j) pk(i)=0≤j<2maxhk(2i+j)

26 步经过两次池化后变为 6 步,序列被压缩,计算量下降,同时保留主要响应。

5.2 BiLSTM 时序建模

LSTM 用门控机制控制信息的写入、遗忘和输出:

it=σ(Wixt+Uiht−1+bi),ft=σ(Wfxt+Ufht−1+bf),ot=σ(Woxt+Uoht−1+bo) i_t=\sigma(W_ix_t+U_ih_{t-1}+b_i),\quad f_t=\sigma(W_fx_t+U_fh_{t-1}+b_f),\quad o_t=\sigma(W_ox_t+U_oh_{t-1}+b_o) it=σ(Wixt+Uiht−1+bi),ft=σ(Wfxt+Ufht−1+bf),ot=σ(Woxt+Uoht−1+bo)

c~t=tanh⁡(Wcxt+Ucht−1+bc),ct=ft⊙ct−1+it⊙c~t \tilde{c}t=\tanh(W_cx_t+U_ch{t-1}+b_c),\qquad c_t=f_t\odot c_{t-1}+i_t\odot\tilde{c}_t c~t=tanh(Wcxt+Ucht−1+bc),ct=ft⊙ct−1+it⊙c~t

ht=ot⊙tanh⁡(ct) h_t=o_t\odot\tanh(c_t) ht=ot⊙tanh(ct)

BiLSTM 在此基础上正反两个方向各跑一遍,把两个隐藏状态拼接:

Ht=h→t⊕h←t H_t=\overrightarrow{h}_t\oplus\overleftarrow{h}_t Ht=h t⊕h t

代码设置 OutputMode = 'last',只取最后一个时间步的 200 维拼接状态(100 维正向 + 100 维反向),再接全连接层。这样做的好处是输出维度固定,适合回归任务;代价是序列中段的细节只通过隐藏状态间接保留。

5.3 回归头与损失

BiLSTM 之后是 Dropout(0.2) → FC(50) → ReLU → Dropout(0.2) → FC(25) → ReLU → FC(1)。两层带 Dropout 的全连接承担非线性映射,把 200 维状态压到 1 个标量。

训练目标是带 L2 正则的均方误差:

L=1M∑m=1M(y^m−ym)2+λ∥W∥22 L=\frac{1}{M}\sum_{m=1}^{M}\left(\hat{y}_m-y_m\right)^2+\lambda\|W\|_2^2 L=M1m=1∑M(y^m−ym)2+λ∥W∥22

λ=10−3\lambda=10^{-3}λ=10−3。MSE 对偏差敏感,RUL 预测里较大的偏差正是最需要惩罚的部分。

5.4 评价指标

RMSE=1M∑m=1M(y^m−ym)2,MAE=1M∑m=1M∣y^m−ym∣ \mathrm{RMSE}=\sqrt{\frac{1}{M}\sum_{m=1}^{M}(\hat{y}m-y_m)^2},\qquad \mathrm{MAE}=\frac{1}{M}\sum{m=1}^{M}|\hat{y}_m-y_m| RMSE=M1m=1∑M(y^m−ym)2 ,MAE=M1m=1∑M∣y^m−ym∣

R2=1−∑m(y^m−ym)2∑m(ym−yˉ)2 R^2=1-\frac{\sum_{m}(\hat{y}m-y_m)^2}{\sum{m}(y_m-\bar{y})^2} R2=1−∑m(ym−yˉ)2∑m(y^m−ym)2

因为标签是 0~1 的归一化寿命,RMSE 0.0888 大致相当于"平均偏差为全寿命的 8.9%"。


六、参数设定

类别 参数 取值
数据 采样频率 / 单次长度 25.6 kHz / 2560 点(0.1 s)
数据 采集间隔 10 s
数据 输入通道 第 5 通道,水平振动
预处理 滑窗大小 / 步长 3 / 1
预处理 单个窗口长度 3 × 2560 = 7680 点
预处理 特征维度 14 时域 + 12 频域 = 26
网络 卷积核 3,通道数 32 → 64
网络 池化 最大池化,窗口 2,步长 2
网络 BiLSTM 隐藏单元 100(双向共 200 维输出)
网络 全连接 50 → 25 → 1
网络 Dropout 0.2 / 0.2
训练 优化器 Adam
训练 初始学习率 0.005
训练 学习率策略 每 50 轮 × 0.5
训练 最大轮数 150
训练 MiniBatch 64(约 46 次迭代/轮,共约 6900 次)
训练 验证集比例 20%(随机划分)
训练 验证频率 每 30 次迭代
训练 梯度阈值 / L2 1 / 0.001
输出 网络选择 验证损失最优(best-validation-loss)

训练集由 Bearing1_1 与 Bearing1_2 的窗口样本拼接而成,验证集从训练样本中随机抽 20%。测试用 Bearing1_3 的完整退化序列,不参与任何训练或标准化统计。


七、运行环境与实测结果

运行环境 :MATLAB + Deep Learning Toolbox,trainNetwork 与 sequenceInputLayer 需要 R2018b 及以上版本,建议 R2021a 之后运行。全部流程在单机完成,不依赖额外工具箱;绘图用到 sgtitle、polarplot,同样要求较新的 MATLAB 版本。

本次运行输出:

复制代码
训练结束: 已完成最大轮数。
  RMSE: 0.0888 | MAE: 0.0717 | R²: 0.9054 | 时间: 281.28s

150 轮训练加测试预测共 281.28 秒。R² 0.9054 说明模型解释了测试轴承约 90% 的寿命变化方差,在只用一个轴承做训练、另一个做测试的设定下,这个水平是合理的。

预测曲线整体贴着真实 RUL 的线性下降趋势走,误差带(±1 倍残差标准差)覆盖了大部分真实值。曲线的锯齿感很明显,这是逐窗口独立预测的典型表现:相邻窗口的特征抖动直接反映到了输出上,模型没有做任何时间平滑。

损失在前 200 次迭代内从 0.18 降到 0.005 以下,之后基本走平。验证损失与训练损失几乎重合,没有出现明显的过拟合间隙,best-validation-loss 保存的模型与最后一轮差别不大。学习率在第 50、100 轮各降一半,损失曲线上对应位置能看到轻微的下台阶,幅度很小,说明模型在早期就已经收敛到当前容量下的较优区域。


八、结果复盘

这部分是整份工程最值得看的地方,指标好看不代表没有问题。

8.1 误差的形状不是随机的

残差图显示误差并不是围绕 0 均匀分布的白噪声,而是有明确的结构:

  • 寿命前段(样本 0~500):残差在 +0.05 附近,预测值略低于真实值,偏保守。
  • 寿命中段(样本 1000~1500):残差整体跌到 -0.1 至 -0.2,预测值高于真实值,也就是高估了剩余寿命。
  • 寿命后段(样本 2000 之后):残差回到 0 附近,甚至略微为正,末端预测重新贴近真实值。

中段高估 RUL 是最需要警惕的方向。维护决策里,高估意味着"还能再用一阵",可能把停机窗口排得太晚。误差在 ±0.2 以内波动,但系统性偏移比随机抖动更难通过简单平均消除。

一个可能的解释是:训练集只有 Bearing1_1 和 Bearing1_2 两组退化轨迹,两者在中段的速度、纹理与测试轴承不完全一致,网络学到的是"平均退化形状",遇到测试轴承中段加速退化时反应滞后。

8.2 PCA 图揭示了分布偏移

第一主成分贡献 58.2%,第二主成分 13.4%,两者合计 71.6%。训练样本(圆点)密集堆在 PC1 靠近 0 的窄带里,测试样本(菱形)沿 PC1 一路向右延伸到 100 附近,颜色从深蓝(RUL 接近 0)渐变,轨迹清晰。

这说明测试轴承的特征分布已经跑出了训练集覆盖范围。模型仍能给出合理的预测,靠的是特征与 RUL 之间的单调关系,而不是严格的同分布假设。换一个工况差异更大的轴承,这个偏移会直接变成精度损失。跨轴承预测的难点就在这里。

8.3 三维轨迹与卷积核热力图

取 RMS、峭度、频谱峭度三个特征做三维散点,测试轴承的退化轨迹是一条带弯曲的弧线,而不是直线。退化前期以峭度上升为主,后期 RMS 抬升更明显。这解释了为什么单一特征做线性回归不够用,也解释了网络需要非线性映射。

左图是第一个 1D 卷积层的 32 个卷积核权重,横轴是核内 3 个位置,纵轴是 32 个核。权重分布有明显差异,说明不同卷积核关注的特征邻接组合不同;右图是测试集标准化后的 26 维特征随时间的演化,后半段多个特征同时变亮或变暗,与 RUL 下降同步。

8.4 性能指标的边界

雷达图里的四项指标做过归一化,只适合直观比较,不能当作绝对分数看。需要提醒的是,RMSE、MAE 都建立在"线性归一化 RUL"这个标签假设上。真实退化很少严格线性,早期缓慢、后期加速是常态,线性标签会把这种非线性摊平,模型学到的曲线自然也偏直。


九、应用场景

这套流程适合作为预测性维护的算法原型,落地场景包括:

  • 风电主轴与发电机轴承:停机成本高,提前数周给出 RUL 估计可以协调吊装与备件。
  • 轨道交通牵引电机轴承:结合车载振动监测,做检修周期优化。
  • 机床主轴:加工精度对轴承状态敏感,RUL 可用于刀具与主轴联合排程。
  • 泵、压缩机、轧机:连续流程工业里,非计划停机的损失远高于维护成本。
  • 实验台与教学:PHM2012 数据公开、流程完整,适合作为 RUL 算法的基线对比对象。

工程落地时有两点要补齐:一是把归一化 RUL 换算成小时数或里程,需要每组设备的全寿命先验;二是模型要在目标设备上做微调或域适应,跨设备直接套用精度会掉。


十、局限与可改进点

  1. 标签过于理想。线性 1→0 的映射忽略了退化阶段性。可改用指数退化模型、分段线性标签,或直接用健康指标(HI)构造标签。
  2. 训练轴承太少。两组训练、一组测试,结论的统计意义有限。更严谨的做法是留一轴承交叉验证,报告多组结果的均值与方差。
  3. 单通道输入。代码只用了水平振动。垂直通道与水平通道的融合,或增加电流、温度等异源信号,通常能提升早期灵敏度。
  4. 预测不平滑。逐窗口独立输出导致曲线锯齿明显。可在推理端加滑动平均、卡尔曼滤波,或在网络里加时序约束。
  5. 缺少不确定性校准。图中的置信带由残差标准差近似,属于事后统计,不是模型自身给出的分布。要做风险决策,需要分位数回归或 MC Dropout 这类能输出校准不确定性的方法。
  6. 特征-时间步的错位。把 26 个统计特征当成 26 个时间步,卷积学到的是特征间的组合关系,而不是真正的时序模式。若追求更强的时序建模,应改为多窗口特征序列输入。

数据与声明

  • 数据集:IEEE PHM 2012 Data Challenge(PRONOSTIA 平台),公开可获取。
  • 运行结果:RMSE 0.0888、MAE 0.0717、R² 0.9054,训练与预测耗时 281.28 秒,数值会随硬件与随机初始化略有浮动。
  • 本文结果仅用于算法演示与方法讨论,不构成任何工业设备的维护决策依据。实际部署前需在目标工况下重新验证。
相关推荐
苦瓜汤补钙3 小时前
Matlab 2022b(中文)的使用教程——Win11
开发语言·matlab
jay神20 小时前
基于 YOLOv8 与 Faster R-CNN 的盲道障碍检测系统
人工智能·深度学习·yolo·计算机视觉·cnn·课程设计·计算机毕业设计
星夜离尘5621 小时前
MATLAB 工程实验:滞回加持续时间报警,把 UNKNOWN 留在状态机里
开发语言·matlab
田里的水稻21 小时前
FA_CNN卷积神经网络四---线性层及其拉平PyTorch
人工智能·pytorch·python·深度学习·神经网络·cnn
田里的水稻1 天前
FA_CNN卷积神经网络二---PyTorch
人工智能·pytorch·python·深度学习·cnn
奋进小青1 天前
2026年CNN与Transformer融合的创新点思路
人工智能·cnn·transformer
老鱼说AI1 天前
卷积神经网络的反向传播细节
人工智能·深度学习·神经网络·机器学习·计算机视觉·cnn·超分辨率重建
田里的水稻2 天前
FA_CNN卷积神经网络七---优化器PyTorch
人工智能·pytorch·深度学习·神经网络·cnn
星夜离尘562 天前
MATLAB 只剩批次摘要怎么合并方差:用 n、mean、M2 保留批间差异
开发语言·matlab