1.31、基于长短记忆网络(LSTM)的发动机剩余寿命预测(matlab)

1、基于长短记忆网络(LSTM)的发动机剩余寿命预测的原理及流程

基于长短期记忆网络(LSTM)的发动机剩余寿命预测是一种常见的机器学习应用,用于分析和预测发动机或其他设备的剩余可用寿命。下面是LSTM用于发动机剩余寿命预测的原理和流程:

  1. **数据收集:**首先收集发动机的传感器数据,例如温度、压力、振动等信息,以及与发动机维护记录相关的数据,比如保养历史、维修记录等。

  2. **数据预处理:**对收集到的数据进行清洗、去噪、特征提取等预处理工作,以便用于模型训练。同时,将数据按时间顺序进行排序,以便构建时间序列数据集。

  3. **构建LSTM模型:**使用深度学习框架如TensorFlow、Keras等,构建LSTM神经网络模型。LSTM适合处理时间序列数据,可以捕捉数据中的长期依赖关系,并在预测序列数据方面表现优异。

  4. **数据划分:**将数据集划分为训练集和测试集,通常训练集包含历史数据,而测试集包含待预测的数据。

  5. **模型训练:**使用训练集对LSTM模型进行训练,在训练过程中优化模型参数,使模型能够准确地学习数据中的规律和模式。

  6. **模型预测:**使用训练好的LSTM模型对测试集中的数据进行预测,得到发动机剩余寿命的预测结果。

  7. **评估模型性能:**通过与实际的剩余寿命数据进行比较,评估模型的性能,通常会使用指标如均方根误差(RMSE)等来衡量模型的准确性。

  8. **预测与优化:**根据模型的预测结果,制定相应的维护计划,提前预防发动机故障,延长设备的使用寿命。同时,可以不断优化LSTM模型,提高预测准确性和稳定性。

通过以上流程,基于LSTM的发动机剩余寿命预测技术可以帮助企业提高设备维护效率,降低运营成本,提高设备的可靠性和稳定性。

2、基于长短记忆网络(LSTM)的发动机剩余寿命预测说明

使用长短记忆网络(LSTM)依据时间序列数据预测发动机的剩余使用寿命

3、数据集处理

1)说明

创建一个目录来存储涡轮风扇发动机退化仿真数据集

2)代码

Matlab 复制代码
dataFolder = fullfile(tempdir,"turbofan");
if ~exist(dataFolder,"dir")
    mkdir(dataFolder);
end

4、准备训练数据

1)提取数据

实现代码

Matlab 复制代码
filenamePredictors = fullfile(dataFolder,"train_FD001.txt");
[XTrain,TTrain] = processTurboFanDataTrain(filenamePredictors);

2)删除具有常量值的特征

实现代码

Matlab 复制代码
XTrainConcatenatedTimesteps = cat(1,XTrain{:});
m = min(XTrainConcatenatedTimesteps,[],1);
M = max(XTrainConcatenatedTimesteps,[],1);
idxConstant = M == m;

for i = 1:numel(XTrain)
    XTrain{i}(:,idxConstant) = [];
end

3)查看序列中其余特征的数量

实现代码

Matlab 复制代码
numFeatures = size(XTrain{1},2)

4)归一化训练预测变量

将训练预测变量归一化为具有零均值和单位方差。

实现代码

Matlab 复制代码
XTrainConcatenatedTimesteps = cat(1,XTrain{:});
mu = mean(XTrainConcatenatedTimesteps,1);
sig = std(XTrainConcatenatedTimesteps,0,1);

for i = 1:numel(XTrain)
    XTrain{i} = (XTrain{i} - mu) ./ sig;
end

5)裁剪响应

更多地从发动机快要出现故障时的序列数据中进行学习,以阈值 150 对响应进行裁剪。这会使网络将具有更高 RUL 值的实例视为等同。

实现代码

Matlab 复制代码
thr = 150;
for i = 1:numel(TTrain)
    TTrain{i}(TTrain{i} > thr) = thr;
end

视图效果

6)准备要填充的数据

