基于EMD-HHT包络谱与堆栈降噪自编码SDAE轴承故障诊断

目录

0.引言

1.方法原理

1.1 EMD-HHT包络谱

1.2 PCA

1.3 SDAE

2.流程

3.具体实现

3.1 数据准备

3.2 EMD-HHT包络谱求取

3.3 PCA降维

3.4 故障诊断

3.5 各对比结果

0.引言

        针对滚动轴承故障问题,提出一种基于经验模态分解–希尔伯特(empirical mode decomposition-Hilbert ,简称EMD-Hilbert)包络谱和堆栈自动编码器(Stack denoise auto-encoder,简称SDAE)的滚动轴承故障识别方法。该方法首先对滚动轴承各状态振动信号进行 EMD,然后选取前5个敏感本征模态函数 (intrinsic mode function,IMF),并对其进行 Hilbert 变换求取包络谱。最后将各状态振动信号的IMF包络谱按顺序构建新的高维数据,输入到SDAE中,实现故障识别。同时,由于提取的IMF包络谱特征维数过高,采用PCA对其中可能包含的冗余特征进行剔除。对比实验结果显示,采用包络谱+PCA+SDAE方法得到的故障识别正确率最高。

1.方法原理

1.1 EMD-HHT包络谱

        参考文献【基于 EEMD-Hilbert 包络谱和 DBN 的 变负载下滚动轴承状态识别方法】,EMD-HHT包络谱求取步骤为:1)对信号进行EMD分解;2)分别对每个分量做hilbert变换,得到包络线;3)对每个分量的包络线做FFT分析,得到最终特征数据。由于EMD分解出的分量个数并不确定,因此仅取其前5个分量做上述操作。

1.2 PCA

        主成分分析的原理就不说了。

1.3 SDAE

        这个原理百度就有,可以参考这里

2.流程

3.具体实现

3.1 数据准备

        采用西储大学轴承故障诊断数据集,48K/0HP数据,共10类故障(正常作为一类特殊的故障类型),划分后每个样本的采样点为1024,每类故障各200个样本,因此一共2000个样本,然后7:3划分训练集与测试集。

3.2 EMD-HHT包络谱求取

        任意取一个样本做分析,得到EMD分解与归一化后的特征分量如图所示。

3.3 PCA降维

        对训练集数据进行pca分析后,将数据降至600维。

