【算法小记】深度学习——时间序列数据分析 Time series Data Analysis

在本篇博客中将简单介绍常见的几种循环神经网络和一维卷积神经网络,并使用一些简答的数据进行拟合分析。本文相对适合刚入门的同学,同时也作为自己过去一段时间学习的总结和记录,现在神经网络框架已经非常完善的支持了很多常见和有效的深度学习算子,我们只需要掌握函数的用法就可以快速应用到自己项目中,当然希望热爱AI的同学能持续学习每一行API背后的数学逻辑和工程优化方法

认识背景

在多数工程科学和基础科学研究中都会产生大量分布的时间序列数据。在几十年前的传统的分析过程中工程师和学术界喜欢基于数值分析的过程来对模型进行建模,得到一个和对象尽可能拟合的结果。但是深度学习技术的出现使得时间序列数据的分析得到了更加简便的表达。作为新时代的研究人员有必要学习和理解几种常用的时间序列数据分析方法。
首先我们需要认识什么是时间序列数据:
最常见的例子就是语言文本,在你读到现在这句话的时候,你的认识过程中已经默认产生了对这句话的词组及其前后文的联系。如果我把上一句话改为:“读到语言文本例子最常见的,在这句话在的时候…”很明显,即使是完全相同的词汇组成的句子,随机打乱之后基本丧失了原来的含义,再或者我可以改为:“最常见的xx就是xxxx,在x读到xx这句话的xx”,那么在保持词汇顺序的前提下丢失部分词汇也无法得到原来的语义信息。
根据上面的两个例子,我们不难得知,在时间序列数据中最关注的就是这两个信息:1、每个点的数据内容;2、数据内容之间的前后文关系。这两个条件缺一不可。那么我们如何来拟合这两组数据,或者换句话说让计算机能够像人一样理解数据和数据前后关系,实现学习数据并应用在未来预测上。
在下面的曲线中,x轴作为时间数据,y轴作为时间点的目标数据,我们完全可以使用一个函数 F ( x ) \ F(x)  F(x)来拟合随机分布,传统方法中有很多算法在做这件事情,在很多特殊场景下这种基于建模的传统拟合方法依然能得到非常好的结果。
请添加图片描述
但是,并非所有的场景都局限于某一个条件之下。应该说绝大部分时间数据都包含了很多的噪声数据和复杂的非线性特征,对于神经网络来说,神经网络天然就具有良好的噪声去除能力,同时基于网络连接的系统对输入的局部数字浮动也存在较好的适应能力。
那么背景介绍的差不多了,我们直接看一下神经网络针对时间数据有些什么方法:

一维卷积神经网络

有过图像开发经验的同学应该很熟悉卷积神经网络,在常见的目标检测算法中我们使用二维卷积网络提取特征。那么,我们现在抽象一点,将一张二维的平面图像数据按照行的方向,延展为一个一维行数据。现在我们针对这个一维的图像数据就可以通过一维的卷积核来对其进行特征提取和特征压缩。
这个压缩的操作有一个专有APIlayers.Flatten()
在这里插入图片描述
得到一维结构的数据后,我们同样可以使用卷积核来计算,只不过这个卷积核的其中一个维度是1。下面的草图里我们简单举一个15大小的卷积核,原始数据长度为H,这个卷积核依次从前向后按照步长为1滑动,每次卷积计算得到一个数值,当滑动到数据最末端的时候会得到一组长度为1(H-5)长度的映射图数据。
在这里插入图片描述
在一个卷积的基础上,我们可以调整卷积核的长度,调整卷积核的个数,达到多个同尺寸卷积核计算得到多个特征图,然后特征图再继续级联计算,多层计算之后就可以得到最终结果的输出。通过控制输出的格式我们可以实现一列数据的分类任务或者一列数据到另一列数据的映射。

一维卷积

