2016-12-06 95 views
2

我试图实现中的R层次聚类:hclust();这需要由dist()创建的距离矩阵,但我的数据集有大约一百万行,甚至EC2实例耗尽RAM。有没有解决方法?此hclust()中的R对大数据集

+0

这里最好的方法可能是使数据的子集彼此最接近(也许使用另一种聚类算法,如KNN),然后对这些子集进行分级聚类,然后最终分配每个聚类层次结构中的位置。 [这篇文章](http://stackoverflow.com/questions/9156961/hierarchical-clustering-of-1-million-objects)讨论了这个基本思想。这篇文章的实现在[tag:python]中,但大部分只是讨论想法,而不是代码。 – Barker

+0

此外,具有用于分级聚类algorythm即更高效看看['Rclusterpp'包(https://cran.r-project.org/web/packages/Rclusterpp/vignettes/Rclusterpp.pdf)。 – Barker

+0

[在聚类大距离矩阵]的可能的复制(http://stackoverflow.com/questions/34281593/large-distance-matrix-in-clustering) – Barker

回答

2

一个可能的解决方案是取样资料,群集小的样本,然后把聚集的样品训练数据k近邻和“分类”数据的其余部分。这里有一个1.1M行的简单例子。我使用了5000分的样本。原始数据没有很好的分离,但只有1/220的数据,样本是分开的。由于你的问题涉及到hclust,我使用了。但是您可以使用其他聚类算法,如dbscan或mean shift。

## Generate data 
set.seed(2017) 
x = c(rnorm(250000, 0,0.9), rnorm(350000, 4,1), rnorm(500000, -5,1.1)) 
y = c(rnorm(250000, 0,0.9), rnorm(350000, 5.5,1), rnorm(500000, 5,1.1)) 
XY = data.frame(x,y) 
Sample5K = sample(length(x), 5000)  ## Downsample 

## Cluster the sample 
DM5K = dist(XY[Sample5K,]) 
HC5K = hclust(DM5K, method="single") 
Groups = cutree(HC5K, 8) 
Groups[Groups>4] = 4 
plot(XY[Sample5K,], pch=20, col=rainbow(4, alpha=c(0.2,0.2,0.2,1))[Groups]) 

Clustered Sample

现在只要分配所有其他点到最近的集群。

Core = which(Groups<4) 
library(class) 
knnClust = knn(XY[Sample5K[Core], ], XY, Groups[Core]) 
plot(XY, pch=20, col=rainbow(3, alpha=0.1)[knnClust]) 

Full Data Clustered

几个简单的音符。

  1. 因为我所创建的数据,我知道该选择三个集群。有一个真正的问题,你将不得不做出确定适当数量的群集的工作。
  2. 取样1/220可能完全错过任何小簇。在小样本中,它们看起来像噪音。
+0

此聚类中的数据,它不这样做的层次聚类。正常聚类只是将事物划分为一组数量,层次聚类为所有数据生成一个“族谱”,为每个单独的数据点指定树中的特定位置。 – Barker

+0

@巴克 - 是的。我同意。它不是对整个数据进行分层聚类。 – G5W

+0

最终结果是不是在所有层次聚类(或者最好是3个层次结构),你扔了所有的群体之间的关系,当你砍倒,只用于前3个集群为您的分类。如果您保留了来自'hclust'的所有5000个组并将剩余的数据分配给5000个分支中的每一个,那么您可以得到一种半等级结构。然后,如果您在每个组上运行“hclust”,然后将它们挂钩回树中,则可以创建一个真正的层次结构(尽管存在一些潜在的错误)。 – Barker