【问题标题】:Evaluate the optimum number of clusters “k” in time-series clustering using dtwclust package使用 dtwclust 包评估时间序列聚类中的最佳聚类数“k”
【发布时间】:2018-05-13 05:57:37
【问题描述】:

我使用以下 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”?

【问题讨论】:

  • 针对数据集的样本运行 cvi,例如 10,000 系列。多次执行此操作以检查稳定性。如果结果因样本而异,请引导(大约 1000 次重复)并取平均值。
  • @justin cress 你能告诉我一些代码如何做到这一点
  • @pan 类似于surfSkinSample &lt;- SURFSKINTEMP[sample(seq_along(SURFSKINTEMP), 1e4)]。在 surfSkinSample 上运行您的分析。保存结果。然后重复此操作 6 或 7 次,以查看相同数量的集群是否始终是最好的。如果您得到混合结果,请执行此过程的引导程序,将最佳聚类数的平均值作为最佳结果。
  • @lmo,在我的情况下如何执行引导
  • @pan 答案是否为您提供了所需的内容?

标签: r time-series cluster-analysis tsclust


【解决方案1】:

指定 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) })

【讨论】:

    【解决方案2】:

    错误消息表明您正在尝试搅动比可用资源支持更多的数据。在这种情况下,请尝试对较小的样本进行分析。多次重复分析。

    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")
    
    }
    

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

    【讨论】:

    • 没有 tsclust 经验,不知道如何从 CVI 的输出中获取结果,但我假设你已经处理好了。如果您对样本之间的差异量感到不舒服,请增加样本大小直到内存耗尽。
    猜你喜欢
    • 2015-07-29
    • 2018-06-07
    • 2015-03-06
    • 2012-07-22
    • 2018-05-28
    • 2020-10-08
    • 2018-10-14
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多