要实现一维的卷积算法的本质还是在做矩阵运算,不同于常见的标准卷积计算,一维卷积适合来计算时间序列数据或者一维的采样数据,但是和RNN不同的是一维卷积更多的是学习数据源到目标的映射关系,RNN则同是关注数据的前后依赖,二者在不同的场景下根据源数据的特征单独使用或者组合使用。

划窗法:

考虑到一维卷积的数据计算特征——通过将源数据变换成一个第一维度为1的列或行形状矩阵,然后通过一个卷积块矢量相乘(源数据的叉乘矩阵),迭代该叉乘矩阵的内部参数和输出部分的激活函数权重,计算网络的损失值,知道得到最小化损失。
为了匹配计算过程最基础的卷积计算操作,我们有两种方式可以实现,第一种是划窗:
在这里插入图片描述
用一个固定长度的窗口按照顺序或者其它既定的规则滑动,并用一个和这个窗口相同维度的卷积核和窗口截取出来的数据做矩阵向量乘法。

分组卷积法:

在一维的向量计算过程中除了用划窗的方法截取出数据用来计算,同样还可以将原始的数据直接分组,通过分组的方式将原始数据对齐成为N-1组长度对齐的数据,然后依次的输入数据用卷积核计算
在这里插入图片描述
那继续使用一段简单的代码演示一下两种不同操作及其对应实现。在示例的代码中结合上面两者共同的优势,通过划窗顺序的选择数据,然后再通过分组将数据形成N对1的结构,实现固定长度时间序列数据输入到下一个时间点的预测学习。

import os
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.layers import Dropout, Dense, LSTM, Conv1D
import matplotlib.pyplot as pltfrom sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error
import mathcsv_data = pd.read_csv('../Data/SH600519.csv')  # 读文件数据
# soc_csv = pd.read_csv('../Data/soc.csv')  # 读文件数据test_data_rate = 0.8
training_set = csv_data['close']
test_set = training_set[int(len(training_set)*(1-test_data_rate)):]
training_set, test_set = np.array(training_set), np.array(test_set)# 归一化
sc = MinMaxScaler(feature_range=(0, 1))  # 定义归一化:归一化到(0,1)之间
training_set_scaled = sc.fit_transform(training_set.reshape(-1, 1))  # 求得训练集的最大值,最小值这些训练集固有的属性,并在训练集上进行归一化
test_set = sc.transform(test_set.reshape(-1, 1))  # 利用训练集的属性对测试集进行归一化

处理好原数数据到可以使用了后我们就可以按照我们希望的想法对数据进行分组操作了,需要注意的一个点是,神经网络模型是对输入数据尺寸敏感的,我们在确定数据分组长度和分组后数据张量的尺度时需要同时考虑网络的卷积核大小以及训练标签数据的维度,只有这几次参数同时对齐了之后网络才可以正确初始化以及开始推理。

x_train = []
y_train = []x_test = []
y_test = []
Time_expansion_step = 60training_data = training_set_scaled[len(training_set_scaled)- int(len(training_set_scaled)/Time_expansion_step)*Time_expansion_step : , :]
test_set = test_set[len(test_set)- int(len(test_set)/Time_expansion_step)*Time_expansion_step : , :]
for i in range(Time_expansion_step, len(training_data)):train_ = training_data[i - Time_expansion_step:i, 0]x_train.append(train_)y_train.append(training_data[i, 0])# 对训练集进行打乱
np.random.seed(7)
np.random.shuffle(x_train)
np.random.seed(7)
np.random.shuffle(y_train)
tf.random.set_seed(7)
# 将训练集由list格式变为array格式
x_train, y_train = np.array(x_train), np.array(y_train)
x_train = np.reshape(x_train, (x_train.shape[0], Time_expansion_step, 1))# 设置测试数据格式
for i in range(Time_expansion_step, len(test_set)):x_test.append(test_set[i - Time_expansion_step:i, 0])y_test.append(test_set[i, 0])
x_test, y_test = np.array(x_test), np.array(y_test)
x_test = np.reshape(x_test, (x_test.shape[0], Time_expansion_step, 1))

