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

目录

前言

1 经验模态分解EMD的Python示例

2 轴承故障数据的预处理

2.1 导入数据

2.2 制作数据集和对应标签

2.3 故障数据的EMD分解可视化

2.4 故障数据的EMD分解预处理

3 基于EMD-LSTM的轴承故障诊断分类

3.1 训练数据、测试数据分组,数据分batch

3.2 定义EMD-LSTM分类网络模型

3.3 设置参数,训练模型


往期精彩内容:

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

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

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

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

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

前言

本文基于凯斯西储大学(CWRU)轴承数据,进行经验模态分解EMD的介绍与数据预处理,最后通过Python实现EMD-LSTM对故障数据的分类。凯斯西储大学轴承数据的详细介绍可以参考下文:

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

经验模态分解EMD的原理可以参考如下:   

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

1 经验模态分解EMD的Python示例

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

# 下载
pip install EMD-signal

# 导入
from PyEMD import EMD

切记,很多同学安装失败,不是 pip install EMD,也不是pip install PyEMD, 如果 pip list 中 已经有 emd,emd-signal,pyemd包的存在,要先 pip uninstall 移除相关包,然后再进行安装。

第二步,导入相关包

importnumpyasnp
from PyEMD import EMD
importmatplotlib.pyplotasplt
importmatplotlib
matplotlib.rc("font", family='Microsoft YaHei')

第三步,生成一个信号示例

t = np.linspace(0, 1, 1000)
signal = np.sin(11*2*np.pi*t*t) + 6*t*t

第四步,创建EMD对象,进行分解

emd = EMD()
# 对信号进行经验模态分解
IMFs = emd(signal)

第五步,绘制原始信号和每个本征模态函数(IMF)

plt.figure(figsize=(15,10))
plt.subplot(len(IMFs)+1, 1, 1)
plt.plot(t, signal, 'r')
plt.title("原始信号")

fornum, imfinenumerate(IMFs):
    plt.subplot(len(IMFs)+1, 1, num+2)
    plt.plot(t, imf)
    plt.title("IMF "+str(num+1))

plt.show()

2 轴承故障数据的预处理

2.1 导入数据

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

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

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

2.2 制作数据集和对应标签

第一步, 生成数据集

第二步,制作数据集和标签

# 制作数据集和标签
import torch

# 这些转换是为了将数据和标签从Pandas数据结构转换为PyTorch可以处理的张量,
# 以便在神经网络中进行训练和预测。

def make_data_labels(dataframe):
    '''
        参数 dataframe: 数据框
        返回 x_data: 数据集     torch.tensor
            y_label: 对应标签值  torch.tensor
    '''
    # 信号值
    x_data = dataframe.iloc[:,0:-1]
    # 标签值
    y_label = dataframe.iloc[:,-1]
    x_data = torch.tensor(x_data.values).float()
    y_label = torch.tensor(y_label.values, dtype=torch.int64)  # 指定了这些张量的数据类型为64位整数,通常用于分类任务的类别标签
    return x_data, y_label

# 加载数据
train_set = load('train_set')
val_set = load('val_set')
test_set = load('test_set')

# 制作标签
train_xdata, train_ylabel = make_data_labels(train_set)
val_xdata, val_ylabel = make_data_labels(val_set)
test_xdata, test_ylabel = make_data_labels(test_set)
# 保存数据
dump(train_xdata, 'trainX_1024_10c')
dump(val_xdata, 'valX_1024_10c')
dump(test_xdata, 'testX_1024_10c')
dump(train_ylabel, 'trainY_1024_10c')
dump(val_ylabel, 'valY_1024_10c')
dump(test_ylabel, 'testY_1024_10c')

2.3 故障数据的EMD分解可视化

选择正常信号和 0.021英寸内圈、滚珠、外圈故障信号数据来做对比

第一步,导入包,读取数据

import numpy as np
from scipy.io import loadmat
import numpy as np
from scipy.signal import stft
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("font", family='Microsoft YaHei')

# 读取MAT文件  
data1 = loadmat('0_0.mat')  # 正常信号
data2 = loadmat('21_1.mat') # 0.021英寸 内圈
data3 = loadmat('21_2.mat') # 0.021英寸 滚珠
data4 = loadmat('21_3.mat') # 0.021英寸 外圈
# 注意,读取出来的data是字典格式,可以通过函数type(data)查看。

