时间序列匹配之dtw的python实现(一)

2023-10-29

简介

Dynamic Time Warping(动态时间序列扭曲匹配,简称DTW)是时间序列分析的经典算法,用来比较两条时间序列之间的距离,发现最短路径。笔者在github上搜索dtw时发现了两个比较经典的库:dtw和dtw-python。dtw库的功能少但简单容易理解,dtw-python的功能齐全并提供了清晰的作图。在这里我们先介绍dtw库,dtw-python库留到下一篇文章介绍。

示例

对dtw算法的基本原理还不是很理解的可以点击这里,里面介绍的相当清楚了,接下来我们进入正题。

import numpy as np
#来自官方库的示例,代码未动,但注解原创。
#y是x的子序列,从x的第三个数字开始一一匹配
x = np.array([2, 0, 1, 1, 2, 4, 2, 1, 2, 0]).reshape(-1, 1)
y = np.array([1, 1, 2, 4, 2, 1, 2, 0]).reshape(-1, 1)

from dtw import dtw
#曼哈顿距离定义,各点相减的绝对值
manhattan_distance = lambda x, y: np.abs(x - y)
#计算出总距离,耗费矩阵,累计耗费矩阵,在矩阵上的路径
d, cost_matrix, acc_cost_matrix, path = dtw(x, y, dist=manhattan_distance)

print(d)
#计算得出2.0

import matplotlib.pyplot as plt

plt.imshow(acc_cost_matrix.T, origin='lower', cmap='gray', interpolation='nearest')
#lower参数表示上下颠倒,注意这里矩阵行列转置
plt.plot(path[0], path[1], 'w')
#path包含两个array
plt.show()

在这里插入图片描述
看不懂?没关系,接下来进行具体剖析:
在这里插入图片描述
前面也说过了,y是x的子集,图中橙色的线条表示的是y,蓝色的线条代表的是x,从我们的肉眼角度来说,只要把y平移过去就可以了,但对于计算机而言,需要计算各点的距离矩阵,我们把cost_matrix打印出来:
在这里插入图片描述
看不清的话建议放大,上面是x,左边是y,排列好之后,两两相减取绝对值,就可以得到我们的曼哈顿距离矩阵,可以看到图中的最短距离,是1+1+0+0+0+0+0+0+0+0 = 2,也就是d。实际上我们的优化目标就是使当前距离+右上或右下或右前的格子里的值最小。
这就是cost_matrix和d的计算,而acc_cost_matrix就是把它累加起来,像下面这样:
在这里插入图片描述
可以看到斜线上面的累加距离始终为2。
那path里面存的是什么值呢?为什么上面的线和我作图出来的线是反的呢?我们把path打印出来。
在这里插入图片描述
第一个数组存的是横坐标,第二个数组存的是纵坐标,也就是路径为:(0,0)–>(1,0)–>(2,0)–>(3,1)–>(4,2)–>(5,3)–>(6,4)–>(7,5)–>(8,6)–>(9,7)。实际上这里的纵轴是反的,所以我们要在plot函数中传入origin='lower’参数使它上下颠倒形成前面的图,至于不上下颠倒的正确图形是以下这样的(注意纵轴和前面的是反过来的)。
在这里插入图片描述
当然,这样的图还是不够直观,不能直接显示出原序列的变换,所以在下篇文章里笔者将介绍dtw-python包。

1.https://github.com/pierre-rouanet/dtw
2.https://zhuanlan.zhihu.com/p/43247215

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

