Python中的多维/多变量动态时间规整(DTW)库/代码

时间:2016-05-20 14:48:32

标签: python pattern-matching time-series dynamic-programming rpy2

我正在处理时间序列数据。可用数据是多变量的。因此,对于每个时间实例,有三个数据点可用。 格式:

  

| X | Y | Z |

因此,将以实时生成上述格式的一个时间序列数据。我试图在另一个时间序列基础数据中找到这个实时生成的时间序列的良好匹配,该数据已经存储(其大小更大并且以不同的频率收集)。如果我将标准DTW分别应用于每个系列(X,Y,Z),它们最终可能会在基础数据库中的不同点获得匹配,这是不利的。所以我需要在基础数据库中找到一个点,其中所有三个组件(X,Y,Z)在同一点上匹配良好。

我已经研究过这个问题,并发现多维DTW是解决这个问题的完美解决方案。在R中,dtw包确实包含多维DTW,但我必须在Python中实现它。 R-Python桥接包即" rpy2"可能在这里可能有所帮助,但我没有R的经验。我已经查看了Python中可用的DTW包,如mlpy,dtw但没有帮助。任何人都可以使用rpy2建议Python中的包使用相同的方法或使用rpy2的多维DTW代码。

提前致谢!

3 个答案:

答案 0 :(得分:5)

谢谢@lgautier我深入挖掘并发现在Python中使用rpy2实现多变量DTW。只是将模板和查询作为2D矩阵(如R中的矩阵)传递,将允许rpy2 dtw包执行多变量DTW。此外,如果您安装了R,请加载R dtw库和"?dtw"可以访问库的文档以及库中可用的不同功能。

以供将来参考具有类似问题的其他用户: R dtw包的官方文档:https://cran.r-project.org/web/packages/dtw/dtw.pdf 示例代码,为多变量DTW传递两个二维矩阵,open_begin和open_end参数启用子序列匹配:

import numpy as np
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
from rpy2.robjects.packages import importr
import rpy2.robjects as robj

R = rpy2.robjects.r
DTW = importr('dtw')

# Generate our data
template = np.array([[1,2,3,4,5],[1,2,3,4,5]]).transpose()
rt,ct = template.shape
query = np.array([[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]]).transpose()
rq,cq = query.shape

#converting numpy matrices to R matrices
templateR=R.matrix(template,nrow=rt,ncol=ct)
queryR=R.matrix(query,nrow=rq,ncol=cq)

# Calculate the alignment vector and corresponding distance
alignment = R.dtw(templateR,queryR,keep=True, step_pattern=R.rabinerJuangStepPattern(4,"c"),open_begin=True,open_end=True)

dist = alignment.rx('distance')[0][0]

print dist

答案 1 :(得分:2)

我认为在考虑是否值得重新实现之前,尝试使用已有的任何实现方法是个好主意。

您是否尝试过以下操作?

from rpy2.robjects.packages import importr
# You'll obviously need the R package "dtw" installed with your R
dtw = importr("dtw")

# all functions and objects in the R package "dtw" are now available
# with `dtw.<function or object>`

答案 2 :(得分:0)

似乎tslearn's dtw_path()正是您想要的。引用之前链接的文档:

  

计算(可能是多维的)时间序列之间的动态时间规整(DTW)相似性度量,并返回路径和相似性。

     

[...]

     

不要求两个时间序列都具有相同的大小,但是它们必须具有相同的维数。 [...]

他们提供的实现如下:

  

H。 Sakoe,S。Chiba,“用于语音识别的动态编程算法优化”,《声学,语音和信号处理的IEEE交易》,第1卷。 》,26(1),第43-49页,1978年。