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