0

最近我开始尝试 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)
    
4

0 回答 0