基于小波分析和机器学习的时间序列分析与识别

研究对象:ECG等时间序列信号

方法:小波变换,简单神经网络

首先导入相关模块,需要安装尺度谱模块:pip install scaleogram

和mat4py模块:pip install mat4py

import numpy as np
import pandas as pd
import pywt
import seaborn as sns
import scaleogram as scg
import matplotlib.pyplot as plt
import matplotlib.gridspec as GridSpec
from mat4py import loadmat
from scipy.fftpack import fft

导入数据,并提取标签

data = loadmat("ECGData.mat")
ecg_total = len(data['ECGData']['Data'])
ecg_data = []
ecg_labels = []
for i in range(0, ecg_total):
    ecg_data.append(data['ECGData']['Data'][i])
    ecg_labels.append(data['ECGData']['Labels'][i])

flat_list_ecg_labels = [item for sublist in ecg_labels for item in sublist]

数据可视化

fig = plt.figure(figsize=(12, 6))
grid = plt.GridSpec(3, 1, hspace=0.6)

arr_signal = fig.add_subplot(grid[0, 0])
chg_signal = fig.add_subplot(grid[1, 0])
nsr_signal = fig.add_subplot(grid[2, 0])

arr_signal.plot(range(0, len(data['ECGData']['Data'][33]), 1), ecg_data[33], color = 'blue')
arr_signal.set_xlim(0, 1000)
arr_signal.set_title('ARR Signal')

chg_signal.plot(range(0, len(data['ECGData']['Data'][100]), 1), ecg_data[100], color = 'red')
chg_signal.set_xlim(0, 1000)
chg_signal.set_title('CHG Signal')

nsr_signal.plot(range(0, len(data['ECGData']['Data'][150]), 1), ecg_data[150], color = 'green')
nsr_signal.set_xlim(0, 1000)
nsr_signal.set_title('NSR Signal')

基于小波分析和机器学习的时间序列分析与识别

进行傅里叶变换

nn = 160
signal_length = 1000
full_signal_fft_values = np.abs(fft(ecg_data[nn][:signal_length]))
x_values_fft = range(0, len(data['ECGData']['Data'][nn]), 1)[:signal_length]

fig = plt.figure(figsize=(12, 6))
grid = plt.GridSpec(2, 1,hspace=0.6)

full_signal = fig.add_subplot(grid[0, 0])
fft_comp = fig.add_subplot(grid[1, 0])

full_signal.plot(x_values_fft, ecg_data[nn][:signal_length], color = 'green')
full_signal.set_xlim(0, 512)
full_signal.set_title('Full Signal')
fft_comp.plot(x_values_fft, list(full_signal_fft_values), color = 'purple')
fft_comp.set_xlim(0, 512)
fft_comp.set_ylim(0, 100)
fft_comp.set_title('FFT of full signal')

基于小波分析和机器学习的时间序列分析与识别

看下所用的Morlet小波啥个样子

axes = scg.plot_wav('morl', figsize=(12,4))

顺便看下小波族大致包含多少小波类

pywt.families(False)

[‘Haar’,

‘Daubechies’,

‘Symlets’,

‘Coiflets’,

‘Biorthogonal’,

‘Reverse biorthogonal’,

‘Discrete Meyer (FIR Approximation)’,

‘Gaussian’,

‘Mexican hat wavelet’,

‘Morlet wavelet’,

‘Complex Gaussian wavelets’,

‘Shannon wavelets’,

‘Frequency B-Spline wavelets’,

‘Complex Morlet wavelets’]

顺便再给几个小波的波形及相应的频谱

基于小波分析和机器学习的时间序列分析与识别

下面进行小波尺度谱变换

选择一个默认的小波
scg.set_default_wavelet('morl')

nn = 33
signal_length = 128
小波变换的尺度范围
scales = scg.periods2scales( np.arange(1, signal_length+1) )
x_values_wvt_arr = range(0,len(ecg_data[nn]),1)

绘制信号
fig1, ax1 = plt.subplots(1, 1, figsize=(9, 3.5));
ax1.plot(x_values_wvt_arr, ecg_data[nn], linewidth=3, color='blue')
ax1.set_xlim(0, signal_length)
ax1.set_title("ECG ARR")

计算小波时间-尺度谱
scg.cws(ecg_data[nn][:signal_length], scales=scales, figsize=(10, 4.0), coi = False, ylabel="Period", xlabel="Time",
        title='ECG_ARR: scaleogram with linear period');

