Deep Learning × ECG (3) :心律失常ECG数据的预处理

一般利用深度学习来处理数据,主要包括:

  • 数据准备
  • 数据预处理
  • 搭建模型
  • 模型训练

本篇主要介绍 心律失常数据(ECG) 的预处理过程。

ECG的预处理过程包括:降噪、截取心拍、存放心拍和标签。

1. 降噪

关于信号类的数据在放入网络中训练之前一般都需要经过处理,降噪,去噪等;ECG数据也不另外。对于信号类数据去噪的方法有很多,比如:傅里叶变换,小波变换,中值滤波法等等。

这里主要以小波变化进行降噪,因为本人不是学通信和电信科班出身,对于小波的了解也只是皮毛,这里就直接贴代码了;如果有想了解小波的,网上很多帖子都有介绍的,大家可以去看看;如果有这方面的大佬,可以直接在评论区留言哇,给大家分享分享。

# 小波去噪预处理
def denoise(data):
    # 小波变换
    coeffs = pywt.wavedec(data=data, wavelet='db5', level=9)
    cA9, cD9, cD8, cD7, cD6, cD5, cD4, cD3, cD2, cD1 = coeffs

    # 阈值去噪
    threshold = (np.median(np.abs(cD1)) / 0.6745) * (np.sqrt(2 * np.log(len(cD1))))
    cD1.fill(0)
    cD2.fill(0)
    for i in range(1, len(coeffs) - 2):
        coeffs[i] = pywt.threshold(coeffs[i], threshold)

    # 小波反变换,获取去噪后的信号
    rdata = pywt.waverec(coeffs=coeffs, wavelet='db5')
    return rdata

去噪前的心电图:
在这里插入图片描述
去噪后的心电图:
在这里插入图片描述
将去噪前和去噪后的图片放在一起比较:
在这里插入图片描述

2. 截取心拍、存放心拍和标签

截取心拍也是做心拍分类中最基础最重要的一步;那么,就产生几个问题?

Q1:如何截取?
A1:在上一节已经提到过,主要根据R峰的位置,也就是wfdb包的sample属性,一般是向前多少个点和向后多少个点可以自己控制的;大多数情况下,一个截取的心拍是在250-300个点左右。

Q2:截取后,如何存放?
A2:因为ECG数据是一维数据,那么我们截取一个心拍得到都是点的数据;一般都是利用数组进行存储的。

截取心拍代码并存储

# 读取心电数据和对应标签,并对数据进行小波去噪
def getDataSet(number, X_data, Y_data):
    ecgClassSet = ['N', 'A', 'V', 'L', 'R']

    # 读取心电数据记录
    print("正在读取 " + number + " 号心电数据...")
    record = wfdb.rdrecord('D:/ECG-Data/MIT-BIH-360/' + number, channel_names=['MLII'])
    data = record.p_signal.flatten()
    rdata = denoise(data=data)

    # 获取心电数据记录中R波的位置和对应的标签
    annotation = wfdb.rdann('D:/ECG-Data/MIT-BIH-360/' + number, 'atr')
    Rlocation = annotation.sample
    Rclass = annotation.symbol

    # 去掉前后的不稳定数据
    start = 10
    end = 5
    i = start
    j = len(annotation.symbol) - end

    # 因为只选择NAVLR五种心电类型,所以要选出该条记录中所需要的那些带有特定标签的数据,舍弃其余标签的点
    # X_data在R波前后截取长度为300的数据点
    # Y_data将NAVLR按顺序转换为01234
    while i < j:
        try:
            # Rclass[i] 是标签
            lable = ecgClassSet.index(Rclass[i])
            x_train = rdata[Rlocation[i] - 99:Rlocation[i] + 201]
            X_data.append(x_train)
            Y_data.append(lable)
            i += 1
        except ValueError:
            i += 1
    return

3. 完整代码