第二步,数据集中统一读取 驱动端加速度数据,取一个长度为1024的信号进行后续观察和实验

# DE - drive end accelerometer data 驱动端加速度数据
data_list1 = data1['X097_DE_time'].reshape(-1)
data_list2 = data2['X209_DE_time'].reshape(-1)  
data_list3 = data3['X222_DE_time'].reshape(-1)
data_list4 = data4['X234_DE_time'].reshape(-1)
# 划窗取值(大多数窗口大小为1024)
time_step= 1024
data_list1 = data_list1[0:time_step]
data_list2 = data_list2[0:time_step]
data_list3 = data_list3[0:time_step]
data_list4 = data_list4[0:time_step]

第三步,进行数据可视化

plt.figure(figsize=(20,10))
plt.subplot(2,2,1)
plt.plot(data_list1)
plt.title('正常')
plt.subplot(2,2,2)
plt.plot(data_list2)
plt.title('内圈')
plt.subplot(2,2,3)
plt.plot(data_list3)
plt.title('滚珠')
plt.subplot(2,2,4)
plt.plot(data_list4)
plt.title('外圈')
plt.show()

第四步,首先对正常数据进行EMD分解

import numpy as np
import matplotlib.pyplot as plt
from PyEMD import EMD

t = np.linspace(0, 1, time_step)
data = np.array(data_list1)
# 创建 EMD 对象
emd = EMD()

# 对信号进行经验模态分解
IMFs = emd(data)

# 绘制原始信号和每个本征模态函数(IMF)
plt.figure(figsize=(15,10))
plt.subplot(len(IMFs)+1, 1, 1)
plt.plot(t, data, 'r')
plt.title("Original signal", fontsize=10)

for num, imf in enumerate(IMFs):
    plt.subplot(len(IMFs)+1, 1, num+2)
    plt.plot(t, imf)
    plt.title("IMF "+str(num+1), fontsize=10)
    # 增加第一排图和第二排图之间的垂直间距
plt.subplots_adjust(hspace=0.4, wspace=0.2)
plt.show()

其次,内圈故障EMD分解:

然后,滚珠故障EMD分解:

最后,外圈故障EMD分解:

注意,在信号的制作过程中,信号长度的选取比较重要,选择信号长度为1024,既能满足信号在时间维度上的分辨率,也能在后续的EMD分解中分解出数量相近的IMF分量,为进一步做故障模式识别打下基础。

2.4 故障数据的EMD分解预处理

对于EMD分解出的IMF分量个数,并不是所有的样本信号都能分解出8个分量,需要做一下定量分析:

import numpy as np
from PyEMD import EMD

# 加载训练集
train_xdata = load('trainX_1024_10c')
data = np.array(train_xdata)

# 创建 EMD 对象
emd = EMD()

print("测试集:", len(data))
count_min = 0
count_max = 0
count_7 = 0
# 对数据进行EMD分解
for i in range(1631):
    imfs = emd(data[i], max_imf=8)  # max_imf=8
    if len(imfs) > 8 :
        count_max += 1
    elif len(imfs) < 7:
        count_min += 1
    elif len(imfs) == 7:
        count_7 += 1

print("分解结果IMF大于8:", count_max)
print("分解结果IMF小于7:", count_min)
print("分解结果IMF等于7:", count_7)

由结果可以看出,大部分信号样本 都分解出8个分量,将近1/3的信号分解的不是8个分量。EMD设置不了分解出模态分量的数量(函数自适应),为了使一维信号分解,达到相同维度的分量特征,有如下3种处理方式:

  • 删除分解分量不统一的样本(少量存在情况可以采用);

  • 对于分量个数少的样本采用0值或者其他方法进行特征填充,使其对齐其他样本分量的维度(向多兼容);

  • 合并分量数量多的信号(向少兼容);

本文采用第二、三条结合的方式进行预处理,即删除分量小于7的样本,对于分量大于7的样本,把多余的分量进行合并,使所有信号的分量特征保持同样的维度。

3 基于EMD-LSTM的轴承故障诊断分类

下面基于EMD分解后的轴承故障数据,通过LSTM实现信号的分类方法进行讲解:

3.1 训练数据、测试数据分组,数据分batch

import torch
from joblib import dump, load
import torch.utils.data as Data
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
# 参数与配置
torch.manual_seed(100)  # 设置随机种子,以使实验结果具有可重复性
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 有GPU先用GPU训练