RNN和LSTM

见RNN LSTM简介和源码示例

CNN-LSTM

CNN-LSTM的代码实现如果有同学需要可以私信,后续再继续更新

生活的惊喜总是和意外一同到来,既然很难做到事事顺心,那就主动适应环境。力求把自己该做的事做到最好。
每当和同门朋友聊起深度学习,我总是很有的兴致的那个,我想这个技术未来不久应该是一个切实改变我们生活的手段,也许GPT的成功也是历史发展上一个必然出现的节点。不过未来为了工作,或许很长时间不会再学习和更新神经网络相关的博客了。希望换个方向也能做出一番属于自己的天地。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【优选算法】BFS解决FloodFill算法

一、经验总结 什么是FloodFill算法? FloodFill算法是一种用于填充连通区域的算法,通常用于图像处理和计算机图形学中。它从给定的起始点开始,向周围相邻的像素进行扩散填充,直到遇到边界或者其他指定条件停止。 FloodFill算法还…

新买的移动硬盘无法识别

文章目录 背景解决方案 背景 同事新买的移动硬盘,插在电脑上识别不出来盘符,检查了一下,硬盘没问题应该,是ssk的硬盘盒M.2的SSD,硬盘驱动也是正常的,插拔了几次,都不识别,换了太电脑…

【Java】解决Java报错:OutOfMemoryError

文章目录 引言1. 错误详解2. 常见的出错场景2.1 内存泄漏2.2 大数据结构2.3 JVM内存参数配置不当 3. 解决方案3.1 内存泄漏检测与修复3.2 优化数据结构3.3 调整JVM内存参数3.4 使用弱引用 4. 预防措施4.1 定期进行内存分析4.2 合理设计数据结构4.3 使用合适的JVM内存参数4.4 优…

Mysql使用中的性能优化——批量插入的规模对比

在《Mysql使用中的性能优化——单次插入和批量插入的性能差异》中,我们观察到单次批量插入的数量和耗时呈指数型关系。 这个说明,不是单次批量插入的数量越多越好。本文我们将通过实验测试出本测试案例中最佳的单次批量插入数量。 结论 本案例中约每次…

【云岚到家】-day00-开发环境配置

文章目录 1 开发工具版本2 IDEA环境配置2.1 编码配置2.2 自动导包设置2.3 提示忽略大小写2.4 设置 Java 编译级别 3 Maven环境3.1 安装Maven3.2 配置仓库3.3 IDEA中配置maven 4 配置虚拟机4.1 导入虚拟机4.2 问题 5 配置数据库环境5.1 启动mysql容器5.2 使用MySQL客户端连接数据…

【YOLO系列】YOLOv1学习(PyTorch)原理加代码

论文网址:https://arxiv.org/pdf/1506.02640 训练集博客链接:目标检测实战篇1——数据集介绍(PASCAL VOC,MS COCO)-CSDN博客 代码文件:在我资源里,但是好像还在审核,大家可以先可以,如果没有的…

从 Android 恢复已删除的备份录

本文介绍了几种在 Android 上恢复丢失和删除的短信的方法。这些方法都不能保证一定成功,但您可能能够恢复一些短信或其中存储的文件。 首先要尝试什么 首先,尝试保留数据。如果你刚刚删除了信息,请立即将手机置于飞行模式,方法是…

【Linux】信号(二)

上一章节我们进行了信号产生的讲解。 本节将围绕信号保存展开,并会将处理部分开一个头。 目录 信号保存:信号的一些概念:关于信号保存的接口:sigset_t的解释:对应的操作接口:sigprocmask:sigp…

SwiftUI中Preference的理解与使用(ScrollView偏移量示例)

在 SwiftUI 中,Preference用于从视图层次结构的较深层次向上传递信息到较浅层次。这通常用于在父视图中获取子视图的属性或状态,而不需要使用状态管理工具如State或 ObservableObject。Preference特别用于自定义布局或组件,其中子视图需要向父…