print("Default wavelet function used to compute the transform:", scg.get_default_wavelet(), "(",
      pywt.ContinuousWavelet(scg.get_default_wavelet()).family_name, ")")

下面开始进行机器学习识别,首先准备机器学习所需要的数据

arr_list = ecg_data[0:95]
chf_list = ecg_data[96:125]
nsr_list = ecg_data[126:162]

arr_split_256 = [np.array_split(arr_list[ii], 256) for ii in range(95)]
arr_flatten = [item for sublist in arr_split_256 for item in sublist]

chf_split_256 = [np.array_split(chf_list[ii], 256) for ii in range(29)]
chf_flatten = [item for sublist in chf_split_256 for item in sublist]

nsr_split_256 = [np.array_split(nsr_list[ii], 256) for ii in range(36)]
nsr_flatten = [item for sublist in nsr_split_256 for item in sublist]

reduce_size = 500
full_1500 = (arr_flatten[0:reduce_size] + chf_flatten[0:reduce_size] + nsr_flatten[0:reduce_size])

创建数据集

#机器学习相干模块
from sklearn import preprocessing
from sklearn.model_selection import train_test_split

fs = len(full_1500[0])
sgn_length = 2000   #信号长度
size_dataset = len(full_1500)
scales = range(1, fs)
waveletname = 'morl'   #小波

X_full = np.ndarray(shape=(size_dataset, fs-1, fs-1, 3))
 #开始生成数据
for i in range(0, size_dataset):
    if i % 500 == 0:
        print (i, 'done!')
    for j in range(0, 3):
        signal = full_1500[i]
        coeff, freq = pywt.cwt(signal, scales, waveletname, 1)
        X_full[i, :, :, j] = coeff[:,:fs-1]
#相应的标签
list_ecg_labels_arr = ['ARR']*reduce_size
list_ecg_labels_chf = ['CHF']*reduce_size
list_ecg_labels_nsr = ['NSR']*reduce_size
list_ecg_labels = (list_ecg_labels_arr + list_ecg_labels_chf + list_ecg_labels_nsr)

le = preprocessing.LabelEncoder()
ecg_labels_encoded = le.fit_transform(list_ecg_labels)
X_train, X_test, y_train, y_test = train_test_split(X_full, ecg_labels_encoded, test_size=0.25, random_state=42)

使用尺度谱训练ECG分类器

import sys
from tensorflow import keras

查看一下训练数据

基于小波分析和机器学习的时间序列分析与识别

定义基本的神经网络

num_filter, num_classes = 3, 3
model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[fs-1, fs-1, num_filter]),
    keras.layers.Dense(300, activation="relu"),
    keras.layers.Dense(100, activation="relu"),
    keras.layers.Dense(num_classes, activation="softmax")
])
model.compile(loss="sparse_categorical_crossentropy",
              optimizer="sgd", metrics=["accuracy"])

model.summary()

基于小波分析和机器学习的时间序列分析与识别

训练模型

history = model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))

model.evaluate(X_test, y_test)

def plot_learning_curves(history):
    pd.DataFrame(history.history).plot(figsize=(8, 5))
    plt.grid(True)
    plt.gca().set_ylim(0, 1)
    plt.xlabel('epochs', size = 16)
    plt.xticks(fontsize=14)
    plt.yticks(fontsize=14)
    plt.savefig('Figure_epochs.png')
    plt.close()

plot_learning_curves(history)

prediction = model.predict(X_test)
pred_classes = prediction.argmax(axis=1)

绘制混淆矩阵

cm = confusion_matrix(y_test, pred_classes)
cm_norm =  cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]

df_cm = pd.DataFrame(cm_norm, ['ARR', 'CHF', 'NSR'], ['ARR', 'CHF', 'NSR'])
plt.figure(figsize = (10,6))
conf = sns.heatmap(df_cm, annot=True, square=True, annot_kws={"size": 12})
conf.set_xlabel('Prediction')
conf.set_ylabel('True')

基于小波分析和机器学习的时间序列分析与识别

基于小波分析和机器学习的时间序列分析与识别 – 哥廷根数学学派的文章 – 知乎 https://zhuanlan.zhihu.com/p/554097033

