更新: 最终,我选择使用Anony-Mousse在下面建议的一种方法来对我的大型数据集进行聚类。即,使用ELKI的DBSCAN实现而不是scikit-learn的。它可以从命令行运行,并且在适当的索引下,可以在几小时内完成此任务。使用GUI和小样本数据集来确定要使用的选项,然后开始工作。值得一看。无论如何,继续阅读以了解我最初的问题描述和一些有趣的讨论。
我有一个包含约250万个样本的数据集,每个样本具有35个特征(浮点数值),我正在尝试对其进行聚类。我一直在使用scikit-learn的DBSCAN实现,使用曼哈顿距离度量和从数据中随机抽取的一些小样本估计的epsilon值来尝试聚类。到目前为止,一切顺利。(以下是参考代码)
db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)
我目前的问题是我的电脑内存很容易不够用。(我使用的机器有16GB的RAM)
我的问题是,DBSCAN是否在运行时实时计算成对距离矩阵,导致内存被耗尽?(2.5万^ 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