2

proxy::distカスタム距離行列で関数を使用しようとしていますが、現在持っているものは非常に遅いです。

これは、カスタム関数を呼び出す方法の再現可能な例です。

set.seed(1)
test <- matrix(runif(4200), 60, 70)
train <- matrix(runif(4200), 60, 70)
dMatrix <- proxy::dist(x = test, y = train, method = customDTW,
                     by_rows = T, 
                     auto_convert_data_frames = T)

testこれは、マトリックス内の各時系列とマトリックス内のすべての時系列の間の距離を計算することになっていますtrain(各行は時系列です)。

私のカスタム関数は次のとおりです。

customDTW <- function(ts1, ts2){

  d <- dtw(ts1, ts2,
      dist.method = "Euclidean",
      window.type = "sakoechiba",
      window.size = 20
  )
  return(d$distance)
}

問題は、 を使用した場合や、自分で距離行列を計算した場合に比べてmethod="DTW"も、非常に遅く、時系列の長さや数が増えるにつれて指数関数的に遅くなることです。もちろん、これはネストされたループに根ざしていますが、その効果の規模に驚かされます。見えないのには別の理由があるはずです。

私の質問はcustomDTW、それを高速化するために他にどのように実装できるかということproxy::distです。


これは、実行時間に関する私の小さな実験です。

の実行時間60X7( proxy::dist+を使用customDTW)

user  system elapsed 
2.852   0.012   2.867

の実行時間60X70( proxy::dist+を使用customDTW)

user  system elapsed 
5.384   0.000   5.382 

の実行時間60X700( proxy::dist+を使用customDTW)

user  system elapsed 
509.088  18.652 529.115

60X700(を使用せずにproxy::dist)の実行時間

user  system elapsed 
26.696   0.004  26.753
4

3 に答える 3