2017-08-29 56 views
0

問題

我有時間序列的不同車輛的速度。我的最終目標是隨着時間的推移,根據速度的相似性對不同的車輛進行聚類。所以,我基本上需要生成一個距離矩陣,其中每個單元格包含一對車輛速度時間序列之間的距離。我想使用動態時間規整(dtw)作爲距離度量。因此,我想在每對速度時間系列上應用dtw。如何在R中的多個時間序列上應用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

+3

如果你想使用一個軟件包,優秀的'dtwclust'軟件包可以自動進行比較。 – lmo

回答

1

以下工作

通過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所有行組合和返回雙打的向量

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 
0

如果使用遞歸實現,DTW僅佔用大量內存。如果使用迭代版本實現,則只需要O(1)空間開銷。

使用變形窗寬度約束,您可以在幾分鐘(最多)內建立一個矩陣,例如300長1000個時間序列。 如果您有更多數據,請嘗試TADPOLE。

我建議你閱讀本教程

http://www.cs.unm.edu/~mueen/DTW.pdf

相關問題