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 进行聚类后,绘制的点比初始数据样本少