# 加载数据集
def dataloader(batch_size, workers=2):
    # 训练集
    train_xdata = load('trainX_1024_10c')
    train_ylabel = load('trainY_1024_10c')
    # 验证集
    val_xdata = load('valX_1024_10c')
    val_ylabel = load('valY_1024_10c')
    # 测试集
    test_xdata = load('testX_1024_10c')
    test_ylabel = load('testY_1024_10c')

    # 加载数据
    train_loader = Data.DataLoader(dataset=Data.TensorDataset(train_xdata, train_ylabel),
                                   batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)
    val_loader = Data.DataLoader(dataset=Data.TensorDataset(val_xdata, val_ylabel),
                                 batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)
    test_loader = Data.DataLoader(dataset=Data.TensorDataset(test_xdata, test_ylabel),
                                  batch_size=batch_size, shuffle=True, num_workers=workers, drop_last=True)
    return train_loader, val_loader, test_loader

batch_size = 32
# 加载数据
train_loader, val_loader, test_loader = dataloader(batch_size)

3.2 定义EMD-LSTM分类网络模型

3.3 设置参数,训练模型

200个epoch,准确率将近86%,用LSTM网络分类效果一般,继续调参可以进一步提高分类准确率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/233728.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 面向对象补充

目录 初始化列表 explicit关键字 单参数构造函数 多参数构造函数 static成员 友元 内部类(不常用) 匿名对象 初始化列表 以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个成员变量后面跟 一个放在括号中的初始值或表达式。 class Date…

头歌平台题目参考

任务描述 本关任务&#xff1a;获取从键盘输入3个数&#xff0c;要求按从大到小的顺序输出这3个数。 相关知识 程序并不会总是执行同样的处理。例如&#xff0c;按下某个键的时候执行 A 处理&#xff0c;按下其他键的时候执行 B 处理…… 像这样&#xff0c;程序通过条件判断…

回溯算法之N皇后

一 什么是回溯算法 回溯算法&#xff08;Backtracking Algorithm&#xff09;是一种用于解决组合优化问题的算法&#xff0c;它通过逐步构建候选解并进行验证&#xff0c;以寻找所有满足特定条件的解。回溯算法通常应用于在给定约束条件下枚举所有可能解的问题&#xff0c;如…

FaceBook推出新的翻译模型Seamless!可实现跨语言交流的无缝衔接!

FaceBook **&#xff08;中文名&#xff1a;脸书&#xff09;**近期发布了一个新的翻译模型 Seamless Communication&#xff0c;可实现跨语言实时"无缝"交流。 该模型可以保留跨语言的表达方式和复杂性&#xff08;翻译时保留语音中的停顿和语速&#xff0c;以及声…

优雅草蜻蜓I即时通讯·水银版私有化部署之安卓Android端编译-02

