大数据集上R中的hclust()

May*_*nk 4 r hclust

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

G5W*_*G5W 5

一种可能的解决方案是对数据进行采样,对较小的样本进行聚类,然后将聚类的样本视为k个最近邻居的训练数据,并对其余数据进行“分类”。这是一个110万行的简单示例。我使用了5000分的样本。原始数据没有很好地分离,但是只有1/220的数据可以分离样品。既然提到了您的问题hclust,我就使用了。但是您可以使用其他集群算法,例如dbscan或均值偏移。

## 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])
Run Code Online (Sandbox Code Playgroud)

聚类样本

现在,只需将所有其他点分配给最近的群集。

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])
Run Code Online (Sandbox Code Playgroud)

全数据集群

一些快速笔记。

  1. 因为创建了数据,所以我知道选择三个群集。遇到真正的问题时,您将不得不找出适当数量的集群。
  2. 采样1/220可能会完全错过任何小的簇。在小样本中,它们看起来就像是噪音。

  • 这对数据进行了聚类,它不进行层次聚类。普通聚类只是将事物分成一定数量的组,层次聚类为所有数据制作了一个“家谱”,将每个单独的数据点分配到树中的特定位置。 (2认同)
  • 最终结果根本不是层次聚类(或者最多是 3 的层次结构),你在切割树时抛弃了组之间的所有关系,只使用前 3 个聚类作为分类器。如果您将所有 5000 个组从 `hclust` 中保留,并将其余数据分配给 5000 个分支中的每一个,则您可以获得一种半层次结构。然后,如果您在每个组上运行 `hclust`,然后将它们重新连接到树中,您就可以创建一个真正的层次结构(尽管有一些潜在的错误)。 (2认同)