了解动态时间扭曲

Joa*_*him 2 r machine-learning time-series

我们想使用R的dtw库,以便将某些时间序列数据缩小和扩展到标准长度。

考虑具有等效列的三个时间序列。moref是长度(行)的105,mobig是130和mosmall100。我们希望项目mobig和mosmall以105的长度。

moref <- good_list[[2]]
mobig <- good_list[[1]]
mosmall <- good_list[[3]]
Run Code Online (Sandbox Code Playgroud)

因此,我们计算两个对齐。

ali1 <- dtw(mobig, moref)
ali2 <- dtw(mosmall, moref)
Run Code Online (Sandbox Code Playgroud)

如果我们打印出对齐结果是:

DTW alignment object
 Alignment size (query x reference): 130 x 105
 Call: dtw(x = mobig, y = moref)
DTW alignment object
 Alignment size (query x reference): 100 x 105
 Call: dtw(x = mosmall, y = moref)
Run Code Online (Sandbox Code Playgroud)

那么我们到底想要什么?根据我的理解,我们需要使用扭曲函数ali1$index1或ali1$index2为了缩小或扩大时间序列。但是,如果我们调用以下命令

length(ali1$index1)
length(ali2$index1)
length(ali1$index2)
length(ali2$index2)
Run Code Online (Sandbox Code Playgroud)

结果是

[1] 198
[1] 162
[1] 198
[1] 162
Run Code Online (Sandbox Code Playgroud)

这些是带有索引的向量(可能是指其他向量)。我们可以使用其中的哪一个进行映射?是不是都太长了?

B.M*_*.W. 5

首先,我们需要同意index1和index2是两个长度相同的向量,将查询/输入数据映射到引用/存储数据,反之亦然。

因为你没有给出任何数据。这里有一些虚拟数据给人们一个想法。

# Reference data is the template that we use as reference. 
# say perfect pronunciation from CNN
data_reference <- 1:10
# Query data is the input data that we want to map to our reference
# say random youtube audio 
data_query <- seq(1,10,0.5) + rnorm(19)
library(dtw)
alignment <- dtw(x=data_query, y=data_reference, keep=TRUE)
alignment$index1
alignment$index2
lcm <- alignment$costMatrix
image(x=1:nrow(lcm), y=1:ncol(lcm), lcm)
plot(alignment, type="threeway")
Run Code Online (Sandbox Code Playgroud)

以下是输出:

在此处输入图片说明 在此处输入图片说明

> alignment$index1
 [1]  1  2  3  4  5  6  7  7  8  9 10 11 12 13 13 14 14 15 16 17 18 19
> alignment$index2
 [1]  1  1  1  2  2  3  3  4  5  6  6  6  6  6  7  8  9  9  9  9 10 10
Run Code Online (Sandbox Code Playgroud)

所以基本上,从 index1 到 index2 的映射就是如何将输入数据映射到参考数据。

即输入数据的第 10 个数据点已与模板中的第 6 个数据点匹配。

index1:查询的变形函数?x(k)

index2:参考的翘曲函数?y(k)

——托尼·乔尔吉诺

根据您的问题,“索引长度的处理是什么”,因为它基本上是最佳路径的坐标,所以它可能与m+n(非常浅)或min(m,n)(完美对角线)一样长。显然,它不是一对一的映射,这可能会让人们有点困扰,我想你可以从这里做更多的研究,如何选择你想要的映射。


我不知道是否有一些内置函数功能可以选择最佳的一对一映射。但这是一种方法。

library(plyr)
mapping <- data.frame(index1=alignment$index1, index2=alignment$index2) 
mapping <- ddply(mapping, .(index1), summarize, index2_new = max(index2))
Run Code Online (Sandbox Code Playgroud)

现在映射包含从查询到引用的一对一映射。然后您可以将查询映射到参考并以您想要的任何方式缩放映射的输入。

我不太确定该行下方的内容,非常欢迎任何人对映射和缩放的工作方式进行任何改进。

参考文献:1 , 2