更新:最后,我选择用于聚类我的大型数据集的解决方案是Anony-Mousse在下面提出的解决方案.也就是说,使用ELKI的DBSCAN实现我的聚类而不是scikit-learn.它可以从命令行运行,并通过适当的索引,在几个小时内完成此任务.使用GUI和小样本数据集来计算您想要使用的选项,然后前往城镇.值得研究.Anywho,请继续阅读我原始问题的描述和一些有趣的讨论.
我有一个包含大约250万个样本的数据集,每个样本都有35个特征(浮点值),我正在尝试聚类.我一直在尝试使用scikit-learn的DBSCAN实现,使用曼哈顿距离度量和从数据中提取的一些小随机样本估计的epsilon值.到现在为止还挺好.(这里是摘录,供参考)
db = DBSCAN(eps=40, min_samples=10, metric='cityblock').fit(mydata)
Run Code Online (Sandbox Code Playgroud)
我现在的问题是我很容易耗尽内存.(我目前正在使用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 …Run Code Online (Sandbox Code Playgroud) 所以我使用以下代码片段作为更大项目的一部分,
with open(file) as fin:
rows = ( line.split() for line in fin )
d = { row[0]:row[1:] for row in rows }
Run Code Online (Sandbox Code Playgroud)
对于制表符分隔的输入,file.它在我的个人计算机上运行良好,但当我将它移动到共享计算集群时,它不喜欢第3行,d = { row[0]:row[1:] for row in rows }.我一直试图找出原因.
我唯一能想到的就是Python版本的差异.我正在运行2.7.3,共享集群运行2.6.1,但这似乎不太合理 - 我是否错过了一些非常明显的东西?我感谢你们的任何建议.
这是错误的文本(在集群上的Python 2.6.1中),
File "Alphabet.py", line 22
d = { row[0]:row[1:] for row in rows }
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud) 我正在尝试将制表符分隔的文本文件加载到python程序中.它具有以下格式,
AAAAAA 1234 5678 90AB QQQQ JKL1
BBBBBB QWER TYUI ASDF QQQQ
CCCCCC ZXCV 1234 PPPP
...
ZZZZZZ 1111
Run Code Online (Sandbox Code Playgroud)
简而言之,每行的列数可变,但总是至少两列,每行中的每列都是唯一的.我希望将第一列用作键,并将其余列加载到列表中,并使用指向它的键.我试着像其他线程中建议的那样查看csv模块,但我还没有找到让它适合我的方法.所以,是的,如果这应该更加明显,这是一个新手问题.
python ×2
csv ×1
data-mining ×1
dbscan ×1
dictionary ×1
list ×1
scikit-learn ×1
syntax ×1
syntax-error ×1