基于LSTM的刀具剩余使用寿命预测(matlab代码实现)

%% 数据集降维提取 相关性较高的特征值。
% 加载数据
clear
clc
load('D1.mat');

life = (314:-1:0)';
life1 = (314:-1:0)';
life  = [life;life1];
life  = [life;life1];
life  = [life;life1];
life  = [life;life1];

for f= 1:size(C1,2)
    Ti(:,f) = normalize(C1(:,f)); 
    d(1,f) = corr(life,Ti(:,f),'type','Spearman');
end
% 相关性系数
      d = abs(d);           %   将相关系数绝对值
    [j main_feature] = find(d>=0.8);
%    % ±0.80-±1.00  高度相关   
     M = length(main_feature);
 for k = 1:M  
     p = main_feature(1,k);
     c1(:,k) = C1(:,p);    %    提取降维特征
     c2(:,k) = C2(:,p);
     c3(:,k) = C3(:,p);
     c4(:,k) = C4(:,p);
     c5(:,k) = C5(:,p);
     c6(:,k) = C6(:,p); 
     L1(:,k) = l1(:,p);
     L2(:,k) = l2(:,p);
     L3(:,k) = l3(:,p);
     L4(:,k) = l4(:,p);
     L5(:,k) = l5(:,p);
     L6(:,k) = l6(:,p);
 end   
 
  clearvars -except c1 L1 life1 life
 %% 
% 训练集及测试集的划分
% 输入量与输出量定义
% %设置训练集及测试集
Data = [c1;L1];
T =[life;life1];
input.data =Data';
output.data =[life;life1]';

[output.data ,ps]= mapminmax(output.data,0,1); 
%序列的前 80% 用于训练,后 20% 用于测试
% 划分数据集的数目
n = 1575;    %训练集,测试集样本数目划分
% 输入量训练集与测试集划分
for j=1:size(input.data,1)
    input.XTrain(j,:)  =input.data(j,1:n);
    input.XTest(j,:) =input.data(j,n+1:end);
end
% 输入量数据结构转化(胞元结构)
input.XTrain ={input.XTrain};
input.XTest = {input.XTest};

% 输出量训练集与测试集划分,并数据结构转化
output.YTrain(1,:) = {output.data(1,1:n)};
output.YTest(1,:) = {output.data(1,n+1:end)};   

% 标准化
%数据预处理,将训练数据标准化为具有零均值和单位方差。
mu = mean([input.XTrain{:}],2);
sig = std([input.XTrain{:}],0,2);
for i = 1:numel(input.XTrain)
    input.XTrain{i} = (input.XTrain{i} - mu) ./ sig;
end
%% 
% q =rng;
% rng(q)
w =1;
s =1;
% % % % % % 设定随机种子数
rng('default')
rng(0);
inputSize = size(input.XTrain{1,1},1);   %数据输入x的特征维度
outputSize = size(output.YTrain{1,1},1);  %数据输出y的特征维度 
% for w =1:50
% for s =10:40 % 创建LSTM神经网络%
%创建LSTM回归网络,指定LSTM层的隐含单元个数
%序列预测,因此,输入原始数据特征值,输出为服役寿命的一维特征值。
% LSTM 层设置,参数设置


numhidden_units1=50;
numhidden_units2=29;
numhidden_units3=4;
numhidden_units4=2;
% lstm
layers = [ ...
    sequenceInputLayer(inputSize)              %输入层设置
%     gruLayer(numhidden_units1,'Outputmode','sequence')  
%     dropoutLayer(0.5,'name','dropout_1')  
%      gruLayer(numhidden_units2,'Outputmode','sequence')  
%      dropoutLayer(0.5,'name','dropout_2')  
lstmLayer(numhidden_units3,'Outputmode','sequence')
       dropoutLayer(0.5,'name','dropout_3')  
       lstmLayer(numhidden_units4,'Outputmode','sequence')  
       dropoutLayer(0.5,'name','dropout_4')
     fullyConnectedLayer(4)            %全连接层设置(outputsize:预测值的特征维度)
    fullyConnectedLayer(outputSize)            %全连接层设置(outputsize:预测值的特征维度)
%       tanhLayer('name','softmax')
    regressionLayer];                                   %回归层(因为负荷预测值为连续值,所以为回归层) 
    

   maxepochs=500;
   
% 指定训练选项。
options = trainingOptions('adam', ...        %优化算法
    'MaxEpochs',maxepochs, ...                   %遍历样本最大循环数
    'GradientThreshold',1,...             %梯度阈值
    'InitialLearnRate',0.0005, ...         %初始学习率
    'LearnRateSchedule','piecewise', ...  % 学习率计划
    'LearnRateDropPeriod',maxepochs/2, ...          %250个epoch后学习率更新
    'LearnRateDropFactor',0.5, ...        %学习率衰减速度
    'SequenceLength',n,...               %LSTM时间步长
    'MiniBatchSize',4,...             % 批处理样本大小
    'Shuffle','never',...  
    'Verbose',0,...
 'Plots','training-progress');     
                 % 是否重排数据顺序,防止数据中因连续异常值而影响预测精度     

                      
%训练LSTM
net = trainNetwork(input.XTrain,output.YTrain,layers,options);
 
% 预测
% 使用与训练数据相同的参数来归一化测试预测变量。
for i = 1:numel(input.XTest)
    input.XTest{i} = (input.XTest{i} - mu) ./ sig;
end
% 使用 predict 对测试数据进行预测。为防止函数向数据添加填充,请指定小批量大小为 1(预测步数)。
YPred(w,s)  = predict(net,input.XTest,'MiniBatchSize',1);      % 测试集
% 将预测集进行反归一化,以方便计算标准差

YPred1(w,s)  = mapminmax('reverse',YPred(w,s) ,ps);                   % 测试集反归一化
output.YTest1(w,s) = mapminmax('reverse',output.YTest,ps);      %  测试集真实值的反归一化

%计算均方根误差 (RMSE)。
rmse(w,s) = sqrt(mean((YPred1{w,s}-output.YTest1{w,s}).^2));          %测试集
 mae1=mean(abs(YPred1{w,s}-output.YTest1{w,s}));
% end       
%      end 

% % 
%  将预测值与测试数据进行比较
figure
subplot(2,1,1)
plot(output.YTest1{1,1})
hold on
plot(YPred1{1,1},'.-')
hold off
legend(["Observed" "Predicteud"])            % % 预测集数据对比
ylabel("Loads")
title("Forecast with Updates")
subplot(2,1,2)
stem(YPred1{1,1} - output.YTest1{1,1})
xlabel("Days")
ylabel("Error")
title("RMSE = " + rmse(1,1))
% %  
% clearvars -except GRU2

2.预测结果(LSTM层数设置问题,不想调了)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值