import wfdb
import pywt
import seaborn
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
from tensorflow.python.keras import Model, Input
from tensorflow.python.keras.layers import LSTM, Bidirectional, Dropout, Dense, Attention, multiply
from tensorflow.python.keras.models import Sequential
from tensorflow.keras.optimizers import SGD,Adam
from tensorflow.python.keras.layers.core import *
from tensorflow.python.keras.utils.vis_utils import plot_model

# 小波去噪预处理
def denoise(data):
    # 小波变换
    coeffs = pywt.wavedec(data=data, wavelet='db5', level=9)
    cA9, cD9, cD8, cD7, cD6, cD5, cD4, cD3, cD2, cD1 = coeffs

    # 阈值去噪
    threshold = (np.median(np.abs(cD1)) / 0.6745) * (np.sqrt(2 * np.log(len(cD1))))
    cD1.fill(0)
    cD2.fill(0)
    for i in range(1, len(coeffs) - 2):
        coeffs[i] = pywt.threshold(coeffs[i], threshold)

    # 小波反变换,获取去噪后的信号
    rdata = pywt.waverec(coeffs=coeffs, wavelet='db5')
    return rdata


# 读取心电数据和对应标签,并对数据进行小波去噪
def getDataSet(number, X_data, Y_data):
    ecgClassSet = ['N', 'A', 'V', 'L', 'R']

    # 读取心电数据记录
    print("正在读取 " + number + " 号心电数据...")
    record = wfdb.rdrecord('D:/ECG-Data/MIT-BIH-360/' + number, channel_names=['MLII'])
    data = record.p_signal.flatten()
    rdata = denoise(data=data)

    # 获取心电数据记录中R波的位置和对应的标签
    annotation = wfdb.rdann('D:/ECG-Data/MIT-BIH-360/' + number, 'atr')
    Rlocation = annotation.sample
    Rclass = annotation.symbol

    # 去掉前后的不稳定数据
    start = 10
    end = 5
    i = start
    j = len(annotation.symbol) - end

    # 因为只选择NAVLR五种心电类型,所以要选出该条记录中所需要的那些带有特定标签的数据,舍弃其余标签的点
    # X_data在R波前后截取长度为300的数据点
    # Y_data将NAVLR按顺序转换为01234
    while i < j:
        try:
            # Rclass[i] 是标签
            lable = ecgClassSet.index(Rclass[i])
            x_train = rdata[Rlocation[i] - 99:Rlocation[i] + 201]
            X_data.append(x_train)
            Y_data.append(lable)
            i += 1
        except ValueError:
            i += 1
    return


