我有一个由70,000个数值组成的数据集,表示从0到50的距离,我想聚集这些数字;然而,如果我正在尝试经典的聚类方法,那么我将不得不建立一个70,000X70,000距离矩阵,表示我的数据集中每两个数字之间的距离,这将不适合内存,所以我想知道是否有是否有任何聪明的方法来解决这个问题而无需进行分层抽样? 我还尝试了R中的bigmemory和大分析库,但仍然无法将数据放入内存
答案 0 :(得分:15)
70000并不大。它不小,但它也不是特别大......问题是矩阵导向方法的可扩展性有限。
但是有很多聚类算法不使用矩阵,不需要O(n^2)
(甚至更糟,O(n^3)
)运行时。
您可能想尝试ELKI,它具有很好的索引支持(尝试使用SortTimeRecursive批量加载的R * -tree)。索引支持使它快得多。
如果您坚持使用R,请至少尝试kmeans和fastcluster
包。 K-means具有运行时复杂度O(n*k*i)
(其中k是参数k,i是迭代次数);对于ELKI中的SLINK算法,fastcluster具有O(n)
内存和O(n^2)
运行时单链接聚类的实现。 (R“agnes”层次聚类将使用O(n^3)
运行时和O(n^2)
内存。)
实施事项。通常,R中的实现不是最好的IMHO,除了核心R,它通常至少具有竞争性的数值精度。但R是由统计人员建立的,而不是由数据挖掘者建造的。它的重点是统计表现力,而不是可扩展性。所以作者不应该受到指责。这只是大数据的错误工具。
哦,如果您的数据是1维的,请不要使用群集。使用核密度估计。 1维数据是特殊的:它是有序的。任何用于将一维数据分解为多个数据的好算法都应该利用您可以对数据进行排序。
答案 1 :(得分:5)
您可以使用通常适合此数据量的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")
答案 2 :(得分:0)
Tang等人的largeVis算法是另一种面向非矩阵的方法,至少用于可视化大数据中的集群。 (2016)。遗憾的是,由于缺少软件包维护,largeVis R软件包已在CRAN上孤立,但仍然可以通过(已安装/var/log/kube-apiserver.log
,例如,
docker logs <container-id-of-kube-apiserver>
该软件包的python版本也存在。底层算法使用分割树和近邻关系细化为每个观察值找到Rtools
个最相似的实例,然后将所得近邻关系网络投影到library(devtools)
install_github(repo = "elbamos/largeVis")
个较低维度中。它在K
中实现,并使用dim
(如果在编译时受支持)进行多处理;因此,对于我到目前为止测试过的任何更大的数据集,它已经足够快了。