首页 文章

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

提问于
浏览
9

当我运行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 回答

  • 1
  • 1

    Sklearn 's DBSCAN algorithm doesn' t采用稀疏数组 . 但是,KMeansSpectral clustering可以尝试这些 . 有关sklearns聚类方法的更多信息:http://scikit-learn.org/stable/modules/clustering.html

  • 7

    遗憾的是,DBSCAN的 scikit 实施非常幼稚 . 需要重写它以将索引(球树等)考虑在内 .

    截至目前,它显然会坚持计算一个完整的距离矩阵,这浪费了大量的内存 .

    我建议你自己重新实现DBSCAN . 它相当容易,存在良好的伪代码,例如在维基百科和原始出版物中 . 它应该只是几行,然后您可以轻松地利用您的数据表示 . 例如 . 如果你已经在稀疏表示中有一个相似图,那么进行“范围查询”通常是相当简单的(即只使用满足距离阈值的边)

    这是一个issue in scikit-learn github,他们谈论改进实施 . 用户使用球树报告他的版本速度提高了50倍(之前没有看到类似的索引加速 - 在进一步增加数据集大小时它可能会变得更加明显) .

    Update :自写这篇答案以来,scikit-learn中的DBSCAN版本已经收到了实质性的改进 .

  • 0

    您可以将距离矩阵传递给 DBSCAN ,因此假设 X 是您的样本矩阵,以下内容应该有效:

    from sklearn.metrics.pairwise import euclidean_distances
    
    D = euclidean_distances(X, X)
    db = DBSCAN(metric="precomputed").fit(D)
    

    However ,矩阵 D 甚至会大于 Xn_samples ²条目 . 对于稀疏矩阵,k-means可能是最好的选择 .

    (DBSCAN可能看起来很有吸引力,因为它不需要预定数量的聚类,但是它会交换两个你必须调整的参数 . 它支持 . )

相关问题