我有一个对象和一个距离函数,想用DBSCAN中的scikit-learn方法对它们进行聚类。我的对象在欧几里德空间中没有表示。我知道,使用precomputed度量是可能的,但在我的情况下,由于距离矩阵很大,这是非常不切实际的。在scikit-learn中有什么方法可以克服这个问题吗也许,DBSCAN还有其他python实现可以做到这一点吗?

最佳答案

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可以使用hotspot jni编译器将它们编译成接近本地的代码速度。Python(当前)不能这样做。

关于python - scikit-learn中的DBSCAN(仅具有度量标准),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32938494/

10-12 21:14