我有对象和距离函数,并希望使用Scikit-学习
中的DBSCAN
方法来聚类这些。我的对象在欧几里德空间中没有表示。我知道,可以使用预计算的度量,但在我的情况下,由于距离矩阵的大小很大,这是非常不切实际的。有没有什么方法可以在Scikit-学
中克服这个问题?也许,还有其他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可以使用热点JNI编译器将它们编译成接近本机的代码速度。Python(目前)无法做到这一点。