可能带有python绑定的大规模集群库

时间:2012-06-18 23:42:18

标签: python data-mining cluster-analysis

我一直在尝试聚集一些更大的数据集。由50000个尺寸为7的测量矢量组成。我正在尝试生成大约30到300个簇以供进一步处理。

我一直在尝试以下群集实现而没有运气:

  • Pycluster.kcluster(在我的数据集上只提供1-2个非空簇)
  • scipy.cluster.hierarchy.fclusterdata(运行时间过长)
  • scipy.cluster.vq.kmeans(内存不足)
  • sklearn.cluster.hierarchical.Ward(运行时间过长)

我可能会错过任何其他实现吗?

5 个答案:

答案 0 :(得分:9)

50000个实例和7个维度并不是很大,不应该杀死实现。

虽然它没有python绑定,但试试ELKI。他们在主页上使用的基准设置是8个维度的110250个实例,它们在60秒内显示k-means,在350秒内显示更高级的OPTICS。

避免层次聚类。它实际上只适用于小型数据集。它通常在矩阵运算上实现的方式是O(n^3),对于大型数据集来说真的不好。所以我对你这两个超时时间并不感到惊讶。

使用索引支持实现时,DBSCAN和OPTICS为O(n log n)。天真地实施时,它们在O(n^2)。 K-means非常快,但结果往往不尽如人意(因为它总是在中间分裂)。它应该在O(n * k * iter)中运行,这通常会在不太多的迭代中收敛(iter<<100)。但它只适用于欧几里德距离,并且对某些数据(高维,离散,二进制,不同大小的簇,......)效果不佳。

答案 1 :(得分:6)

由于您已经尝试了scikit-learn:sklearn.cluster.KMeans应该比Ward更好地扩展,并且支持在多核计算机上进行并行拟合。 MiniBatchKMeans更好,但不会随意重启。

>>> from sklearn.cluster import MiniBatchKMeans
>>> X = np.random.randn(50000, 7)
>>> %timeit MiniBatchKMeans(30).fit(X)
1 loops, best of 3: 114 ms per loop

答案 2 :(得分:3)

我的包milk很容易处理这个问题:

import milk
import numpy as np
data = np.random.rand(50000,7)
%timeit milk.kmeans(data, 300)
1 loops, best of 3: 14.3 s per loop

我想知道你是否打算写500,000个数据点,因为50k点不是那么多。如果是这样,牛奶需要更长的时间(约700秒),但仍然可以很好地处理它,因为它不会分配除数据和质心之外的任何内存。

答案 3 :(得分:0)

OpenCV有一个k-means实现,Kmeans2

预计的运行时间大约是O(n**4) - 对于一个数量级的近似值,看看需要多长时间才能对1000个点进行聚类,然后将其乘以七百万(50 ** 4四舍五入)

答案 4 :(得分:0)

对于实际大规模情况的真正答案是使用诸如 FAISS 之类的东西,Facebook Research 的库用于有效的相似性搜索和密集向量的聚类。

https://github.com/facebookresearch/faiss/wiki/Faiss-building-blocks:-clustering,-PCA,-quantization