【问题标题】:Understanding Dynamic Time Warping了解动态时间规整
【发布时间】:2014-09-09 02:10:57
【问题描述】:

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

考虑三个具有等效列的时间序列。 moref 的长度(行)为 105,mobig 为 130,mosmall 为 100。我们希望将 mobigmosmall 投影到 105 的长度。

moref <- good_list[[2]]
mobig <- good_list[[1]]
mosmall <- good_list[[3]]

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

ali1 <- dtw(mobig, moref)
ali2 <- dtw(mosmall, moref)

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

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)

那么正是我们想要的?据我了解,我们需要使用变形函数ali1$index1ali1$index2 来缩小或扩大时间序列。但是,如果我们调用以下命令

length(ali1$index1)
length(ali2$index1)
length(ali1$index2)
length(ali2$index2)

结果是

[1] 198
[1] 162
[1] 198
[1] 162

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

【问题讨论】:

标签: r machine-learning time-series


【解决方案1】:

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

由于您没有提供任何数据。这里有一些虚拟数据可以让人们有所了解。

# 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")

这里是输出:

> 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

所以基本上,从 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))

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

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

参考:12

【讨论】:

  • 你,先生,应该得到奖章!
  • @joachim,如果您能以可能对本文未来读者有所帮助的方式分享您的最终结果。这将非常有帮助。我个人还没有看过现实生活中的应用程序,我很好奇:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2020-01-31
  • 2013-09-24
  • 2013-02-01
  • 2021-06-14
  • 2022-12-29
相关资源
最近更新 更多