均匀划分训练数据的小批量大小,并减少小批量中的填充量

按序列长度对训练数据进行排序

实现代码

Matlab 复制代码
for i=1:numel(XTrain)
    sequence = XTrain{i};
    sequenceLengths(i) = size(sequence,1);
end

[sequenceLengths,idx] = sort(sequenceLengths,"descend");
XTrain = XTrain(idx);
TTrain = TTrain(idx);

7)查看排序的序列长度

实现代码

Matlab 复制代码
figure
bar(sequenceLengths)
xlabel("Sequence")
ylabel("Length")
title("Sorted Data")

视图效果

5、定义网络架构

1)创建网络

创建一个 LSTM 网络,该网络包含一个具有 200 个隐藏单元的 LSTM 层,然后是一个大小为 50 的全连接层和一个丢弃概率为 0.5 的丢弃层。

实现代码

Matlab 复制代码
numResponses = size(TTrain{1},2);
numHiddenUnits = 200;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,OutputMode="sequence")
    fullyConnectedLayer(50)
    dropoutLayer(0.5)
    fullyConnectedLayer(numResponses)];

2)指定训练选项

使用求解器 "adam" 以大小为 20 的小批量进行 60 轮训练。

指定学习率为 0.01。防止梯度爆炸,将梯度阈值设置为 1。

使序列保持按长度排序,将 Shuffle 选项设置为 "never"。

实现代码

Matlab 复制代码
maxEpochs = 60;
miniBatchSize = 20;

options = trainingOptions("adam", ...
    MaxEpochs=maxEpochs, ...
    MiniBatchSize=miniBatchSize, ...
    InitialLearnRate=0.01, ...
    GradientThreshold=1, ...
    Shuffle="never", ...
    Metrics="rmse", ...
    Plots="training-progress", ...
    Verbose=0);

6、训练网络

使用 trainnet 函数训练神经网络

实现代码

Matlab 复制代码
net = trainnet(XTrain,TTrain,layers,"mse",options);

视图效果

7、测试网络

1)提取数据

实现代码

Matlab 复制代码
filenamePredictors = fullfile(dataFolder,"test_FD001.txt");
filenameResponses = fullfile(dataFolder,"RUL_FD001.txt");
[XTest,TTest] = processTurboFanDataTest(filenamePredictors,filenameResponses);

2)裁剪数据

实现代码

Matlab 复制代码
for i = 1:numel(XTest)
    XTest{i}(:,idxConstant) = [];
    XTest{i} = (XTest{i} - mu) ./ sig;
    TTest{i}(TTest{i} > thr) = thr;
end

3)数据预测

实现代码

Matlab 复制代码
YTest = minibatchpredict(net,XTest,MiniBatchSize=1,UniformOutput=false);

4)可视化

实现代码

Matlab 复制代码
idx = randperm(numel(YTest),4);
figure
for i = 1:numel(idx)
    subplot(2,2,i)
    
    plot(TTest{idx(i)},"--")
    hold on
    plot(YTest{idx(i)},".-")
    hold off
    
    ylim([0 thr + 25])
    title("Test Observation " + idx(i))
    xlabel("Time Step")
    ylabel("RUL")
end
legend(["Test Data" "Predicted"],Location="southeast")

视图效果

5)可视化预测误差

实现代码

Matlab 复制代码
for i = 1:numel(TTest)
    TTestLast(i) = TTest{i}(end);
    YTestLast(i) = YTest{i}(end);
end
figure
rmse = sqrt(mean((YTestLast - TTestLast).^2))

histogram(YTestLast - TTestLast)
title("RMSE = " + rmse)
ylabel("Frequency")
xlabel("Error")

视图效果

8、总结

