使用dtwclust软件包评估时间序列聚类中的最佳簇“k”

时间:2017-11-29 13:41:24

标签: r time-series cluster-analysis tsclust

我使用以下tsclust语句来聚类数据

SURFSKINTEMP_CLUST <- tsclust(SURFSKINTEMP, k = 10L:20L,
                       distance = "dtw_basic", centroid = "dba",
                       trace = TRUE, seed = 938,
                       norm = "L2", window.size = 2L,
                       args = tsclust_args(cent = list(trace = TRUE)))

SURFSKINTEMP非常大,

str(SURFSKINTEMP)
List of 327239
 $ V1     : num [1:7] 0.13 0.631 -0.178 0.731 0.86 ...
 $ V2     : num [1:6] 0.117 -0.693 -0.911 -0.911 -0.781 ...
 $ V3     : num [1:7] 0.117 -0.693 -0.911 -0.911 -0.781 ...
 $ V4     : num [1:6] -0.693 -0.911 -0.911 -0.781 -0.604 ...

然后,我想用cvi来评估最佳簇数“k”

names(SURFSKINTEMP_CLUST) <- paste0("k_",10L:20L)
sapply(SURFSKINTEMP_CLUST, cvi, type = "internal")

但是,有错误

> sapply(SURFSKINTEMP_CLUST, cvi, type = "internal")
Error: cannot allocate vector of size 797.8 Gb

在我的情况下,如何评估群集“k”的最佳数量?

2 个答案:

答案 0 :(得分:0)

错误消息表明您尝试流失的数据超过可用资源支持的数据量。在这些情况下,尝试对较小的样本进行分析。多次重复分析。

reps = 1000
samp_size = 10000
result <- c()
for(j in 1:reps){
    sample = SURFSKINTEMP[sample(seq_along(SURFSKINTEMP, samp_size)),]
    sample_clust <- tsclust(SURFSKINTEMP, k = 10L:20L,
                   distance = "dtw_basic", centroid = "dba",
                   trace = TRUE, seed = 938,
                   norm = "L2", window.size = 2L,
                   args = tsclust_args(cent = list(trace = TRUE)))

    result[j] <- sapply(sample_clust, cvi, type = "internal")

}

提供您可以检查的结果列表。

答案 1 :(得分:0)

指定type = "internal"将尝试计算7个指数:Silhouette,Dunn,COP,DB,DB *,CH和SF。正如cvi的文档中所提到的,前3个将尝试计算整个跨距矩阵,在您的情况下将是327,239 x 327,239矩阵;您将很难找到可以分配该计算机的计算机,并且需要时间进行计算。

由于您使用DBA作为质心,您可以看到DB或DB *对您的应用程序是否有意义

sapply(SURFSKINTEMP_CLUST, cvi, type = c("DB", "DBstar"))

你还可以看一下有点简单的elbow method,你可以计算平方误差之和(SSE)(参见TSClusters-class的文档):

sapply(SURFSKINTEMP_CLUST, function(cl) { sum(cl@cldist ^ 2) })