在scikit-learn中,DBSCAN可以使用稀疏矩阵吗?

时间:2013-04-19 01:49:01

标签: machine-learning scikit-learn cluster-analysis data-mining dbscan

当我运行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中使用稀疏矩阵,请告诉我。 或者你可以告诉我一个更合适的聚类方法。

4 个答案:

答案 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甚至会大于Xn_samples²条目。对于稀疏矩阵,k-means可能是最好的选择。

(DBSCAN可能看起来很有吸引力,因为它不需要预先确定数量的聚类,但它会交换你必须调整的两个参数。它主要适用于样本的设置是空间中的点,你知道你希望这些点在同一个集群中的距离,或者你有scikit-learn不支持的黑盒距离度量标准。)

答案 2 :(得分:1)

答案 3 :(得分:0)

Sklearn的DBSCAN算法不采用稀疏数组。但是,KMeansSpectral clustering会这样做,您可以尝试这些。有关sklearns聚类方法的更多信息:http://scikit-learn.org/stable/modules/clustering.html