Original: https://blog.csdn.net/weixin_39402231/article/details/126369488
Author: 哥廷根数学学派
Title: 基于小波分析和机器学习的时间序列分析与识别

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/765438/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • flask上传文件

    文章目录 前言 一、环境 二、使用 * 1.更新模型类 2.更改视图和模板 3.编写视图 运行 前言 在开发flask项目的时候,难免会遇到文件传输的需求,现在就以上传用户头像为例…

    Python 2023年8月12日
    052
  • Python写游戏,我上我也行 – Flappy Bird 03

    如果你喜欢自动化:一起学爬虫(Python) — 19 年轻人,进来学自动化 如果你想学习爬虫相关的知识,就关注一下下,点赞一下下,然后到小泽的主页里,尽情遨游吧~ 努力做日更博主…

    Python 2023年9月21日
    032
  • PatchCore原理与代码解读

    paper:Towards Total Recall in Industrial Anomaly Detection code:GitHub – amazon-scie…

    Python 2023年9月29日
    063
  • 大数据分析案例:财政收入预测Jupyter版

    ; 基于Python实现大数据分析案例:财政收入预测 该案例的代码py版本与ipynb程序相同,但在代码迁移过程中可能会遇到一些问题,主要是numpy与pandas版本导致问题。当…

    Python 2023年8月29日
    034
  • Python游戏开发之Dungeon Crawler 游戏源码大全

    ; 源码一 功能: WASD 移动SPACE 攻击SHIFT 使用楼梯 介绍 每个级别都包含一把钥匙和一个上锁的舱口。收集钥匙以解锁通往下一层的通道(SHIFT解锁)。史莱姆造成的…

    Python 2023年9月25日
    034
  • Django回顾之_05_登录案例

    视图: 1.视图的功能 接收请求,进&#…

    Python 2023年6月9日
    062
  • 【交通数据(1)——加州高速路网PeMS交通数据】

    交通数据(1)——加州高速路网PeMS交通数据 一、PeMS数据介绍 * 1. 数据来源 2. 数据特点 3. 数据诊断与处理 4. PeMS数据格式 二、相关数据下载 * 1. …

    Python 2023年9月16日
    084
  • merge规则 python_python dataframe 在merge时 产生笛卡尔积

    在pandas中,concat, merge, join的使用方法可以参考以下资料: http://blog.csdn.net/stevenkwong/article/detail…

    Python 2023年8月9日
    047
  • 【无标题】

    安全基础面试题 **1.自我介绍2.介绍自己常用的python库(★)fuzzywuzzy ,字符串模糊匹配。esmre ,正则表达式的加速器。pyyaml ,Python版本的Y…

    Python 2023年8月5日
    047
  • flask+vue实现简单的Web应用

    简介 flask是python在web开发上的一个比较轻量的开发框架,vue是前端视图库,是一个MVVM框架。flask+vue可以实现快速的现代web应用开发,这里我们以简单的读…

    Python 2023年8月9日
    058
  • python绘制时间_在matplotlib中绘制时间与日期

    所以回溯告诉你问题所在。它试图将日期解析为时间,这是您解析以下行中的数据的结果:data= np.loadtxt(‘daily_count.csv’, de…

    Python 2023年9月5日
    062
  • python:矩阵的基本运算

    一、Python 矩阵基本运算 引入 numpy 库 import numpy as np python矩阵操作 1)使用 mat 函数创建一个 2X3矩阵 a = np.mat(…

    Python 2023年8月1日
    026
  • python:多元线性回归总结

    最近做的项目要用到多元线性回归,小结一下用python做多元线性回归要用到的代码和步骤: 数据:因变量y,自变量x 1. 导入库 导入包 import os import pand…

    Python 2023年8月1日
    046
  • 一次 Java log4j2 漏洞导致的生产问题

    一、问题 近期生产在提交了微信小程序审核后(后面会讲到),总会出现一些生产告警,而且持续时间较长。我们查看一些工具和系统相关的,发现把我们的 gateway 差不多打死了。 有一些…

    Python 2023年10月16日
    033
  • conda 环境中部署gunicorn+flask项目

    系统环境中安装的是Python3.5,项目中需要的Python为3.6及以上的环境,所以用conda虚拟环境进行隔离。 conda ; 项目搭建 进入虚拟环境,安装所需要的包。 s…

    Python 2023年8月9日
    070
  • 外包四年太差劲,幡然醒悟要跳槽

    前几天有个读者过来说,”二哥, 外包干了四年,感觉和外界差距有点大,现在被动醒悟,希望你能帮我制定一下学习路线。” 那二哥这么负责任,必须得承担起这份职责啊…

    Python 2023年10月7日
    043
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球