Eslint配置指南

1. Eslint配置指南 1.1. 安装 ESLint1.2. 生成配置文件1.3. 修改配置文件1.4. 创建 .eslintignore 文件1.5. 运行 ESLint1.6. 整合到编辑器/IDE1.7. 自动修复 2. 配置prettier 2.1. 安装依赖包2.2. .prettierrc.json添加规则2.3. .prettierignore忽略文件2.4. 保存自动格式化 3…

实战 | 通过微调SegFormer改进车道检测效果(数据集 + 源码)

背景介绍 SegFormer:实例分割在自动驾驶汽车技术的快速发展中发挥了关键作用。对于任何在道路上行驶的车辆来说,车道检测都是必不可少的。车道是道路上的标记,有助于区分道路上可行驶区域和不可行驶区域。车道检测算法有很多种,每…

vue2实现将el-table表格数据导出为长图片

方法一、 el-table数据导出为长图片 将el-table数据导出为图片不是一个直接的功能,但可以通过以下步骤实现: 使用html2canvas库将表格区域转换为画布(canvas)。 使用canvas的toDataURL方法将画布导出为图片格式(例如PNG)。 创建…

数据结构--实验

话不多说,直接启动!👌🤣 目录 一、线性表😎 1、建立链表 2、插入元素 3、删除特定位置的元素 4、输出特定元素值的位置 5、输出特定位置的元素值 6、输出整个链表 实现 二、栈和队列😘 栈 顺序栈 …

将web项目打包成electron桌面端教程(一)vue3+vite+js

说明:后续项目需要web端和桌面端,为了提高开发效率,准备直接将web端的代码打包成桌面端,在此提前记录一下demo打包的过程,需要注意的是vue2或者vue3的打包方式各不同,如果你的项目不是vue3vitejs&#xff0…

数字孪生技术体系和核心能力整理

最近对数字孪生技术进行了跟踪调研学习,整理形成了调研成果,供大家参考。通过学习,发现数字孪生技术的构建过程其实就是数字孪生体的构建与应用过程,数字孪生体的构建是一个体系化的系统工程,数字化转型的最终形态应该就是数实融合互动互联的终极状态。数实融合是每个行业…

[每周一更]-(第100期):介绍 goctl自动生成代码

​ 在自己组件库中,由于部分设计会存在重复引用各个模板的文件,并且基础架构中需要基础模块内容,就想到自动生成代码模板,刚好之前有使用过goctl,以下就简单描述下gozero中goctl场景和逻辑,后续自己借鉴将自…

英语学习笔记32——What‘s he/she/it doing?

What’s he/she/it doing? 他/她/它 正在做什么? 词汇 Vocabulary type /taɪp/ v. 打字 n. 类型,签字 ing形式:typeing 用法:this type of …    这种类型的…… 例句:我喜欢这种苹果。    I like this type…

java自学阶段二:JavaWeb开发--day80(项目实战2之苍穹外卖)

《项目案例—黑马苍穹外卖》 目录: 学习目标项目介绍前端环境搭建(前期直接导入老师的项目,后期自己敲)后端环境搭建(导入初始项目,新建仓库使用git管理项目,新建数据库,修改登录功能&#xff…

[office] 如何在Excel中拉动单元格时表头不变形- #学习方法#职场发展#经验分享

如何在Excel中拉动单元格时表头不变形? 如何在Excel中拉动单元格时表头不变形?Excel是我们常用的办公软件,当我们使用Excel拉动单元格时表头不变形,该如何操作呢,下面小编就为大家做详细讲解 如何在Excel中拉动单元格时表头不变…

用户输入表格数据设计(XPTable控件使用说明九)

XP Table控件可以编辑数据,程序也可以使用编辑后的数据,但是程序新建时又从初始化数据到模型到显示,这两步有点绕,做了一个实例来说明这块内容。 流程1:初始化数据--> model--> UI show 流程2:UI--…