✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。
🍎 往期回顾关注个人主页:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。
🔥 内容介绍
1 研究背景与意义
轴承作为旋转机械的核心零部件,其运行状态直接决定设备可靠性与生产安全性,在航空航天、智能制造、轨道交通等领域具有不可替代的作用。PHM 轴承数据集记录了轴承全生命周期的振动、温度等监测数据,基于该数据的剩余寿命(Remaining Useful Life, RUL)预测是设备预防性维护的关键技术,核心挑战在于:
退化特征复杂性:轴承退化过程呈现非线性、非平稳特性,从正常状态到失效阶段的特征演化存在突变点,传统时序模型难以捕捉多尺度退化规律;
长时依赖与局部特征权衡:单一 LSTM/GRU 模型在长序列数据中易出现梯度消失,难以捕捉全生命周期的长时退化趋势;Transformer 的自注意力机制虽擅长长距离依赖建模,但对局部瞬时退化特征(如早期故障脉冲信号)的敏感度不足;
小样本与标签稀缺:PHM 数据集中失效样本极少,RUL 标签需基于退化趋势间接构建,传统模型泛化能力不足,易出现过拟合;
工程实用性需求:实际工业场景中需兼顾预测精度与实时性,单一模型难以平衡 “长时趋势预判” 与 “短期状态响应”。
Transformer-LSTM 双分支协同模型通过 “全局长时依赖提取 + 局部时序特征捕捉” 的互补架构,可精准建模轴承退化过程的多尺度特征,解决 PHM 数据集下 RUL 预测的核心痛点。本研究基于 PHM 标准数据集验证模型性能,为工业设备的预防性维护提供科学依据,对降低停机损失、提升设备运维效率具有重要理论与工程价值。
Image
Image
3 Transformer-LSTM 双分支协同模型设计
3.1 模型整体架构(核心创新:双分支特征融合)
模型采用 “特征输入→双分支并行建模→注意力融合→RUL 预测” 的四阶段架构,突破单一模型的特征捕捉局限:
核心逻辑:Transformer 分支捕捉全生命周期的长时退化趋势(如缓慢退化阶段的 HI 渐进变化),LSTM 分支捕捉局部瞬时特征(如快速退化阶段的冲击信号突变),通过注意力融合层动态分配两类特征权重,提升预测精度。
3.2 各模块详细设计
3.2.1 位置编码层(适配 Transformer 时序建模)
针对轴承监测数据的时序特性,设计 “自适应周期位置编码”:
Image
⛳️ 运行结果
Image
Image
Image
Image
Image
📣 部分代码
function [R,rmse,biaozhuncha,mae,mape]=calc_error(x1,x2)
%此函数用于计算预测值和实际(期望)值的各项误差指标
% 参数说明
%----函数的输入值-------
% x1:真实值
% x2:预测值
%----函数的返回值-------
% mae:平均绝对误差(是绝对误差的平均值,反映预测值误差的实际情况.)
% mse:均方误差(是预测值与实际值偏差的平方和与样本总数的比值)
% rmse:均方误差根(是预测值与实际值偏差的平方和与样本总数的比值的平方根,也就是mse开根号,
% 用来衡量预测值同实际值之间的偏差)
% mape:平均绝对百分比误差(是预测值与实际值偏差绝对值与实际值的比值,取平均值的结果,可以消除量纲的影响,用于客观的评价偏差)
% error:误差
% errorPercent:相对误差
if nargin==2
if size(x1,2)==1
x1=x1'; %将列向量转换为行向量
end
if size(x2,2)==1
x2=x2'; %将列向量转换为行向量
end
num=size(x1,2);%统计样本总数
error=x2-x1; %计算误差
x1(find(x1==0))=inf;
errorPercent=abs(error)./x1; %计算每个样本的绝对百分比误差
mae=sum(abs(error))/num; %计算平均绝对误差
mse=sum(error.*error)/num; %计算均方误差
rmse=sqrt(mse); %计算均方误差根
mape=mean(errorPercent); %计算平均绝对百分比误差
biaozhuncha=std(x2);
%结果输出
for i=1:size(x1,1)
tempdata=(x1(i,:)-x2(i,:)).^2;
tempdata2=(x1(i,:)-mean(x1(i,:))).^2;
R(i)=1 - ( sum(tempdata)/sum(tempdata2) );
% disp(['决定系数R为: ',num2str(R(i))])
end
disp(['标准差为: ',num2str(biaozhuncha)])
disp(['均方误差根rmse为: ',num2str(rmse)])
disp(['平均绝对误差mae为: ',num2str(mae)])
disp(['平均绝对百分比误差mape为: ',num2str(mape*100),' %'])
else
disp('函数调用方法有误,请检查输入参数的个数')
end
end
🔗 参考文献
图片
🏆团队擅长辅导定制多种科研领域MATLAB仿真,助力科研梦: