当我运行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.16.1 . 这是一个测试提交:
https://github.com/scikit-learn/scikit-learn/commit/494b8e574337e510bcb6fd0c941e390371ef1879
Sklearn 's DBSCAN algorithm doesn' t采用稀疏数组 . 但是,KMeans和Spectral clustering可以尝试这些 . 有关sklearns聚类方法的更多信息:http://scikit-learn.org/stable/modules/clustering.html
遗憾的是,DBSCAN的
scikit
实施非常幼稚 . 需要重写它以将索引(球树等)考虑在内 .截至目前,它显然会坚持计算一个完整的距离矩阵,这浪费了大量的内存 .
我建议你自己重新实现DBSCAN . 它相当容易,存在良好的伪代码,例如在维基百科和原始出版物中 . 它应该只是几行,然后您可以轻松地利用您的数据表示 . 例如 . 如果你已经在稀疏表示中有一个相似图,那么进行“范围查询”通常是相当简单的(即只使用满足距离阈值的边)
这是一个issue in scikit-learn github,他们谈论改进实施 . 用户使用球树报告他的版本速度提高了50倍(之前没有看到类似的索引加速 - 在进一步增加数据集大小时它可能会变得更加明显) .
Update :自写这篇答案以来,scikit-learn中的DBSCAN版本已经收到了实质性的改进 .
您可以将距离矩阵传递给
DBSCAN
,因此假设X
是您的样本矩阵,以下内容应该有效:However ,矩阵
D
甚至会大于X
:n_samples
²条目 . 对于稀疏矩阵,k-means可能是最好的选择 .(DBSCAN可能看起来很有吸引力,因为它不需要预定数量的聚类,但是它会交换两个你必须调整的参数 . 它支持 . )