scikit-learn中的DBSCAN(仅限度量)

Ser*_*nin 3 python cluster-analysis data-mining dbscan scikit-learn

我有对象和距离函数,并希望使用DBSCAN方法聚类这些scikit-learn.我的物体在欧几里德空间中没有表示.我知道,可以使用precomputed公制,但在我的情况下,由于距离矩阵的大小,这是非常不切实际的.有没有办法克服这个问题scikit-learn?也许,有没有其他可以实现的DBSCAN python实现?

Ano*_*sse 6

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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,它比...慢得多

labels = DBSCAN(eps=eps, min_samples=minpts, metric='euclidean').fit_predict(X)
Run Code Online (Sandbox Code Playgroud)

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