时间序列匹配之dtw的python实现(一) 的相关文章

  • 使用ideone时如何传入命令行参数?

    我正在使用 ideone 在线解释器 http ideone com http ideone com 来测试一些 C 和 Python 程序 如何指定命令行参数而不是使用 STDIN 输入 看起来你不能 但是快速破解应该做的伎俩 stati
  • caffe安装:opencv libpng16.so.16链接问题

    我正在尝试在 Ubuntu 14 04 机器上使用 python 接口编译 caffe 我已经安装了 Anaconda 和 opencvconda install opencv 我还安装了咖啡中规定的所有要求 并更改了注释块makefile
  • 我可以在 matplotlib 中的绘图左侧放置一个垂直颜色条吗?

    来自颜色条方法的 matplotlib 命令摘要 http matplotlib org api pyplot api html highlight colorbar matplotlib pyplot colorbar我知道关键字参数or
  • 无法使用Python请求会话模块登录网站

    我刚刚开始进行网络抓取 对于我的第一个项目 我尝试使用 requests Session 登录 artofproblemsolving com 并访问另一个用户的帐户 这是我的代码 import requests LOGIN URL htt
  • lmfit模型拟合然后预测

    我正在领养lmfit进行曲线拟合并使用拟合模型进行预测 然而下面的代码并没有达到我想要的效果 能否请你帮忙 谢谢 import numpy as np from lmfit import Model def linearModel x a0
  • Asyncio:从未检索到任务异常的怪异

    假设我有一个简单的代码 import asyncio async def exc print 1 0 loop asyncio get event loop loop create task exc try loop run forever
  • 如何在Python中手动对数字列表进行排序?

    规格 Ubuntu 13 04 Python 3 3 1 背景 Python的初学者 遇到了这个 手动排序 问题 我被要求做的事情 让用户输入 3 个数值并将它们存储在 3 个不同的变量中 不使用列表或排序算法 手动将这 3 个数字从小到大
  • argparse 不检查位置参数

    我正在创建一个脚本 它使用 argparse 接受位置参数和可选参数 我已经阅读了 Doug 的教程和 python 文档 但找不到答案 parser argparse ArgumentParser description script t
  • 右键单击 QPushButton 上的 contextMenu

    对于我的应用程序 我在 Qt Designer 中创建了一个 GUI 并将其转换为 python 2 6 代码 关于一些QPushButton 与设计器创建 我想添加右键单击上下文菜单 菜单选项取决于应用程序状态 如何实现这样的上下文菜单
  • 当元组列表中相同项目的值是字符串时,对它们的值求和

    如果我有这样的元组列表 my list books 5 books 10 ink 20 paper 15 paper 20 paper 15 我怎样才能把列表变成这样 books 15 ink 20 paper 50 即添加同一项目的费用
  • 如何在 python 中使用交叉验证执行 GridSearchCV

    我正在执行超参数调整RandomForest如下使用GridSearchCV X np array df features all features y np array df gold standard labels x train x
  • 使用 Python-VLC 的 PyInstaller:无属性“media_player_new”错误

    我使用 Python VLC 创建视频播放器 并使用 PyInstaller 在 Windows 10 计算机上生成可执行文件 最初 它给了我错误 Import Error Failed to load dynlib dll libvlc
  • 在字符串内打印单引号

    我想输出 XYZ s ABC 我在Python IDLE中尝试了以下3条语句 第一条和第二条语句输出 a before 带打印功能的第三条语句不输出 before 作为 Python 新手 我想了解为什么 之前输出 在第 1 条和第 2 条
  • 如何将 django ModelForm 字段显示为不可编辑

    接受我的初步教训django ModelForm 我想让用户能够编辑博客中的条目 BlogEntry has a date postedTime title and content 我想向用户展示一个编辑表单 其中显示所有这些字段 但仅包含
  • 本地主机上的 Google App Engine GQL 查询

    我正在 Google App Engine Windows 上的 SDK 版本 1 7 0 上开发一个应用程序 我需要经常测试该应用程序 并且此测试涉及数据存储上的大量 GQL 查询 您可以在 App Engine 管理界面的浏览器中在线运
  • 如何将Python包从旧版本安装到新版本?

    我正在使用 python 3 7 最近在 Linux 中安装了 python 3 8 是否有任何 bash 命令或脚本可以获取 3 7 的所有软件包列表并在 3 8 版本中一一安装 我想避免每个包裹都手工完成 注意 我将它们安装在我的系统中
  • Django 中使用外键的抽象基类继承

    我正在尝试在 Django 支持的网站上进行模型继承 以遵守 DRY 我的目标是使用一个名为 BasicCompany 的抽象基类来为三个子类提供通用信息 Butcher Baker CandlestickMaker 它们位于各自的应用程序
  • 如何仅读取 CSV 文件每行的第一列 [重复]

    这个问题在这里已经有答案了 如何在Python中读取CSV文件每行的第一列 我的数据是这样的 1 abc 2 bcd 3 cde 我只需要循环第一列的值 另外 当我在 calc 中打开 csv 文件时 每行中的数据都在同一个单元格中 这正常
  • 如何使用 keras.backend.gradients() 获取梯度值

    我试图获得 Keras 模型的输出相对于模型输入 x 而不是权重 的导数 似乎最简单的方法是使用 keras backend 中的 梯度 它返回梯度张量 https keras io backend https keras io backe
  • 如何使 Django 自定义管理命令参数不再需要?

    我正在尝试在 django 中编写自定义管理命令 如下所示 class Command BaseCommand def add arguments self parser parser add argument delay type int

