我想计算轮廓以进行聚类评估。 R中有一些软件包,例如cluster和clValid。这是我使用集群软件包的代码:
# load the data
# a data from the UCI website with 434874 obs. and 3 variables
data <- read.csv("./data/spatial_network.txt",sep="\t",header = F)
# apply kmeans
km_res <- kmeans(data,20,iter.max = 1000,
nstart=20,algorithm="MacQueen")
# calculate silhouette
library(cluster)
sil <- silhouette(km_res$cluster, dist(data))
# plot silhouette
library(factoextra)
fviz_silhouette(sil)
该代码适用于较小的数据,例如具有50,000 obs的数据,但是当数据大小有点大时,会出现类似“错误:无法分配大小为704.5 Gb的向量”的错误。对于大型数据集的Dunn索引和其他内部索引,这可能是个问题。
我的计算机中有32GB RAM。问题来自计算dist(data)。我想知道是否可以不预先计算dist(data),并在轮廓公式中需要时计算相应的距离。
感谢您在此问题上的帮助,以及如何为大型和超大型数据集计算轮廓。
答案 0 :(得分:2)
您可以自己实现Silhouette。
它只需要每个距离两倍,因此不需要存储整个距离矩阵。由于它可以计算两次距离,因此它的运行速度可能会稍慢一些,但同时更好的内存效率可以弥补这一点。
虽然仍然需要很长时间。
您应该考虑只使用一个子样本(您真的需要考虑所有所有点吗?)以及诸如Simplified Silhouette(尤其是KMeans)之类的替代方案……您只会获得很少的收益有关此类方法的更多数据。因此,您可以只使用一个子样本。
答案 1 :(得分:0)
Anony-Mousse答案是完美的,尤其是二次采样。由于计算成本的增加,这对于非常大的数据集非常重要。
这是使用clusterCrit的R包来计算轮廓和Dunn索引等内部度量的另一种解决方案。 clusterCrit用于计算聚类验证指标,该指标不需要事先整个距离矩阵。但是,正如Anony-Mousse所讨论的那样,它可能很慢。请参阅以下链接,获取有关clusterCrit的文档: https://www.rdocumentation.org/packages/clusterCrit/versions/1.2.8/topics/intCriteria
clusterCrit还会计算用于群集验证的大多数内部度量。
示例:
intCriteria(data,km_res$cluster,c("Silhouette","Calinski_Harabasz","Dunn"))
答案 2 :(得分:0)
如果可以在不使用距离矩阵的情况下计算Silhouette索引,或者可以使用clues程序包,从而优化时间和群集程序包使用的内存。这是一个示例:
library(rbenchmark)
library(cluster)
library(clues)
set.seed(123)
x = c(rnorm(1000,0,0.9), rnorm(1000,4,1), rnorm(1000,-5,1))
y = c(rnorm(1000,0,0.9), rnorm(1000,6,1), rnorm(1000, 5,1))
cluster = rep(as.factor(1:3),each = 1000)
df <- cbind(x,y)
head(df)
x y
[1,] -0.50442808 -0.13527673
[2,] -0.20715974 -0.29498142
[3,] 1.40283748 -1.30334876
[4,] 0.06345755 -0.62755613
[5,] 0.11635896 2.33864121
[6,] 1.54355849 -0.03367351
两个功能之间的运行时比较
benchmark(f1 = silhouette(as.integer(cluster), dist = dist(df)),
f2 = get_Silhouette(y = df, mem = cluster))
test replications elapsed relative user.self sys.self user.child sys.child
1 f1 100 15.16 1.902 13.00 1.64 NA NA
2 f2 100 7.97 1.000 7.76 0.00 NA NA
两个函数之间的内存使用情况比较
library(pryr)
object_size(silhouette(as.integer(cluster), dist = dist(df)))
73.9 kB
object_size(get_Silhouette(y = df, mem = cluster))
36.6 kB
结论clues::get_Silhouette
减少了相同的时间和内存。