scikit-learn 中的 DBSCAN(仅使用指标)

Posted

技术标签:

【中文标题】scikit-learn 中的 DBSCAN(仅使用指标)【英文标题】:DBSCAN (with metric only) in scikit-learn 【发布时间】:2016-01-01 12:18:47 【问题描述】:

我有对象和距离函数,并希望使用scikit-learn 中的DBSCAN 方法对它们进行聚类。我的对象在欧几里得空间中没有表示。我知道,可以使用precomputed 度量,但在我的情况下,由于距离矩阵很大,这是非常不切实际的。 scikit-learn 有没有办法克服这个问题?也许,还有其他 DBSCAN 的 python 实现可以这样做吗?

【问题讨论】:

为什么不想在构造函数中使用度量参数? 在@Olologin 的评论之后,DBSCAN 的构造函数中的metric 参数接受字符串(对于已经实现的距离)或可调用的(对于给定的 2 个元素返回距离度量的函数)。编写您自己的并使用metric=my_func 初始化 DBSCAN。 【参考方案1】:

scikit-learn 支持多种指标。

其中一些可以使用 kdtree(非常快)、使用球树(快速)、使用预先计算的距离矩阵(快速,但需要大量内存)或不预先计算但 Cython 实现(二次运行时)或甚至是 python 回调(非常慢)。

最后一个选项已实现但速度极慢:

def mydistance(x,y):
  return numpy.sum((x-y)**2)

labels = DBSCAN(eps=eps, min_samples=minpts, metric=mydistance).fit_predict(X)

不幸的是,比

慢得多
labels = DBSCAN(eps=eps, min_samples=minpts, metric='euclidean').fit_predict(X)

当您需要使用自己的距离函数时,我发现 ELKI 的性能要好得多。 Java 可以使用 Hotspot JNI 编译器将它们编译成接近本机代码的速度。 Python(目前)无法做到这一点。

【讨论】:

我不认为 DBSCAN 可以使用用户定义的指标,例如“mydistance”。文档说:如果 metric 是一个字符串或可调用的,它必须是 metrics.pairwise.calculate_distance 为其 metric 参数允许的选项之一。 它有效(否则,他们为什么会提到“可调用”)。我用过。与 Cython 指标相比,它真的很慢,因为 python 解释器。

以上是关于scikit-learn 中的 DBSCAN(仅使用指标)的主要内容,如果未能解决你的问题,请参考以下文章

用scikit-learn学习DBSCAN聚类

用scikit-learn学习DBSCAN聚类

Scikit-learn:使用 DBSCAN 进行聚类后,绘制的点比初始数据样本少

DBSCAN聚类︱scikit-learn中一种基于密度的聚类方式

如何在 scikit-learn 中缩放输入 DBSCAN

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