如何在 R 中为大型数据集创建聚类图

How create cluster plots for large datasets in R

我使用 Kaufman 和 Rousseeuw 的 CLARA algorithm 在 R 中对 N > 8*10^6 的大型数据集进行聚类。算法本身的实现允许用户通过例如控制执行时间将样本大小限制为 n=100.

然而,在 R 中使用 plot() 函数似乎将所有数据对象包含在绘图中,这会导致处理时间非常长且绘图非常拥挤(请参见下面的可重现示例)。

理论上应该可以只绘制 CLARA 中的最佳样本而不是 N。是否有针对此的实现或我该如何解决此问题?

## generate 2.5 mio objects, divided into 2 clusters.
x <- rbind(cbind(rnorm(10^6,0,0.5), rnorm(10^6,0,0.5)),
           cbind(rnorm(1.5*10^6,5,0.5), rnorm(1.5*10^6,5,0.5)))

library("cluster")
# get clusters solution
clara.x<-clara(x,k=2,sampsize = 100)
# see medoids
clara.x$medoids

# plot the cluster solution
plot(clara.x) # takes long time. creates crowded plot
clusplot(clara.x) # did not finish

我不熟悉 CLARA 方法,所以这个答案直接回答了你关于如何 "plot the best sample from CLARA."

快速查看 ?clara.object 表明在 sample 组件中找到了最终分区中使用的样本的案例编号,因此您可以通过

恢复观察结果
best_samp <- x[clara.x$sample, ]

输出:

par(mfrow = c(1, 2))
plot(best_samp, main = "scatterplot")
clusplot(clara(best_samp, k = 2, sampsize = nrow(best_samp)),
  main = "clusplot")

首先,clara 对象的 plot() 似乎给出了两个图,第一个与 clusplot() 返回的相同。如果前者完成而后者没有,我猜那只是因为你在堵塞剧情历史。如果将大图保存为 png,则不会 运行 遇到此问题。他们仍然需要一段时间,但不会干扰您正在做的任何其他事情。

关于减少绘制点的数量,我们可以通过调整clara.x的列表元素来手动完成。您只需选择要绘制的点。下面,我举一个例子,我只使用 clara 方法中的样本。但是如果你想绘制更多,你可以选择 sample() 或其他东西:

# Manually shrinking clara object
samp <- clara.x$sample
clara.x$data <- clara.x$data[samp, ]
clara.x$clustering <- clara.x$clustering[samp]
clara.x$i.med <- match(clara.x$i.med, samp) # point medoid indx to samp

# plot the cluster solution
clusplot(clara.x)

一个微妙之处是中心点样本必须始终位于您选择绘制的任何索引中,否则上面的第 5 行将不起作用。为了确保对于任何给定的 samp,在上面第二行之后添加以下内容:

samp <- union(samp, clara.x$i.med)

附录: 刚刚看到第一个答案,与我的不同。他建议重新计算聚类。我的方法的一个好处是它保持了原始的聚类计算并且只调整你绘制的点。