# 加载数据集并进行预处理
def loadData():
    numberSet = ['100', '101', '103', '105', '106', '107', '108', '109', '111', '112', '113', '114', '115',
                 '116', '117', '119', '121', '122', '123', '124', '200', '201', '202', '203', '205', '208',
                 '210', '212', '213', '214', '215', '217', '219', '220', '221', '222', '223', '228', '230',
                 '231', '232', '233', '234']
    dataSet = []
    lableSet = []
    for n in numberSet:
        getDataSet(n, dataSet, lableSet)

    # 转numpy数组,打乱顺序
    dataSet = np.array(dataSet).reshape(-1, 300)
    lableSet = np.array(lableSet).reshape(-1, 1)
    train_ds = np.hstack((dataSet, lableSet))
    np.random.shuffle(train_ds)

    # 数据集及其标签集
    X = train_ds[:, :300].reshape(-1, 300, 1)
    Y = train_ds[:, 300]

    # 测试集及其标签集
    shuffle_index = np.random.permutation(len(X))
    # 设定测试集的大小 RATIO是测试集在数据集中所占的比例
    test_length = int(RATIO * len(shuffle_index))
    # 测试集的长度
    test_index = shuffle_index[:test_length]
    # 训练集的长度
    train_index = shuffle_index[test_length:]
    X_test, Y_test = X[test_index], Y[test_index]
    X_train, Y_train = X[train_index], Y[train_index]
    return X_train, Y_train, X_test, Y_test
  • 23
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
### 回答1: ECG分析是一种用于检测心脏疾病的方法,而基于深度学习ECG心律失常分类则是一种新兴的技术。这种技术利用深度学习算法对ECG数据进行分析和分类,以便更准确地诊断心脏疾病。这种技术的入门需要掌握深度学习的基本原理和ECG数据的基本知识,同时需要了解常见的心律失常类型及其特征。通过学习和实践,可以逐步掌握这种技术,并在实际应用中取得良好的效果。 ### 回答2: ECG分析是指通过对心电图(ECG)数据进行处理和分析,得出心脏的生理状况和心律失常的情况。而基于深度学习ECG心律失常分类则是一种新兴的、快速而准确的心律失常诊断方法,可以在短时间内对不同类型的心律失常进行自动识别和分类。下面将介绍ECG分析中使用深度学习技术的基本原理。 ECG信号是一种时间序列信号,包含不同的波形特征,例如P波、QRS波和T波等,这些波形特征反映了心跳时心肌的电生理变化。基于深度学习ECG心律失常分类可以分为三个步骤: 第一步是数据预处理,包括数据清洗、信噪比提高等,这是保证模型准确性的关键步骤。 第二步是特征提取,这是深度学习方法的核心。传统的特征提取方法是基于图像处理、信号处理等领域,需要大量的人工设计。而基于深度学习的特征提取则是通过网络学习参数,自动地找到最能区分不同心律失常的特征。常见的网络结构包括卷积神经网络(CNN)和循环神经网络(RNN)等。 第三步是模型训练和测试。通常,我们将数据集划分为训练集、验证集和测试集三部分,用训练集来训练模型,用验证集来选择最优的模型超参数,用测试集来测试模型的准确性。模型的准确性可以用准确率、召回率、F1值等指标进行评价。 总之,基于深度学习ECG心律失常分类具有高效、准确、自动化等优势,可以大大提高ECG信号的处理速度和心律失常的诊断准确性,对心血管疾病的早期预防和治疗具有重要意义。 ### 回答3: ECG(电生理图)是评估心脏健康状况的重要工具。ECG在医生的指导下具有高精度和可靠性,但是ECG检查的数量庞大,医生需要花费大量时间和精力来进行ECG分析。深度学习技术已经被应用于ECG分析中,以实现较高的自动化程度。 基于深度学习ECG心律失常分类技术旨在通过机器学习处理ECG数据,以自动分类心律失常。常见的ECG心律失常包括心房颤动、心室颤动、心房扑动、快速地、慢速的、心动过缓、心动过速等等。 ECG数据的分析可以通过传统的机器学习方法实现,但这种方法的准确度和性能通常较低。深度学习技术可以在更高水平上对ECG数据进行分析,从而实现更准确、更可靠的分类。 基于深度学习ECG心律失常分类技术通常需要三个关键组件: 1. 数据集:深度学习模型需要大量的数据来进行训练。ECG数据集应具有多样性,因为ECG数据在不同人群中可能存在差异。 2. 深度学习模型:深度学习模型是ECG分类的核心。现在有许多ECG分类模型可以使用,例如卷积神经网络(CNN)和递归神经网络(RNN)。 3. 训练和测试:训练和测试是深度学习模型的关键步骤。在训练期间,模型从数据集中学习数据的特征和模式。测试过程评估训练后的模型的性能,以确定它在分类ECG心律失常方面的精度和可靠性。 总之,基于深度学习ECG心律失常分类技术通过自动化分类ECG数据,可以帮助医生更快速、准确地诊断ECG心律失常。尽管仍需更多的研究和开发,但这项技术的潜力很大,可以提高医疗保健的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Woo Tzins

谢谢您的鼓励

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

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

打赏作者

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

抵扣说明:

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

余额充值