我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python怎么用CNN实现对时序数据进行分类

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python怎么用CNN实现对时序数据进行分类

这篇“Python怎么用CNN实现对时序数据进行分类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎么用CNN实现对时序数据进行分类”文章吧。

一、数据集介绍

数据集利用的是CPSC2020数据集。

训练数据包括从心律失常患者收集的10个单导联心电图记录,每个记录持续约24小时。

Python怎么用CNN实现对时序数据进行分类

下载完成后的TrainingSet数据集包括两个文件夹,分别是data和ref。data和ref文件夹内分别有10个mat文件。

  • data文件夹存储数据文件,每个文件以mat格式存储,n ∗ 1 n*1n∗1数组表示;

  • ref文件夹为标签文件夹,每个文件以mat文件存储,结构体存储,包括S_ref,V_ref两个n*1数组,分别存储对应标签(S,V)的位置;

采样率为 400。

  • S:室上早搏(SPB);

  • V:心室早搏(PVC);

二、数据预处理

2.1 获取原始数据

查看一下前1000个心电图数据:

datafile = 'E:/Wendy/Desktop/TrainingSet/data/A04.mat'# 采样率400data = scio.loadmat(datafile)#rint(data) # dictsig = data['ecg']# (x,1)#print(sig)sig = np.reshape(sig,(-1)) # (x,)转换为一维向量print(sig)sigPlot = sig[1:5*200]# # 获取前1000个信号fig = plt.figure(figsize=(20, 10),dpi=400)plt.plot(sigPlot)plt.show()

运行结果:

Python怎么用CNN实现对时序数据进行分类

2.2 获取原始标签

将标签数据转化为一维向量

datafile = 'E:/Wendy/Desktop/TrainingSet/ref/R04.mat'# 采样率400data = scio.loadmat(datafile)#print(data)label = data['ref'][0][0]S_ref = label[0];S_ref = np.reshape(S_ref,(-1)) # 转换为一维向量V_ref = label[1];V_ref = np.reshape(V_ref,(-1)) # 转换为一维向量

2.3 数据分割

数据分割为5s一个片段

思路:房早室早心拍和前后两个心拍均有关系,按照平均心率72计算,平均每个心拍的时间为60/72,因此5个心拍的时间为60/725=4.1667 4.1667s不好计算,故选择5s 5 ( 秒 ) s a m p r = 5 ∗ 400 = 2000 个 s a m p l e 5(秒)sampr = 5*400=2000个sample5(秒)sampr=5∗400=2000个sample

定义标签:0:其他;1:V_ref; 2:S_ref;

a = len(sig)Fs = 400 # 采样率为400segLen = 5*Fs # 2000num = int(a/segLen)print(num)

运行结果:

17650

其中Fs为采样率,segLen为片段长度,num为片段数量。

2.4 整合数据和标签

接下来需要整合数据和标签:

all_data=[]all_label = [];i=1while i<num+1:     all_data.append(np.array(sig[(i-1)*segLen:i*segLen]))    # 标签    if set(S_ref) & set(range((i-1)*segLen,i*segLen)):        all_label.append(2)    elif set(V_ref) & set(range((i-1)*segLen,i*segLen)):        all_label.append(1)            else:        all_label.append(0)        i=i+1type(all_data)# list类型type(all_label)# list类型print((np.array(all_data)).shape) # 17650为数据长度,2000为数据个数print((np.array(all_label)).shape)#print(all_data)

运行结果:

(17650, 2000)
(17650,)

17650为数据长度,2000为数据个数。

2.5 保存

将数据保存为字典类型:

import pickleres = {'data':all_data, 'label':all_label} # 字典类型dictwith open('./cpsc2020.pkl', 'wb') as fout: # #将结果保存为cpsc2020.pkl    pickle.dump(res, fout)

三、数据训练

3.1 读取数据并进行处理

将数据归一化并进行标签编码,划分训练集和测试集,训练集为90%,测试集为10%,打乱数据并将其扩展为二维:

import numpy as npimport pandas as pdimport scipy.iofrom matplotlib import pyplot as pltimport picklefrom sklearn.model_selection import train_test_splitfrom collections import Counterfrom tqdm import tqdmdef read_data_physionet():    """    only N V, S    """    # read pkl    with open('./cpsc2020.pkl', 'rb') as fin:        res = pickle.load(fin) # 加载数据集    ## 数据归一化    all_data = res['data']    for i in range(len(all_data)):        tmp_data = all_data[i]        tmp_std = np.std(tmp_data) # 获取数据标准差        tmp_mean = np.mean(tmp_data) # 获取数据均值        if(tmp_std==0):   # i=1239-1271均为0            tmp_std = 1         all_data[i] = (tmp_data - tmp_mean) / tmp_std  # 归一化    all_data = []    ## 标签编码    all_label = []    for i in range(len(res['label'])):        if res['label'][i] == 1:            all_label.append(1)            all_data.append(res['data'][i])        elif res['label'][i] == 2:            all_label.append(2)            all_data.append(res['data'][i])        else:            all_label.append(0)            all_data.append(res['data'][i])           all_label = np.array(all_label)    all_data = np.array(all_data)    # 划分训练集和测试集,训练集90%,测试集10%    X_train, X_test, Y_train, Y_test = train_test_split(all_data, all_label, test_size=0.1, random_state=15)         print('训练集和测试集中 其他类别(0);室早(1);房早(2)的数量: ')    print(Counter(Y_train), Counter(Y_test))        # 打乱训练集    shuffle_pid = np.random.permutation(Y_train.shape[0])    X_train = X_train[shuffle_pid]    Y_train = Y_train[shuffle_pid]    # 扩展为二维(x,1)    X_train = np.expand_dims(X_train, 1)    X_test = np.expand_dims(X_test, 1)    return X_train, X_test, Y_train, Y_testX_train, X_test, Y_train, Y_test = read_data_physionet()

运行结果:

训练集和测试集中 其他类别(0);室早(1);房早(2)的数量:
Counter({1: 8741, 0: 4605, 2: 2539}) Counter({1: 1012, 0: 478, 2: 275})

3.2 构建数据结构

自行构建数据集:

# 构建数据结构 MyDataset# 单条数据信号的形状为:1*2000import numpy as npfrom collections import Counterfrom tqdm import tqdmfrom matplotlib import pyplot as pltfrom sklearn.metrics import classification_report import torchimport torch.nn as nnimport torch.optim as optimimport torch.nn.functional as Ffrom torch.utils.data import Dataset, DataLoaderclass MyDataset(Dataset):    def __init__(self, data, label):        self.data = data        self.label = label    #把numpy转换为Tensor    def __getitem__(self, index):        return (torch.tensor(self.data[index], dtype=torch.float), torch.tensor(self.label[index], dtype=torch.long))    def __len__(self):        return len(self.data)

3.3 搭建神经网络

搭建CNN网络结构:

# 搭建神经网络class CNN(nn.Module):    def __init__(self):        super(CNN, self).__init__()        self.conv1 = nn.Sequential(         # input shape (1, 1, 2000)            nn.Conv1d(                in_channels=1,                out_channels=16,                kernel_size=5,                stride=1,                 padding=2,            ),                              # output shape (16, 1, 2000)            nn.Dropout(0.2),            nn.ReLU(),            nn.MaxPool1d(kernel_size=5),    # choose max value in 1x5 area, output shape (16, 1, 400)2000/5        )        self.conv2 = nn.Sequential(         # input shape (16, 1, 400)            nn.Conv1d(16, 32, 5, 1, 2),     # output shape (32, 1, 400)            nn.Dropout(0.2),            nn.ReLU(),            nn.MaxPool1d(kernel_size=5),    # output shape (32, 1, 400/5=80)        )        self.out = nn.Linear(32 *  80, 3)   # fully connected layer, output 3 classes    def forward(self, x):        x = self.conv1(x)        x = self.conv2(x)        x = x.view(x.size(0), -1)        output = self.out(x)        #output.Softmax()        return output, xcnn = CNN()print(cnn)

运行结果:

CNN(
(conv1): Sequential(
(0): Conv1d(1, 16, kernel_size=(5,), stride=(1,), padding=(2,))
(1): Dropout(p=0.2, inplace=False)
(2): ReLU()
(3): MaxPool1d(kernel_size=5, stride=5, padding=0, dilation=1, ceil_mode=False)
)
(conv2): Sequential(
(0): Conv1d(16, 32, kernel_size=(5,), stride=(1,), padding=(2,))
(1): Dropout(p=0.2, inplace=False)
(2): ReLU()
(3): MaxPool1d(kernel_size=5, stride=5, padding=0, dilation=1, ceil_mode=False)
)
(out): Linear(in_features=2560, out_features=3, bias=True)
)

3.4 开始训练

优化器利用的是Adam优化器,损失函数使用crossEntropy函数。

代码略

50个epoch的运行效果如下:

Python怎么用CNN实现对时序数据进行分类

以上就是关于“Python怎么用CNN实现对时序数据进行分类”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python怎么用CNN实现对时序数据进行分类

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python怎么用CNN实现对时序数据进行分类

这篇“Python怎么用CNN实现对时序数据进行分类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎么用CNN实
2023-07-05

Python利用CNN实现对时序数据进行分类

这篇文章主要为大家详细介绍了Python如何利用CNN实现对时序数据进行分类功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2023-02-22

使用Python怎么对时间序列进行分解和预测

使用Python怎么对时间序列进行分解和预测?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是时间序列?顾名思义,时间序列是按照固定时间间隔记录的数据集。换句话说,以时间
2023-06-06

怎么用python对数据进行降噪

在Python中,可以使用不同的方法对数据进行降噪。以下是一些常见的降噪方法:均值滤波:通过计算窗口内像素的平均值来去除噪声。可以使用OpenCV库中的blur函数来实现。import cv2image = cv2.imread('
怎么用python对数据进行降噪
2024-02-29

怎么用Python进行数据分析

这篇文章主要讲解了“怎么用Python进行数据分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python进行数据分析”吧!评论情感倾向先调用百度AI来分析微博和b站的评论情感倾向。
2023-06-01

大数据报表怎么实现对数据列进行排名分析

这篇文章跟大家分析一下“大数据报表怎么实现对数据列进行排名分析”。内容详细易懂,对“大数据报表怎么实现对数据列进行排名分析”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“大数据报表
2023-06-03

使用SpringMVC怎么实现对数据进行校验

使用SpringMVC怎么实现对数据进行校验?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、导入jar包若要实现数据校验功能,需要导入必要的jar包,主要包括以下几个:c
2023-05-31

怎么在MySQL中分表分库时对数据进行切分

今天就跟大家聊聊有关怎么在MySQL中分表分库时对数据进行切分,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。数据库分布式核心内容无非就是数据切分(Sharding)以及切分后对数据的
2023-06-14

怎么使用Python进行数据分析

使用Python进行数据分析可以通过以下几个步骤:1. 安装Python和相关库:首先需要安装Python解释器,推荐使用Anaconda发行版,因为它已经包含了很多常用的数据分析库,如NumPy、Pandas和Matplotlib等。可以
2023-08-23

怎么利用Python对500强排行榜数据进行可视化分析

今天小编给大家分享一下怎么利用Python对500强排行榜数据进行可视化分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一
2023-06-30

怎样利用Python对心脏病数据集进行分析

这篇文章将为大家详细讲解有关怎样利用Python对心脏病数据集进行分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我们都很害怕生病,但感冒发烧这种从小到大的疾病我们已经麻木了,因为一星期他
2023-06-16

在SpringMVC中使用Mybatis怎么实现对Mysql数据库进行分页查询

在SpringMVC中使用Mybatis怎么实现对Mysql数据库进行分页查询?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。第一步,搭建这个小案例,引入spring和mybti
2023-05-31

使用python怎么对表格数据进行处理

这篇文章给大家介绍使用python怎么对表格数据进行处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python对Excel表格的处理首先我们看一个最简单的情况,我们先不考虑性能的问题,那么我们可以使用xlrd这个工
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录