2017-08-29 18 views
0

問題

私はさまざまな車の速度の時系列を持っています。私の究極の目的は、時間の経過とともにスピードの類似点に基づいて異なる車両をクラスター化することです。だから、私は基本的に、各セルが一対の車速時系列の間の距離を含む距離行列を生成する必要があります。ダイナミックタイムワーピング(dtw)を距離メトリックとして使用したいと思います。したがって、速度タイムシリーズの各ペアにdtwを適用したいと考えています。Rの複数の時系列にdtwアルゴリズムを適用するには?

データ

にここでは、車1台のみ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")) 

私は1ペアの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_04
Cars_03 - Cars_05
Cars_04 - Cars_03
Cars_04 - Cars_04
Cars_04 - Cars_05
など

Cars_03:この例では、これらの対を意味します私はfor loopがこれを行う方法の一つであることを知っています。しかし、dtw自体が多くのRAMを必要とするので、for loopはプロセスをさらに遅くする可能性があります。他の選択肢はありますか?これが愚かな質問であれば申し訳ありませんが、私はdtwを使うのがとても新しいです。

+3

パッケージを使いたい場合、優れた 'dtwclust'パッケージはこの比較を自動化します。 – lmo

答えて

1

このチュートリアルを読んで、以下の提案

はあなたのすべての組み合わせを作るために使用expand.gridfile.ID2

ds <- split(df, df$file.ID2) 

してリストにあなたのデータフレームを分割する作品名前、file.ID2とあなたの値

回の
Names <- expand.grid(unique(df$file.ID2), unique(df$file.ID2)) 
Values <- expand.grid(ds, ds) 

purrr:map_dblValuesの全ての行の組み合わせを反復および名前

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 

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) 

バインド応答倍のベクトルを返します

0

DTWは、再帰で実装されている場合にのみ、多くのメモリを消費します。反復バージョンで実装されている場合は、O(1)のスペースオーバーヘッドしか必要ありません。

ワーピングウィンドウの幅の制約を使用すると、300分の長さの1000時系列を数分(最大でも)作成できます。 さらにデータがある場合は、TADPOLEを試してください。私はあなたが

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

関連する問題