使用 dtwclust 包评估时间序列聚类中的最佳聚类数“k”
Evaluate the optimum number of clusters “k” in time-series clustering using dtwclust package
我使用以下 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”?
该错误消息表明您正在尝试搅动比可用资源支持的更多数据。在这种情况下,请尝试对较小的样本进行分析。重复分析多次。
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")
}
提供您可以检查的结果列表。
指定 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) })
我使用以下 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”?
该错误消息表明您正在尝试搅动比可用资源支持的更多数据。在这种情况下,请尝试对较小的样本进行分析。重复分析多次。
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")
}
提供您可以检查的结果列表。
指定 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) })