R中大数据的轮廓计算

Sam*_* S. 3 memory r cluster-analysis k-means silhouette

我想计算聚类评估的轮廓。R中有一些包,例如cluster和clValid。这是我使用 cluster 包的代码:

# 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)
Run Code Online (Sandbox Code Playgroud)

该代码适用于较小的数据,例如具有 50,000 个 obs 的数据,但是当数据大小有点大时,我会收到类似“错误:无法分配大小为 704.5 Gb 的向量”的错误。对于 Dunn 索引和大型数据集的其他内部索引来说,这可能会出现问题。

我的电脑有 32GB RAM。问题来自于计算 dist(data)。我想知道是否可以不提前计算dist(data),并在轮廓公式需要时计算相应的距离。

我感谢您对这个问题以及如何计算大型和超大型数据集的轮廓的帮助。

Ano*_*sse 6

您可以自己实现 Silhouette。

它只需要每个距离两次,因此不需要存储整个距离矩阵。它的运行速度可能会慢一些,因为它计算距离两次,但同时更好的内存效率可以很好地弥补这一点。

但这仍然需要很长时间。

您应该考虑仅使用子样本(您真的需要考虑所有点吗?)以及诸如简化轮廓之类的替代方案,特别是使用 KMeans...您只能通过此类方法获得很少的额外数据。所以你可以只使用子样本。

  • 对于子样本,我添加了 ind_ss &lt;-sample(1:nrow(data),50000) 并在 sil &lt;- Silhouette(km_res$cluster[ind_ss], dist(data[ind_ss,])) 中使用了这些索引。看来,它有效并且足够接近实际的轮廓值。 (2认同)