如何在 R 中的多个时间序列上应用 dtw 算法?
How to apply dtw algorithm on multiple time series in R?
问题
我有不同车辆速度的时间序列。我的最终 objective 是根据不同车辆在一段时间内速度的相似性对它们进行聚类。所以,我基本上需要生成一个距离矩阵,其中每个单元格包含一对车速时间序列之间的距离。我想使用动态时间扭曲 (dtw) 作为距离度量。因此,我想在每对速度时间序列上应用 dtw。
数据
这里有一些样本数据,每辆车只包含 8 个观测值,并且只有 3 辆车:
> dput(c)
structure(list(file.ID2 = c("Cars_03", "Cars_03", "Cars_03",
"Cars_03", "Cars_03", "Cars_03", "Cars_03", "Cars_03", "Cars_04",
"Cars_04", "Cars_04", "Cars_04", "Cars_04", "Cars_04", "Cars_04",
"Cars_04", "Cars_05", "Cars_05", "Cars_05", "Cars_05", "Cars_05",
"Cars_05", "Cars_05", "Cars_05"), speed.kph.ED = c(129.3802848,
129.4022304, 129.424176, 129.4461216, 129.4680672, 129.47904,
129.5009856, 129.5229312, 127.8770112, 127.8221472, 127.7672832,
127.7124192, 127.6575552, 127.6026912, 127.5478272, 127.4929632,
134.1095616, 134.1205344, 134.1315072, 134.1534528, 134.1644256,
134.1753984, 134.1863712, 134.197344)), row.names = c(NA, -24L
), class = c("tbl_df", "tbl", "data.frame"), .Names = c("file.ID2",
"speed.kph.ED"))
我试过的
我可以找到 一对 的 dtw::dtw()
距离,如下所示:
library(dplyr)
library(dtw)
c3 <- c %>% filter(file.ID2=="Cars_03")
c4 <- c %>% filter(file.ID2=="Cars_04")
query <- c4$speed.kph.ED
reference <- c3$speed.kph.ED
dtw_results <- dtw(x = query, y = reference)
dtw_results$distance
但我的问题是:有没有办法自动找到每对之间的dtw()$distance
并生成距离矩阵?在此示例中,它表示这些对:
Cars_03 - Cars_03
Cars_03 - Cars_04
Cars_03 - Cars_05
Cars_04 - Cars_03
Cars_04 - Cars_04
Cars_04 - Cars_05
等等
我知道 for loop
是一种方法。但由于 dtw
本身需要大量 RAM,因此 for loop
会进一步减慢该过程。还有其他选择吗?如果这是一个愚蠢的问题,我很抱歉,但我对使用 dtw
.
还很陌生
如果使用递归实现,DTW 只占用大量内存。如果使用迭代版本实现,它只需要 O(1) space 开销。
使用扭曲 window 宽度约束,您可以在几分钟内(最多)构建一个矩阵,例如 300 长度 1,000 时间序列。
如果您有更多数据,请尝试 TADPOLE。
我建议你阅读本教程
以下作品
通过file.ID2
将您的数据框拆分为列表
ds <- split(df, df$file.ID2)
使用expand.grid
来组合你的名字,file.ID2
和你的价值观
Names <- expand.grid(unique(df$file.ID2), unique(df$file.ID2))
Values <- expand.grid(ds, ds)
purrr:map_dbl
遍历 Values
和 returns 的所有行组合,双精度向量
library(dtw)
library(purrr)
Dist <- map_dbl(1:nrow(Values), ~dtw(x = Values[.x,]$Var1[[1]]$speed.kph.ED, y = Values[.x,]$Var2[[1]]$speed.kph.ED)$distance)
将答案绑定到名称
library(dplyr)
ans <- Names %>%
mutate(distance = Dist)
输出
Var1 Var2 distance
1 Cars_03 Cars_03 0.00000
2 Cars_04 Cars_03 25.66538
3 Cars_05 Cars_03 69.72117
4 Cars_03 Cars_04 25.66538
5 Cars_04 Cars_04 0.00000
6 Cars_05 Cars_04 96.00103
7 Cars_03 Cars_05 69.72117
8 Cars_04 Cars_05 96.00103
9 Cars_05 Cars_05 0.00000
问题
我有不同车辆速度的时间序列。我的最终 objective 是根据不同车辆在一段时间内速度的相似性对它们进行聚类。所以,我基本上需要生成一个距离矩阵,其中每个单元格包含一对车速时间序列之间的距离。我想使用动态时间扭曲 (dtw) 作为距离度量。因此,我想在每对速度时间序列上应用 dtw。
数据
这里有一些样本数据,每辆车只包含 8 个观测值,并且只有 3 辆车:
> dput(c)
structure(list(file.ID2 = c("Cars_03", "Cars_03", "Cars_03",
"Cars_03", "Cars_03", "Cars_03", "Cars_03", "Cars_03", "Cars_04",
"Cars_04", "Cars_04", "Cars_04", "Cars_04", "Cars_04", "Cars_04",
"Cars_04", "Cars_05", "Cars_05", "Cars_05", "Cars_05", "Cars_05",
"Cars_05", "Cars_05", "Cars_05"), speed.kph.ED = c(129.3802848,
129.4022304, 129.424176, 129.4461216, 129.4680672, 129.47904,
129.5009856, 129.5229312, 127.8770112, 127.8221472, 127.7672832,
127.7124192, 127.6575552, 127.6026912, 127.5478272, 127.4929632,
134.1095616, 134.1205344, 134.1315072, 134.1534528, 134.1644256,
134.1753984, 134.1863712, 134.197344)), row.names = c(NA, -24L
), class = c("tbl_df", "tbl", "data.frame"), .Names = c("file.ID2",
"speed.kph.ED"))
我试过的
我可以找到 一对 的 dtw::dtw()
距离,如下所示:
library(dplyr)
library(dtw)
c3 <- c %>% filter(file.ID2=="Cars_03")
c4 <- c %>% filter(file.ID2=="Cars_04")
query <- c4$speed.kph.ED
reference <- c3$speed.kph.ED
dtw_results <- dtw(x = query, y = reference)
dtw_results$distance
但我的问题是:有没有办法自动找到每对之间的dtw()$distance
并生成距离矩阵?在此示例中,它表示这些对:
Cars_03 - Cars_03
Cars_03 - Cars_04
Cars_03 - Cars_05
Cars_04 - Cars_03
Cars_04 - Cars_04
Cars_04 - Cars_05
等等
我知道 for loop
是一种方法。但由于 dtw
本身需要大量 RAM,因此 for loop
会进一步减慢该过程。还有其他选择吗?如果这是一个愚蠢的问题,我很抱歉,但我对使用 dtw
.
如果使用递归实现,DTW 只占用大量内存。如果使用迭代版本实现,它只需要 O(1) space 开销。
使用扭曲 window 宽度约束,您可以在几分钟内(最多)构建一个矩阵,例如 300 长度 1,000 时间序列。 如果您有更多数据,请尝试 TADPOLE。
我建议你阅读本教程
以下作品
通过file.ID2
ds <- split(df, df$file.ID2)
使用expand.grid
来组合你的名字,file.ID2
和你的价值观
Names <- expand.grid(unique(df$file.ID2), unique(df$file.ID2))
Values <- expand.grid(ds, ds)
purrr:map_dbl
遍历 Values
和 returns 的所有行组合,双精度向量
library(dtw)
library(purrr)
Dist <- map_dbl(1:nrow(Values), ~dtw(x = Values[.x,]$Var1[[1]]$speed.kph.ED, y = Values[.x,]$Var2[[1]]$speed.kph.ED)$distance)
将答案绑定到名称
library(dplyr)
ans <- Names %>%
mutate(distance = Dist)
输出
Var1 Var2 distance
1 Cars_03 Cars_03 0.00000
2 Cars_04 Cars_03 25.66538
3 Cars_05 Cars_03 69.72117
4 Cars_03 Cars_04 25.66538
5 Cars_04 Cars_04 0.00000
6 Cars_05 Cars_04 96.00103
7 Cars_03 Cars_05 69.72117
8 Cars_04 Cars_05 96.00103
9 Cars_05 Cars_05 0.00000