在 MATLAB 中使用 LSTM 模型进行发动机剩余寿命预测可以通过以下步骤:

  1. 数据准备:

    • 使用 MATLAB 加载发动机传感器数据,包括温度、压力、振动等信息。
    • 对数据进行清洗、归一化处理。
    • 将数据按时间序列进行整理,构建时间窗口,以便输入 LSTM 模型。
  2. 创建 LSTM 模型:

    • 使用 MATLAB 中的 Neural Network Toolbox 创建 LSTM 模型。
    • 定义 LSTM 网络的层数、神经元数量、学习率等超参数。
    • 可以通过 MATLAB 中的训练器(trainNetwork)来训练 LSTM 网络。
  3. 划分数据集:

    • 将处理好的数据集划分为训练集、验证集和测试集。
    • 训练集用于训练 LSTM 模型,验证集用于调整超参数,测试集用于评估模型性能。
  4. 模型训练与优化:

    • 使用训练集训练 LSTM 模型,在训练过程中监控损失函数并调整超参数。
    • 通过验证集来避免过拟合,选择最佳模型。
  5. 模型预测与评估:

    • 使用训练好的 LSTM 模型对测试集数据进行预测,得到发动机剩余寿命的预测值。
    • 使用评价指标如均方根误差(RMSE)来评估模型的预测准确性。
  6. 优化与改进:

    • 根据预测结果,优化发动机的维护计划,延长设备的寿命。
    • 可以尝试不同的超参数、网络结构等进一步优化 LSTM 模型。

通过以上步骤,在 MATLAB 中使用 LSTM 模型进行发动机剩余寿命预测,可以帮助提高设备维护效率和可靠性。

9、源代码

代码

Matlab 复制代码
%% 基于长短记忆网络(LSTM)的发动机剩余寿命预测
%使用长短记忆网络(LSTM)依据时间序列数据预测发动机的剩余使用寿命

%% 数据集处理
%创建一个目录来存储涡轮风扇发动机退化仿真数据集
dataFolder = fullfile(tempdir,"turbofan");
if ~exist(dataFolder,"dir")
    mkdir(dataFolder);
end

%% 准备训练数据
%使用函数 processTurboFanDataTrain 从 filenamePredictors 中提取数据并返回元胞数组 XTrain 和 TTrain,其中包含训练预测变量和响应序列。
filenamePredictors = fullfile(dataFolder,"train_FD001.txt");
[XTrain,TTrain] = processTurboFanDataTrain(filenamePredictors);

%删除具有常量值的特征
XTrainConcatenatedTimesteps = cat(1,XTrain{:});
m = min(XTrainConcatenatedTimesteps,[],1);
M = max(XTrainConcatenatedTimesteps,[],1);
idxConstant = M == m;

for i = 1:numel(XTrain)
    XTrain{i}(:,idxConstant) = [];
end
%查看序列中其余特征的数量
numFeatures = size(XTrain{1},2)

%归一化训练预测变量
%将训练预测变量归一化为具有零均值和单位方差。
XTrainConcatenatedTimesteps = cat(1,XTrain{:});
mu = mean(XTrainConcatenatedTimesteps,1);
sig = std(XTrainConcatenatedTimesteps,0,1);

for i = 1:numel(XTrain)
    XTrain{i} = (XTrain{i} - mu) ./ sig;
end
%裁剪响应
%更多地从发动机快要出现故障时的序列数据中进行学习,以阈值 150 对响应进行裁剪。这会使网络将具有更高 RUL 值的实例视为等同。
thr = 150;
for i = 1:numel(TTrain)
    TTrain{i}(TTrain{i} > thr) = thr;
end
%准备要填充的数据
%均匀划分训练数据的小批量大小,并减少小批量中的填充量
%按序列长度对训练数据进行排序
for i=1:numel(XTrain)
    sequence = XTrain{i};
    sequenceLengths(i) = size(sequence,1);
end

[sequenceLengths,idx] = sort(sequenceLengths,"descend");
XTrain = XTrain(idx);
TTrain = TTrain(idx);
%查看排序的序列长度
figure
bar(sequenceLengths)
xlabel("Sequence")
ylabel("Length")
title("Sorted Data")

%% 定义网络架构
%创建一个 LSTM 网络,该网络包含一个具有 200 个隐藏单元的 LSTM 层,然后是一个大小为 50 的全连接层和一个丢弃概率为 0.5 的丢弃层。
numResponses = size(TTrain{1},2);
numHiddenUnits = 200;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,OutputMode="sequence")
    fullyConnectedLayer(50)
    dropoutLayer(0.5)
    fullyConnectedLayer(numResponses)];
