提问者:小点点

scikit学习中的DBSCAN(仅限公制)


我有对象和距离函数,并希望使用Scikit-学习中的DBSCAN方法来聚类这些。我的对象在欧几里德空间中没有表示。我知道,可以使用预计算的度量,但在我的情况下,由于距离矩阵的大小很大,这是非常不切实际的。有没有什么方法可以在Scikit-学中克服这个问题?也许,还有其他DBSCAN的python实现可以这样做吗?


共1个答案

匿名用户

scikit learn支持多种指标。

其中一些可以使用kdtree(非常快)、ball tree(快速)、使用预计算的距离矩阵(快速,但需要大量内存)或不进行预计算而使用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可以使用热点JNI编译器将它们编译成接近本机的代码速度。Python(目前)无法做到这一点。