随机推荐

  • 使用JavaScript实现一个简单的计时器

    简介 计时器是前端开发中常见的功能之一 它可以帮助我们记录时间并进行倒计时等操作 在本篇博客中 我将向大家介绍如何使用JavaScript实现一个简单的计时器 实现步骤 第一步 创建HTML结构 首先 我们需要在HTML中创建一个用于显示计
  • 大语言模型参数说明(Temperature,Top p,Top k)

    如下是一些模型的运行界面 在使用OpenAI的接口 常常遇见一些参数 搞清它们的含义促使我们更进一步理解输出的结果 学习传送带 1 Temperature 用于调整随机从生成模型中抽样的程度 因此每次点击 生成 时 相同的提示可能会产生不同
  • app性能

    性能获取办法 appium webview context execute script perfmance api appium selenium的ExecuteScript Api 注入js return JSON stringify
  • muduo网络库学习(九)日志类Logger和LogStream,将日志信息打印到屏幕

    每一个成熟的项目都有大大小小的日志系统 在关键的地方打印日志信息 常用来跟踪程序运行 查找错误原因等 可以节省大量的debug时间 muduo的日志信息有5个级别 TRACE 细粒度最高的日志信息 打印的最详细 DEBUG 细粒度级别上对调
  • 程序中的耦合与解耦学习(三)——解耦学习1

    以下内容来源于网友内容 引用网友链接 简要 一 解耦都是需要代理的 本质上并不存在没有代理就发生两个部件之间解耦的情况 二 耦合 指的是两个可以协作的部件的关系 A和B可以协作 则A和B的关系是耦合 三 如果A可以和O P Q S 简称集合
  • API接口签名验证

    系统从外部获取数据时 通常采用API接口调用的方式来实现 请求方和接口提供方之间的通信过程 有这几个问题需要考虑 1 请求参数是否被篡改 2 请求来源是否合法 3 请求是否具有唯一性 今天跟大家探讨一下主流的通信安全解决方案 参数签名方式
  • java使用策略模式实现统一接口的不同效果返回

    首先说下什么是策略模式以及策略模式的优缺点 策略模式 是指定义了算法家族 分别封装起来 让他们之间可以相互替换 此模式让算法的变化不会影响到其他使用算法的用户 可以避免多重的if else 判断语句 1 加入系统中有很多类 而他们的区别仅仅
  • JAVA 四大作用域名

    JavaWeb有ServletContext ServletRequest HttpSession PageContext四大域对象 下面主要从域对象的生命周期 作用 作用范围进行介绍 Servlet中只有前三个域对象 JSP中多了一个pa
  • [2018 ICPC 青岛] 解题记录ing

    M Function and Function 队友说直接暴力即可 include
  • 安装ChormeOS

    一 准备工具 16G的U盘一个 支持UEFI启动的电脑 二 下载工具 Ubuntu Mate 镜像下载 https ubuntu mate org download Rufus写盘工具 https rufus ie Chrome 安装框架下
  • SpringBoot + redis 简单运用

    初始项目 pom xml引入redis
  • LeetCode每日一题之二分搜索

    文章目录 1 关于二分搜索常见的误区 2 左闭右闭区间的写法 3 左闭右开区间的写法 4 找到第一个大于target的数 5 找到第一个小于target的数 6 找到第一个大于等于taregt的数 7 找到第一个小于等于target的数 1
  • Vue3 word如何转成pdf代码实现

    博主 锅盖哒 文章核心 word如何转换pdf 目录 1 前端部分 2 后端部分 在Vue 3中 前端无法直接将Word文档转换为PDF 因为Word文档的解析和PDF的生成通常需要在后端进行 但是 你可以通过Vue来触发后端的转换过程 下
  • 牛客网刷题-java

    大部分解答为牛客网各位同学的精彩回答 本文只是选择一些互联网常考题目记录备忘 1 一个类的构造器可以调用这个类中的其他构造器 this的作用其中一个就是在一个构造方法中调用另一个构造方法 格式为this 参数 如 this x super是
  • 小程序挣钱_抖推之家抖音小程序怎么挣钱?

    最近很多朋友来公司咨询 抖推之家到底是个什么样的项目 用抖音小程序怎么挣钱 真的只需要发发视频就可以了 大家对于它的好奇 疑问越来越多 今天小编就来为大家一一解答 一 抖推之家是个什么样的项目 抖推之家 专注于短视频流量变现服务 整合短视频
  • anaconda 创建虚拟环境、激活,使用的基本方法及安装包的基本方法

    第一步 打开Anaconda Prompt 可以看到这里是base环境 第二步 我们现在要创建一个新的虚拟环境 名叫test 且python版本为3 8 在安装过程中会出现下面这个选项 输入y就好了 创建成功如下图所示 hiahia 我们已
  • js 实现同时调两个接口

    let promiseValues getScreeningFileList id report getScreeningFileList id pathology Promise all promiseValues then res gt
  • 方舟生存进化服务器文件设置,方舟生存进化私人服务器设置教程[多图]

    方舟生存进化私人服务器怎样设定 得到使用权后 就能设置进入途径 下面小编为大家带来方舟生存进化私人服务器设置教程 一起来看看吧 私人服务器购买后 服主可以在里边配置自己的服务器信息 私人服务器进入方法 点击多人游戏下方的英文字母选项 就是私
  • win7及以上系统C++实现Hook explorer文件级监控复制、剪切和删除操作

    最近项目组需要实现一个对windows用户文件操作进行监控的功能 也就是使用explorer资源管理器的操作 于是乎我就想到了使用Hook的方法进行拦截 查找一番资料后发现XP调用的是最简单的CopyFileEx MoveFileWithP
  • 时间序列匹配之dtw的python实现(一)

    简介 Dynamic Time Warping 动态时间序列扭曲匹配 简称DTW 是时间序列分析的经典算法 用来比较两条时间序列之间的距离 发现最短路径 笔者在github上搜索dtw时发现了两个比较经典的库 dtw和dtw python