%指定训练选项
%使用求解器 "adam" 以大小为 20 的小批量进行 60 轮训练。
% 指定学习率为 0.01。防止梯度爆炸,将梯度阈值设置为 1。
% 使序列保持按长度排序,将 Shuffle 选项设置为 "never"。
maxEpochs = 60;
miniBatchSize = 20;

options = trainingOptions("adam", ...
    MaxEpochs=maxEpochs, ...
    MiniBatchSize=miniBatchSize, ...
    InitialLearnRate=0.01, ...
    GradientThreshold=1, ...
    Shuffle="never", ...
    Metrics="rmse", ...
    Plots="training-progress", ...
    Verbose=0);
%% 训练网络
%使用 trainnet 函数训练神经网络
net = trainnet(XTrain,TTrain,layers,"mse",options);
%% 测试网络
%使用函数 processTurboFanDataTest 从 filenamePredictors 和 filenameResponses 中提取数据并返回元胞数组 XTest 和 TTest,其中分别包含测试预测变量和响应序列
filenamePredictors = fullfile(dataFolder,"test_FD001.txt");
filenameResponses = fullfile(dataFolder,"RUL_FD001.txt");
[XTest,TTest] = processTurboFanDataTest(filenamePredictors,filenameResponses);
%使用与训练数据相同的阈值对测试响应进行裁剪
for i = 1:numel(XTest)
    XTest{i}(:,idxConstant) = [];
    XTest{i} = (XTest{i} - mu) ./ sig;
    TTest{i}(TTest{i} > thr) = thr;
end
%使用神经网络进行预测
YTest = minibatchpredict(net,XTest,MiniBatchSize=1,UniformOutput=false);
%可视化一些预测值
idx = randperm(numel(YTest),4);
figure
for i = 1:numel(idx)
    subplot(2,2,i)
    
    plot(TTest{idx(i)},"--")
    hold on
    plot(YTest{idx(i)},".-")
    hold off
    
    ylim([0 thr + 25])
    title("Test Observation " + idx(i))
    xlabel("Time Step")
    ylabel("RUL")
end
legend(["Test Data" "Predicted"],Location="southeast")
%直方图中可视化预测误差
for i = 1:numel(TTest)
    TTestLast(i) = TTest{i}(end);
    YTestLast(i) = YTest{i}(end);
end
figure
rmse = sqrt(mean((YTestLast - TTestLast).^2))

histogram(YTestLast - TTestLast)
title("RMSE = " + rmse)
ylabel("Frequency")
xlabel("Error")

程序文件

https://download.csdn.net/download/XU157303764/89538300

相关推荐
Shockang4 分钟前
LangGraph 状态机实战
人工智能
刹那芳华199216 分钟前
循环神经网络的从零开始实现(RNN)
人工智能·rnn·深度学习
阿童木写作25 分钟前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
科技之门26 分钟前
AI3D从建模到贴图、绑骨和动画的完整流程怎么做?V2Fun完整工作流指南
人工智能·3d·贴图
宇宙第一小趴菜27 分钟前
二、机器学习的应用领域和发展史
人工智能·机器学习
前端开发江鸟33 分钟前
我写过 MCP Server,却一直以为 MCP 只有 Tool
人工智能
天国梦1 小时前
自习室智能化升级避坑指南:天学网AI智习室方案实测与选型建议
大数据·人工智能
阿里云云原生1 小时前
可用性从 99.9% 跃升至 99.995%:畅捷通如何用 AI 重塑运维底座?
运维·网络·人工智能
ZhengEnCi1 小时前
MoE(Mixture of Experts,混合专家模型)深度解析:从路由机制到专家专业化的迷思
人工智能
shxjnpl2 小时前
Qwen3-ASR 从 PyTorch 迁移到 vLLM:一次信创环境下的推理路径改造实录
人工智能·pytorch·vllm