大型数据集上R中的hclust()

大型数据集上R中的hclust(),r,hclust,R,Hclust,我正在尝试在R:hclust()中实现分层集群;这需要dist()创建一个距离矩阵,但我的数据集大约有一百万行,甚至EC2实例的内存也不足。有解决方法吗?一种可能的解决方案是对数据进行采样,对较小的样本进行聚类,然后将聚类后的样本作为k个最近邻的训练数据,并对其余数据进行“分类”。下面是一个1.1M行的快速示例。我使用了5000个点的样本。原始数据没有很好地分离,但只有1/220的数据,样本被分离。因为你的问题提到的是hclust,所以我用了它。但您可以使用其他聚类算法,如dbscan或Mean

我正在尝试在R:hclust()中实现分层集群;这需要dist()创建一个距离矩阵,但我的数据集大约有一百万行,甚至EC2实例的内存也不足。有解决方法吗?

一种可能的解决方案是对数据进行采样,对较小的样本进行聚类,然后将聚类后的样本作为k个最近邻的训练数据,并对其余数据进行“分类”。下面是一个1.1M行的快速示例。我使用了5000个点的样本。原始数据没有很好地分离,但只有1/220的数据,样本被分离。因为你的问题提到的是
hclust
,所以我用了它。但您可以使用其他聚类算法,如dbscan或Meanshift

## 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])

现在只需将所有其他点指定给最近的簇

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])

Core=which(groups)该集群对数据进行聚类,而不是进行层次聚类。正常的聚类只是将事物划分为若干组,层次聚类形成“家谱”对于所有数据,在树中为每个单独的数据点指定一个特定的位置。@Barker-是的。我同意。这不是对完整数据的分层聚类。最终结果根本不是分层聚类(或者最多是3个层次),当您剪切树时,您丢弃了组之间的所有关系,只使用前3个簇作为分类器。如果您从
hclust
中保留所有5000个组,并将其余数据分配给5000个分支中的每个分支,您可以得到一种半层次结构。然后,您可以创建一个真正的层次结构(尽管有一些潜在的错误)如果您在每个组上运行
hclust
,然后将它们连接回树中。这里最好的方法可能是使数据的子集彼此最接近(可能使用另一种聚类算法,如KNN)然后对这些子集进行分层聚类,最后在层次结构中为每个聚类分配一个位置。讨论了这一基本思想。文章中的实现在中,但大部分只是讨论思想,而不是代码。另外,请查看,以寻找更有效的分层聚类算法F