我一直在尝试聚集一些更大的数据集。由50000个尺寸为7的测量矢量组成。我正在尝试生成大约30到300个簇以供进一步处理。
我一直在尝试以下群集实现而没有运气:
我可能会错过任何其他实现吗?
答案 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