【问题标题】:Multiple eps values in sklearn DBSCANsklearn DBSCAN中的多个eps值
【发布时间】:2018-01-08 02:05:09
【问题描述】:

我想使用 sklearn 的 DBSCAN 实现。它们允许您使用自定义距离度量,但只有一个 eps 值。 我想要的是以下内容:

假设我的每个点都有 3 个特征,所以每个点都可以被视为p=np.array([p1,p2,p3]) 形式的 numpy 数组。如果np.abs(p1-q1) < eps1np.abs(p2-q2) < eps2np.abs(p3-q3) < eps3 两个点pq 是邻居。通常,人们会使用d(p,q)<eps,其中d(,) 是一个指标,而eps 是一个阈值。

有没有办法在 sklearn 中轻松实现我的需求?

【问题讨论】:

    标签: python scikit-learn dbscan


    【解决方案1】:

    您可以适当缩放,然后使用最大范数。

    p = p * [1/eps1, 1/eps2, 1/eps3]
    
    c = sklearn.cluster.DBSCAN(eps=1, metric="chebyshev", ...)
    

    请注意,DBSCAN 使用 <= 而不是 <

    或者您预先计算一个二进制“距离”矩阵,如果三个条件成立,则距离为 0,否则为 1。但这需要 O(n²) 内存。

    【讨论】:

    • 这个距离矩阵在我的例子中是稀疏的。有没有办法利用它来减少内存使用量?但是你的缩放想法很漂亮!谢谢!
    • 从 0.17 开始,sklearn 可以使用稀疏距离矩阵。但请注意,您需要存储 0,而不是 1。缺失值被认为是无限的。如果上述缩放方法比稀疏矩阵更快,我不会感到惊讶。
    • ELKI 中,您可以定义一个距离函数 - 并获得索引加速 - 无需此之前的加权技巧(基本上,跟随 this tutorial 加权距离)。但即便如此,先验权重可能比在每次距离计算中应用权重稍快。
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 2023-03-15
    • 1970-01-01
    • 2020-09-10
    • 2019-03-04
    • 2012-10-05
    • 2013-02-06
    • 2014-06-29
    相关资源
    最近更新 更多