更新:最后,我选择用于对大型数据集进行聚类的解决方案是下面 Anony-Mousse 建议的解决方案。也就是说,使用 ELKI 的 DBSCAN 实现我的聚类而不是 scikit-learn 的。它可以从命令行运行,并通过适当的索引,在几个小时内执行此任务。使用 GUI 和小样本数据集来制定您想要使用的选项,然后前往城镇。值得研究。任何人,请继续阅读我最初的问题的描述和一些有趣的讨论。
我有一个包含约 250 万个样本的数据集,每个样本都有 35 个要聚类的特征(浮点值)。我一直在尝试使用 scikit-learn 的 DBSCAN 实现来做到这一点,使用曼哈顿距离度量和从数据中抽取的一些小随机样本估计的 epsilon 值。到现在为止还挺好。(这里是片段,供参考)
db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)
我目前的问题是我很容易耗尽内存。(我目前正在使用 16 GB RAM 的机器)
我的问题是,DBSCAN 是否在运行时即时计算成对距离矩阵,这就是吞噬我记忆的原因?(250 万 ^ 2) * 8 字节显然大到愚蠢,我会理解的。我不应该使用这种fit()
方法吗?更一般地说,有没有办法解决这个问题,或者我通常在这里吠叫错误的树?
如果答案很明显,请道歉。这几天我一直在纠结这个问题。谢谢!
fit(X)
附录:另外,如果有人能更明确地向我解释和之间的区别,fit_predict(X)
我也会很感激——恐怕我不太明白。
附录#2:可以肯定的是,我只是在一台有大约 550 GB RAM 的机器上尝试过这个,但它仍然爆炸了,所以我觉得 DBSCAN 可能正在尝试制作一个成对距离矩阵或者我显然不想要的东西去做。我想现在最大的问题是如何阻止这种行为,或者找到其他可能更适合我需要的方法。谢谢你在这里陪我。
附录#3(!):我忘了附上回溯,在这里,
Traceback (most recent call last):
File "tDBSCAN.py", line 34, in <module>
db = DBSCAN(eps=float(sys.argv[2]), min_samples=10, metric='cityblock').fit(mydata)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/base.py", line 329, in fit_predict
self.fit(X)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 186, in fit
**self.get_params())
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/cluster/dbscan_.py", line 69, in dbscan
D = pairwise_distances(X, metric=metric)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 651, in pairwise_distances
return func(X, Y, **kwds)
File "/home/jtownsend/.local/lib/python2.6/site-packages/sklearn/metrics/pairwise.py", line 237, in manhattan_distances
D = np.abs(X[:, np.newaxis, :] - Y[np.newaxis, :, :])
MemoryError