我使用Kaufman和Rousseeuw的CLARA algorithm来聚类一个大数据集,其中 N> R中的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
答案 0 :(得分:1)
我不熟悉CLARA方法,所以这个答案直接回应了你如何从CLARA绘制最佳样本的问题。&#34;
对?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")
答案 1 :(得分:1)
首先,看起来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)
一个很好的例子是,medoid样本必须始终在您选择绘制的任何索引中,否则上面的第5行不会起作用。要确保任何给定的samp
,请在上面的第2行之后添加以下内容:
samp <- union(samp, clara.x$i.med)
ADDENDUM:刚看到第一个答案,与我的不同。他建议重新计算群集。我的方法的一个好处是它保持原始的聚类计算,只调整你绘制的点。