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

时间:2015-10-04 21:15:48

标签: python scikit-learn cluster-analysis data-mining dbscan

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

1 个答案:

答案 0 :(得分: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)
不幸的是,

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

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