当我运行scikit的dbscan算法时,我遇到了内存错误。 我的数据大约是20000 * 10000,它是一个二进制矩阵。
(也许它不适合使用DBSCAN这样的矩阵。我是机器学习的初学者。我只是想找到一个不需要初始簇号的簇方法)
无论如何,我发现scikit的稀疏矩阵和特征提取。
http://scikit-learn.org/dev/modules/feature_extraction.html http://docs.scipy.org/doc/scipy/reference/sparse.html
但我仍然不知道如何使用它。在DBSCAN的规范中,没有关于使用稀疏矩阵的指示。是不允许的?
如果有人知道如何在DBSCAN中使用稀疏矩阵,请告诉我。 或者你可以告诉我一个更合适的聚类方法。
答案 0 :(得分:7)
不幸的是,DBSCAN的scikit
实现非常天真。需要重写它以考虑索引(球树等)。
截至目前,它显然会坚持计算一个完整的距离矩阵,这会浪费很多的内存。
我建议您自己重新实施DBSCAN。它相当容易,存在良好的伪代码,例如在维基百科和原始出版物中。它应该只是几行,然后您可以轻松地利用您的数据表示。例如。如果你已经在稀疏表示中有一个相似性图表,那么进行“范围查询”(即只使用满足距离阈值的边缘)通常是相当简单的。
这是一个issue in scikit-learn github,他们谈论改进实施。用户使用ball-tree报告他的版本速度提高了50倍(这并不让我感到惊讶,我之前看到过与索引类似的加速 - 当进一步增加数据集大小时,它可能会变得更加明显)。
更新:自撰写此答案以来,scikit-learn中的DBSCAN版本已获得重大改进。
答案 1 :(得分:1)
您可以将距离矩阵传递给DBSCAN
,因此假设X
是您的样本矩阵,以下内容应该有效:
from sklearn.metrics.pairwise import euclidean_distances
D = euclidean_distances(X, X)
db = DBSCAN(metric="precomputed").fit(D)
然而,矩阵D
甚至会大于X
:n_samples
²条目。对于稀疏矩阵,k-means可能是最好的选择。
(DBSCAN可能看起来很有吸引力,因为它不需要预先确定数量的聚类,但它会交换你必须调整的两个参数。它主要适用于样本的设置是空间中的点,你知道你希望这些点在同一个集群中的距离,或者你有scikit-learn不支持的黑盒距离度量标准。)
答案 2 :(得分:1)
是的,自版本0.16.1起。 这是一个测试提交:
https://github.com/scikit-learn/scikit-learn/commit/494b8e574337e510bcb6fd0c941e390371ef1879
答案 3 :(得分:0)
Sklearn的DBSCAN算法不采用稀疏数组。但是,KMeans和Spectral clustering会这样做,您可以尝试这些。有关sklearns聚类方法的更多信息:http://scikit-learn.org/stable/modules/clustering.html