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

标签 r hclust

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

最佳答案

一种可能的解决方案是对数据进行采样,对较小的样本进行聚类,然后将聚类后的样本视为 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])

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/220 可能会完全错过任何小集群。在小样本中,它们看起来就像噪音。
  • 关于r - 大型数据集上的 R 中的 hclust(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40989003/

    相关文章:

    r - geom_points 的选择性抖动

    r - 将树状图导出为 R 中的表格

    r - 如何从R中的集群创建newick文件?

    r - 将聚类结果叠加到排序上

    r - 实时,自动更新,R中的增量图

    r - 曲线上部加粗

    r - 创建具有 200 行且无列的空数据框

    r - 从 Hmisc 包中的 latex() 创建的表水平左对齐,而不是在 pdf 文档中水平居中

    r - 如何在 R 中打印 hclust 对象的行?