在R中聚类非常大的数据集
Posted
技术标签:
【中文标题】在R中聚类非常大的数据集【英文标题】:clustering very large dataset in R 【发布时间】:2014-03-25 22:46:42 【问题描述】:我有一个由 70,000 个数值组成的数据集,表示从 0 到 50 的距离,我想对这些数字进行聚类;但是,如果我正在尝试经典的聚类方法,那么我将不得不建立一个 70,000X70,000 距离矩阵,表示我的数据集中每两个数字之间的距离,这不适合内存,所以我想知道是否有有什么聪明的方法可以解决这个问题而无需进行分层抽样? 我还尝试了 R 中的 bigmemory 和大型分析库,但仍然无法将数据放入内存中
【问题讨论】:
this solution(使用cluster::clara
)是否相关/有用?
不是真正引起问题的是距离矩阵太大而无法放入任何内存
【参考方案1】:
另一个非面向矩阵的方法,至少用于可视化大数据中的集群,是 Tang 等人的 largeVis 算法。 (2016 年)。不幸的是,由于缺少包维护,largeVis R 包在 CRAN 上被孤立了,但是(维护的?)版本仍然可以通过(已安装 Rtools
)从其 gitHub 存储库编译,例如,
library(devtools)
install_github(repo = "elbamos/largeVis")
该软件包的 python 版本也存在。底层算法使用分割树和邻域细化来为每个观察找到K
最相似的实例,然后将生成的邻域网络投影到dim
较低维度。它在C++
中实现,并使用OpenMP
(如果在编译时支持)进行多处理;因此,它已经足够快地对我迄今为止测试过的任何更大的数据集进行聚类。
【讨论】:
【参考方案2】:70000 并不大。它不小,但也不是特别大......问题是面向矩阵方法的可扩展性有限。
但是有很多聚类算法不使用矩阵,也不需要O(n^2)
(或者更糟的是O(n^3)
)运行时。
您可能想尝试ELKI,它具有出色的索引支持(尝试使用 SortTimeRecursive 批量加载的 R*-tree)。索引支持让它快很多很多。
如果您坚持使用 R,请至少尝试一下 kmeans 和 fastcluster
包。 K-means的运行时复杂度O(n*k*i)
(其中k是参数k,i是迭代次数); fastcluster 具有O(n)
内存和O(n^2)
运行时实现的单链接聚类,可与 ELKI 中的 SLINK 算法相媲美。 (R“agnes”层次聚类将使用O(n^3)
运行时和O(n^2)
内存)。
实施很重要。通常,R 中的实现并不是最好的恕我直言,除了核心 R 通常至少具有具有竞争力的数值精度。但是 R 是由统计学家而不是数据挖掘者构建的。它的重点是统计表现力,而不是可扩展性。所以作者不应该受到责备。它只是处理大数据的错误工具。
哦,如果您的数据是一维的,则根本不要使用聚类。使用核密度估计。一维数据很特殊:它是有序的。任何将一维数据分解为整数的好算法都应该利用您可以对数据进行排序。
【讨论】:
【参考方案3】:您可以使用kmeans
,通常适合这种数据量,计算重要的中心数量(1000、2000、...),并对这些中心的坐标进行层次聚类方法。像这样距离矩阵会更小。
## Example
# Data
x <- rbind(matrix(rnorm(70000, sd = 0.3), ncol = 2),
matrix(rnorm(70000, mean = 1, sd = 0.3), ncol = 2))
colnames(x) <- c("x", "y")
# CAH without kmeans : dont work necessarily
library(FactoMineR)
cah.test <- HCPC(x, graph=FALSE, nb.clust=-1)
# CAH with kmeans : work quickly
cl <- kmeans(x, 1000, iter.max=20)
cah <- HCPC(cl$centers, graph=FALSE, nb.clust=-1)
plot.HCPC(cah, choice="tree")
【讨论】:
使用您的方法并在运行cah <- HCPC(cl$centers, graph=FALSE, nb.clust=-1)
后出现此错误:Error in catdes(data.clust, ncol(data.clust), proba = proba, row.w = res.sauv$call$row.w.init) : object 'data.clust' not found
以上是关于在R中聚类非常大的数据集的主要内容,如果未能解决你的问题,请参考以下文章