2015-10-04 96 views
3

我有对象和距离的功能,并希望在scikit-learn群集使用这些方法DBSCAN。我的物体在欧几里德空间中没有表示。我知道,这是可以使用precomputed指标,但对我来说这是非常不切实际的,由于大尺寸的距离矩阵。有没有什么办法可以在scikit-learn中克服这个问题?也许,DBSCAN的另一个python实现可以这样做吗?DBSCAN(只有指标)scikit学习

+2

为什么你不希望在构造函数中使用的度量参数? –

+1

继@ Olologin的评论,'metric'参数在DBSCAN的构造器接受字符串(对于一个已经实现的距离)或一个可调用(一个函数,对于给定的2个元素,返回一个距离量度)。编写你自己的并用'metric = my_func'初始化DBSCAN。 –

回答

6

scikit学习有大量的各种指标的支持。

它们中的一些可以使用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(当前)不能这样做。

+0

我不认为DBSCAN将与用户定义的工作指标,如“mydistance”。该文档说:如果度量标准是一个字符串或可调用的,它必须是度量参数metrics.pairwise.calculate_distance允许的选项之一。 – vdesai

+0

它的工作原理(否则,他们为什么会提到“callable”)。我用它。由于python解释器与Cython度量相比,它非常慢。 –