最近我开始尝试 dtw 时间序列聚类,以找到更好的数据分区作为全局时间序列预测模型的输入。
由于我对这项技术也很陌生,因此将不胜感激一些提示和建议。
我的第一个问题是,找到最佳集群数量的最佳解决方案是什么。
我确实在我第一次尝试聚类时间序列时写了一个代表。在这种情况下,您可以从图中猜测 k 的数量,它应该是 2。
到目前为止,一切都很好。我只是不明白,为什么将第 4 个系列添加到具有系列 1 和 2 的集群中,它们几乎是直线。DTW 应该基于形状而不是时间序列的体积。
#### LIBS
suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(dtwclust))
suppressPackageStartupMessages(library(lubridate))
#### INPUT
V = 365
sim1 = as.vector(arima.sim(n = 365, list(ar = c(0.8897, -0.4858), ma = c(-0.12, 0.29)),
sd = sqrt(0.21)))
sim2 = as.vector(arima.sim(n = 365, list(ar = c(0.8897, -0.4858), ma = c(-0.2279, 0.2488)),
sd = sqrt(0.1796)))
data <- data.frame (Store = c(rep("1",365),rep("2",365),rep("3",365),rep("4",365),
rep("5",365),rep("6",365)),
Sales = c(seq( 1, 44, length.out = 365),seq( 5, 33, length.out = 365),
rnorm(V)+5,rnorm(V)/2+13, sim1, sim2),
Date = c(dates <- ymd("2013-01-01")+ days(0:364)))
# transform
df <- data[,c(1,2)]
df <- df %>% group_by(Store) %>%
mutate(row = row_number()) %>%
pivot_wider(names_from = Store, values_from = Sales) %>%
select(-row)
df.labels <- colnames(df)
df_t <- t(df)
#### DETERMINE K
cfg <- compare_clusterings_configs(
types = c("h"),
k = 2L:5L,
controls = list(
hierarchical = hierarchical_control(method = "complete")
),
#preprocs = pdc_configs("preproc", none = list()),
distances = pdc_configs("distance", dtw_basic = list()),
centroids = pdc_configs("centroid", dba = list())
)
evaluator <- cvi_evaluators("Sil")
comparison <- compare_clusterings(df_t, "h", cfg,
score.clus = evaluator$score,
pick.clus = evaluator$pick)
# make clusters
hclust <- repeat_clustering(df_t, comparison, comparison$pick$config_id)
resulting_clust <- data.frame(Store = df.labels, dtwclust = hclust@cluster)
# ts plot
ggplot(data,aes(x=Date,y=Sales,colour=Store,group=Store)) + geom_line()
# dendrogram
plot(hclust)