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

时间:2016-12-06 06:20:50

标签: r hclust

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

1 个答案:

答案 0 :(得分:4)

一种可能的解决方案是对数据进行采样,对较小的样本进行聚类,然后将聚类样本视为k Nearest Neighbors的训练数据,并对其余数据进行“分类”。这是一个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可能完全错过任何小型集群。在小样本中,它们看起来就像是噪音。