DTW:Dynamic Time Warping,动态时间规整

2023-10-07 03:30

本文主要是介绍DTW:Dynamic Time Warping,动态时间规整,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       DTW 起源于语音识别领域,目的是衡量两个长度不同的序列相似性(similarity),并计算两个序列之间的最佳匹配

       对于 两个长度相同的序列,其相似性可以通过一种很直接的方式衡量 —— 依次计算两个序列中各个点之间的距离,最后进行加和。

        例1 :将两个序列中的点根据点在序列中的位置一一对应,即 A(1)与B(1),A(2)与B(2),... ,A(i)与B(i),... ,A(6)与B(6)相对应。

        Similarity(A, B) = |A(1)-B(1)|+|A(2)-B(2)|+ ... + |A(6)-B(6)|。

        例2 :允许一个序列的点 可以与 另一个序列的多个点 对应。比如下图中,A(1)与B(1),A(2)与B(1),A(3)与B(2),A(4)与B(2)A(5)与B(3)、A(5)与B(4),A(6)与B(5)、A(6)与B(6)相对应。

        Similarity(A, B) = |A(1)-B(1)| + |A(2)-B(1)| + |A(3)-B(2)| + |A(4)-B(2)| + |A(5)-B(3)| + |A(5)-B(4)| + |A(6)-B(5)| + |A(6)-B(6)|。

时间规整(Time Warping):允许 一个序列中某个点 与 另一个序列中的多个连续点 相对应。

距离矩阵法

        下图用一个矩阵 M,更直观地描述 A 和 B 两个序列之间的距离。横轴表示点在A中的位置,纵轴表示点在B中的位置,格点值 M(i, j) 为两个点之间的距离。

        灰色虚线为 例1 所述方法,根据位置相同原则对应序列中的元素,正好是矩阵的对角线。黄格红线为 例2 。

        DTW 的目标即为找到一条最短的路径。路径上的格点值之和为路径长度。DTW 的计算步骤为:① 计算两个序列中各点之间的距离矩阵 M ;② 寻找一条从矩阵的左上角到右下角的格点值之和最小的路径。

        距离矩阵 M 中,从左上角到右下角的路径,具有以下性质:

① 当前路径长度 = 上一步的路径长度 + 当前格点值

② 路径上的某个格点,它的上一个格点只可能是其 左、上、左上 的某个格点。

        综上所述,可以使用 递归算法 求解 最短路径长度。

代价矩阵法

        用一个矩阵 N 表示序列 A 和 B 的 cost(可以理解为两个序列之间的差异),矩阵的格点 N(i, j) 表示子序列 Ai 和 Bj 之间的cost。最小cost也可以通过递归算法求解,递推规则为:

         代价矩阵法的具体算法如上表所示。首先,分别对矩阵的第一行和第一列初始化;然后,从左到右、从上到下,计算矩阵中剩下的元素。整个矩阵都计算完毕后,矩阵的右下角格点值即为这两个序列之间的最小cost

 

这篇关于DTW:Dynamic Time Warping,动态时间规整的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/155762

相关文章

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法