Android 项目配置 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 使用以上Android studio版本 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 下载最低sdk最低版本28 完成后就可以导入项目(项目导入不能开VPN,会导致部分三方库…

Glibc之malloc实现原理

前言导入 内存管理之虚拟内存空间 详细了解这部分知识&#xff0c;再看下面的内容会很舒服 进程地址空间 在32位Linux系统中&#xff0c;进程地址空间是这样分布的。其中内核空间独占1G&#xff0c;不允许用户操作&#xff0c;其余3G由用户操作。malloc的操作对象&#xff1…

C语言之函数设计(1)

目录 没有返回值的函数 通用性 不含形参的函数 函数返回值的初始化 作用域 文件作用域 声明和定义 函数原型声明 头文件和文件包含指令 在上节中我们简单的学习了函数的创建方法&#xff08;函数定义&#xff09;与函数的使用方法&#xff08;函数调用&#xff09;&…

谈一谈网络协议中的应用层

文章目录 一&#xff0c;什么是HTTPHTTP的优缺点HTTPS 一&#xff0c;什么是HTTP 我们在通过网络进行传输数据时&#xff0c;我们要保证&#xff0c;我们在发送时构造的数据&#xff0c;在接收时也能够解析出来&#xff0c;这本质上就是一种协议&#xff0c;是一种应用层协议&…

python zblog API实现类似XMLRPC/发布文章

我发现python对Zblog的XML发布并不友好&#xff0c;虽然也有对应的模块&#xff0c;但是远远没有XPCRPC更直接方便&#xff0c;但是使用xmlRpc是直接给发布文章带来了不小的便利&#xff0c;但是对系统也并不友好&#xff0c;但是zblog也开放了Api&#xff0c;但是干部子弟不乐…

测试剪切板贴图,兼测试2023年12月7日更新的Bard

当前的情况好比&#xff0c;&#xff08;居然真的可以通过剪切板把图片放进来&#xff01;&#xff09; 听说2023年12月7日Bard有更新&#xff0c;所以&#xff0c;再测试了一次。这下&#xff0c;对大语言模型应该死心了&#xff1b;AI替代人的传闻应该是过早危言耸听了。

SAP UI5 walkthrough step3 Controls

在上一步&#xff0c;我们是直接用index.html 中的body 里面的DIVision去输出 hello world&#xff0c; 在这个章节&#xff0c;我们将用SAP UI5 的标准控件 sap/m/Text 首先&#xff0c;我们去修改 webapp/index.html <!DOCTYPE html> <html> <head><…

Vue3-02-ref() 响应式详解

ref() 是什么 ref() 是一个函数&#xff1b; ref() 函数用来声明响应式的状态&#xff08;就是来声明变量的&#xff09; ref() 函数声明的变量&#xff0c;是响应式的&#xff0c;变量的值改变之后&#xff0c;页面中会自动重新渲染。ref() 有什么特点 1.ref() 可以声明基础…

java服务调用mysql报错

一、前言 前端服务调用后端服务时出现以下报错&#xff0c;原因是使用mysql5.7版本数据库中存在ONLY_FULL_GROUP_BY这个配置项导致的不兼容 MySQLSyntaxErrorException: Expression #32 of SELECT list is not in GROUP BY clause and contains nonaggregated column demeter…

打造Github首页的动态飞线效果

一、导语 Github首页的地球动态飞线&#xff0c;大家都比较熟悉吧 二、分析 由大量随机的3点构造出贝塞尔曲线&#xff0c;然后开始从起点到终点的飞行后&#xff0c;然后再从起点到终点的消失&#xff0c;就此完成整个过程 三、基础代码 createCurve(startPoint, endPoint…

layui实现下拉框多选

引用layui第三方扩展实现下拉框选择渲染 第三方插件地址xmSelect下拉多选 xmSelect 实现效果 //第三方扩展插件 <script type"text/javascript" src"${ctx }/config/layui/dist/xm-select.js"></script> //jquery渲染 <script type&qu…

【数电笔记】58-同步D触发器

目录 说明&#xff1a; 1. 电路组成 2. 逻辑功能 3. 特性表、特性方程 4. 状态转移图 例题 5. 同步D触发器的特点 6. 集成同步D触发器&#xff1a;74LS375 74LS375内部原理 说明&#xff1a; 笔记配套视频来源&#xff1a;B站本系列笔记并未记录所有章节&#xff0c;…

JRT文件服务实现

网站与客户端打印和导出方面已经无大碍了&#xff0c;今天抽时间整整文件服务&#xff0c;文件服务设计可以查看下面连接。原理一样&#xff0c;代码会有些变化。 文件服务设计 首先实现文件服务的服务端&#xff0c;就是一个业务脚本&#xff0c;用来接收上传、移动和删除文件…

Qt之基于QMediaPlayer的音视频播放器(支持常见音视频格式)

Qt自带了一个Media Player的例子,如下图所示: 但是运行这个例子机会发现,连最基本的MP4格式视频都播放不了。因为QMediaPlayer是个壳(也可以叫框架),依赖本地解码器,视频这块默认基本上就播放个MP4,甚至连MP4都不能播放,如果要支持其他格式需要下载k-lite或者LAVFilte…

Qt槽函数不响应不执行的一种原因:ui提升导致重名

背景&#xff1a; 一个包含了组件提升的ui&#xff0c;有个按钮的槽函数就是不响应&#xff0c;于是找原因。 分析&#xff1a; 槽函数的对应一是通过connect函数绑定信号&#xff0c;二是on_XXX_signal的命名方式。界面上部件的槽函数通常是第二种。 我反复确认细节&#…

cache教程 4.一致性哈希(hash)

本章节是单节点走向分布式节点的一个重要部分。 一致性哈希(consistent hashing)的原理以及为什么要使用一致性哈希。实现一致性哈希代码&#xff0c;添加相应的测试用例 1.多节点部署遇到的问题 上一章节完成了一个单节点的缓存服务器。那对于一个单节点来说&#xff0c;读…