method=@mapminmax;%对数据进行标准化 #mapstd mapminmax、
[xs,mapping]=method(train_x');train_x=xs';
xts=method('apply',test_x',mapping);test_x=xts';

[pc,score,latent,tsquare] = pca(train_x);%我们这里需要他的pc和latent值做分析

tran=pc(:,1:600);
feature= bsxfun(@minus,train_x,mean(train_x,1));
feature_train_x= feature*tran;
feature= bsxfun(@minus,test_x,mean(train_x,1));
feature_test_x= feature*tran;
train_x=feature_train_x;
test_x=feature_test_x;

3.4 故障诊断

采用如下参数构建整个SDAE网络。

%% 无监督训练多个降噪自动编码器 假设输入维度为 sizes=[n n1 n2],则训练两个ae 一个是n-n1-n 一个是n1-n2-n1
    sizes=[size(train_x,2) 50 30 size(train_y,2)]; % 这里 size(train_x,2)为输入层节点数 size(train_y,2)为分类层节点数
    learningRate1=0.01;%各dae的学习率
    denoise=0.5;%各dae的噪声强度
    numepochs1=10;%各dae的训练次数
    batchsize1=64;%%各dae的batchsize
    activation_function='sigm';%各ae的激活函数
    sae = sdaesetup(sizes,activation_function,learningRate1,denoise);
    opts.numepochs =   numepochs1; 
    opts.batchsize = batchsize1; 
    opts.show=0;% 0就不显示训练过程
    disp('Train DAEs ')
    sae = saetrain(sae, train_x, opts);
    %% 构建一个多层前向网络,然后采用上面无监督预训练好的几个DAE的输入层-隐含层权重来初始化,这就叫堆栈降噪自编码器-SDAE
    % 然后结合标签进行SDAE的微调训练
    learningRate2=0.1;%sae的学习率
    numepochs2=500;%sae的训练次数
    batchsize2=64;%sae的batchsize
    nn = nnsetup(sizes);%构建一个多层前向网络
    nn.activation_function= 'sigm';%和上面保持一致
    nn.learningRate= learningRate2;
    nn=saeunfoldnn(nn,sae);%利用DAE的参数初始化SDAE
    opts.numepochs =   numepochs2;
    opts.batchsize = batchsize2;
    nn.output      = 'softmax';

3.5 各对比结果

左上为包络谱+SAE(堆栈自动编码器,无降噪),右上为包络谱+PCA+SAE,左下为包络谱+SDAE,右下为包络谱+PCA+SDAE。4个模型均采用相同的训练集训练,最终测试集诊断率如图上title所示,可以看出包络谱+PCA+SDAE精度最高

代码见评论区。

以下是针对您的问题编写的 MATLAB 代码: 1. 故障轴承诊断: ```matlab % 加载数据 load('bearing.mat') % 绘制时域图像 figure plot(t, bearing) title('时域图像') % 计算FFT Y = fft(bearing); L = length(bearing); P2 = abs(Y/L); P1 = P2(1:L/2+1); P1(2:end-1) = 2*P1(2:end-1); f = Fs*(0:(L/2))/L; % 绘制频域图像 figure plot(f, P1) title('单侧幅值') xlabel('频率(Hz)') ylabel('幅值') ``` 2. 西储大学数据集: ```matlab % 加载数据 load('data.mat') % 随机排列数据 idx = randperm(size(X, 1)); X = X(idx, :); Y = Y(idx, :); % 划分数据集 train_ratio = 0.7; val_ratio = 0.15; test_ratio = 0.15; [trainInd,valInd,testInd] = divideblock(size(X, 1),train_ratio,val_ratio,test_ratio); % 训练模型 net = feedforwardnet([10, 5]); net = train(net, X(trainInd, :)', Y(trainInd, :)'); % 测试模型 Y_pred = net(X(testInd, :)'); acc = sum(round(Y_pred) == Y(testInd, :)') / length(testInd); disp(['测试集准确率为:', num2str(acc)]) ``` 3. 栈式稀疏自编码器: ```matlab % 加载数据 load('mnist.mat') % 划分数据集 train_ratio = 0.7; val_ratio = 0.15; test_ratio = 0.15; [trainInd,valInd,testInd] = divideblock(size(X, 1),train_ratio,val_ratio,test_ratio); % 训练模型 hiddenSize1 = 200; autoenc1 = trainAutoencoder(X(trainInd, :)', hiddenSize1, ... 'MaxEpochs', 400, 'L2WeightRegularization', 0.004, ... 'SparsityRegularization', 4, 'SparsityProportion', 0.15, ... 'ScaleData', false); hiddenSize2 = 100; autoenc2 = trainAutoencoder(encode(autoenc1, X(trainInd, :)'), hiddenSize2, ... 'MaxEpochs', 100, 'L2WeightRegularization', 0.002, ... 'SparsityRegularization', 4, 'SparsityProportion', 0.1, ... 'ScaleData', false); softnet = trainSoftmaxLayer(encode(autoenc2, X(trainInd, :)'), Y(trainInd, :)'); deepnet = stack(autoenc1, autoenc2, softnet); % 测试模型 Y_pred = deepnet(X(testInd, :)'); acc = sum(vec2ind(Y_pred) == vec2ind(Y(testInd, :)')) / length(testInd); disp(['测试集准确率为:', num2str(acc)]) ``` 4. 绘制混淆矩阵: ```matlab % 计算混淆矩阵 C = confusionmat(vec2ind(Y(testInd, :)'), vec2ind(Y_pred)) % 绘制混淆矩阵图像 figure confusionchart(C) ``` 希望这些代码对您有所帮助!
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值