Python轴承故障诊断 (九)基于VMD+CNN-BiLSTM的故障分类

往期精彩内容:

Python-凯斯西储大学(CWRU)轴承数据解读与分类处理

Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客

Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客

Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客

三十多个开源数据集 | 故障诊断再也不用担心数据集了!

Python轴承故障诊断 (一)短时傅里叶变换STFT-CSDN博客

Python轴承故障诊断 (二)连续小波变换CWT-CSDN博客

Python轴承故障诊断 (三)经验模态分解EMD-CSDN博客

Python轴承故障诊断 (四)基于EMD-CNN的故障分类-CSDN博客

Python轴承故障诊断 (五)基于EMD-LSTM的故障分类-CSDN博客

Python轴承故障诊断 (六)基于EMD-Transformer的故障分类-CSDN博客

Python轴承故障诊断 (七)基于EMD-CNN-LSTM的故障分类-CSDN博客

Python轴承故障诊断 (八)基于EMD-CNN-GRU并行模型的故障分类-CSDN博客

基于FFT + CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客

基于FFT + CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客

前言

本文基于凯斯西储大学(CWRU)轴承数据,进行变分模态分解VMD的介绍与数据预处理,最后通过Python实现VMD-CNN-BiLSTM对故障数据的分类。

凯斯西储大学轴承数据的详细介绍可以参考下文:

Python-凯斯西储大学(CWRU)轴承数据解读与分类处理_凯斯西储大学轴承数据集-CSDN博客

1 变分模态分解VMD的Python示例

第一步,Python 中 VMD包的下载安装:

python 复制代码
# 下载
pip install vmdpy

# 导入
from vmdpy import VMD

第二步,导入相关包进行分解

​​​​​​

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from vmdpy import VMD

# -----测试信号及其参数--start-------------
t = np.linspace(0, 1, 1000)
signal = np.sin(2 * np.pi * 5 * t) + np.sin(2 * np.pi * 20 * t)
T = len(signal)
fs = 1/T
t = np.arange(1,T+1)/T

# alpha 惩罚系数;带宽限制经验取值为抽样点长度1.5-2.0倍.
# 惩罚系数越小,各IMF分量的带宽越大,过大的带宽会使得某些分量包含其他分量言号;
alpha = 2000

#噪声容限,一般取 0, 即允许重构后的信号与原始信号有差别。
tau = 0 
#模态数量  分解模态(IMF)个数
K = 5

#DC 合成信号若无常量,取值为 0;若含常量,则其取值为 1
# DC 若为0则让第一个IMF为直流分量/趋势向量
DC = 0 
#初始化ω值,当初始化为 1 时,均匀分布产生的随机数
# init 指每个IMF的中心频率进行初始化。当初始化为1时,进行均匀初始化。
init = 1 
#控制误差大小常量,决定精度与迭代次数
tol = 1e-7
# -----测试信号及其参数--end----------

# Apply VMD
# 输出U是各个IMF分量,u_hat是各IMF的频谱,omega为各IMF的中心频率
u, u_hat, omega= VMD(signal, alpha, tau, K, DC, init, tol)
#得到中心频率的数值
print(omega[-1])
# Plot the original signal and decomposed modes
plt.figure(figsize=(15,10))
plt.subplot(K+1, 1, 1)
plt.plot(t, signal, 'r')
plt.title("原始信号")
for num in range(K):
    plt.subplot(K+1, 1, num+2)
    plt.plot(t, u[num,:])
    plt.title("IMF "+str(num+1))

plt.show()

2 轴承故障数据的预处理

2.1 导入数据

参考之前的文章,进行故障10分类的预处理,凯斯西储大学轴承数据10分类数据集:

train_set、val_set、test_set 均为按照7:2:1划分训练集、验证集、测试集,最后保存数据

上图是数据的读取形式以及预处理思路

2.2 故障VMD分解可视化

第一步, 模态选取

根据不同K值条件下, 观察中心频率,选定K值;从K=4开始出现中心频率相近的模态,出现过分解,故模态数 K 选为4。

第二步,故障VMD分解可视化

2.3 故障数据的VMD分解预处理

3 基于VMD-CNN-BiLSTM的轴承故障识别模型

下面基于VMD分解后的轴承故障数据,先通过CNN进行卷积池化操作提取信号的特征,增加维度,缩短序列长度,然后再送入BiLSTM层提取时序特征,实现CNN-BiLSTM信号的分类方法进行讲解:

3.1 定义VMD-CNN-BiLSTM分类网络模型

3.2 设置参数,训练模型

50个epoch,准确率将近97%,用VMD-CNN-BiLSTM网络分类效果显著,CNN-BiLSTM模型能够充分提取轴承故障信号的空间和时序特征,收敛速度快,性能优越,继续调参可以进一步提高分类准确率。

注意调整参数:

  • 可以适当增加CNN层数和隐藏层的维度,微调学习率;

  • 调整BiLSTM层数和维度数,增加更多的 epoch (注意防止过拟合)

  • 可以改变一维信号堆叠的形状(设置合适的长度和维度)

3.3 模型评估

准确率、精确率、召回率、F1 Score

故障十分类混淆矩阵:

代码、数据整理如下:

相关推荐
X56612 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
ZhengEnCi2 小时前
03ab-PyTorch安装教程 📚
python
狐狐生风3 小时前
LangChain 向量存储:Chroma、FAISS
人工智能·python·学习·langchain·faiss·agentai
狐狐生风3 小时前
LangChain RAG 基础
人工智能·python·学习·langchain·rag·agentai
老前端的功夫3 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
yaoxin5211234 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
dFObBIMmai4 小时前
MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步
jvm·数据库·python
szccyw04 小时前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问
jvm·数据库·python
小白学大数据4 小时前
Python 自动化爬取网易云音乐歌手歌词实战教程
爬虫·python·okhttp·自动化
风之所往_6 小时前
Python 3.0 新特性全面总结
python