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

Posted

技术标签:

【中文标题】大型数据集上的 R 中的 hclust()【英文标题】:hclust() in R on large datasets 【发布时间】:2016-12-06 06:20:49 【问题描述】:

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

【问题讨论】:

这里最好的方法可能是制作彼此最接近的数据子集(可能使用另一种聚类算法,如 KNN),然后对这些子集进行层次聚类,最后在层次结构中为每个集群分配一个位置。 This post 讨论了这个基本思想。帖子中的实现在python,但大部分只是讨论想法,而不是代码。 另外,查看Rclusterpp package 以获得更有效的层次聚类算法。 Large distance matrix in clustering的可能重复 【参考方案1】:

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

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

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

一些简短的笔记。

    因为我创建了数据,所以我知道要选择三个集群。对于一个真正的问题,您必须找出适当数量的集群。 采样 1/220 可能会完全漏掉任何小簇。在小样本中,它们看起来就像是噪音。

【讨论】:

这对数据进行聚类,它不进行层次聚类。正常的聚类只是将事物分成一定数量的组,层次聚类为所有数据创建一个“家谱”,为每个单独的数据点分配树中的特定位置。 @Barker - 是的。我同意。它不是对完整数据的层次聚类。 最终结果根本不是层次聚类(或者充其量是3的层次),当你砍树时你扔掉了组之间的所有关系,只使用了顶部分类器的 3 个集群。如果您保留来自hclust 的所有 5000 个组并将其余数据分配给 5000 个分支中的每一个,您可以获得一种半层次结构。如果你在每个组上运行hclust,然后将它们重新连接到树中,你就可以创建一个真正的层次结构(尽管有一些潜在的错误)。

以上是关于大型数据集上的 R 中的 hclust()的主要内容,如果未能解决你的问题,请参考以下文章

大型数据集上的 MongoDB 子文档查询性能

在大型数据集上使用 rpart 包

大型数据集上的核心数据获取请求缓慢

基于条件的 2 个大型数据集上的模糊模糊字符串匹配 - python

在大型数据集上删除 Postgres 中的列

Weka 中的 KNN 算法永远不会在大型数据集上完成