DBSCAN、python的参数eps
Posted
技术标签:
【中文标题】DBSCAN、python的参数eps【英文标题】:Parameter eps of DBSCAN, python 【发布时间】:2014-07-27 01:11:24 【问题描述】:我有一组点。它们的几何形状(SRID:4326)存储在数据库中。 我得到了一个代码,旨在用 DBSCAN 对这些点进行聚类。参数设置如下:eps=1000,min_points=1。
我获得了距离小于 1000 米的集群。我相信距离小于 1000 米的两个点属于同一个集群。 epsilon 真的是以米为单位吗?
代码如下:
self.algorithm='DBSCAN'
X=self.data[:,[2,3]]
if self.debug==True:
print 'Nbr of Points: %d'% len(X)
# print X.shape
# print dist_matrix.shape
D = distance.squareform(distance.pdist(X,'euclidean'))
# print dist_matrix
# S = 1 - (D / np.max(D))
db = DBSCAN(eps, min_samples).fit(D)
self.core_samples = db.core_sample_indices_
self.labels = db.labels
目的不是找到另一种运行方式,而是真正了解 eps 的价值。它在距离方面代表什么。 Min_sample 设置为 1,因为我接受确实有 1 个样本大小的集群。
【问题讨论】:
不要使用'euclidean'
。您的数据不在欧几里得向量空间中。在欧洲和美国的大部分地区,距离将被扭曲超过 30%(更北的地方更糟);并且欧几里得距离不理解坐标系的-180°环绕。还要避免计算距离矩阵,这需要O(n^2)
内存和运行时。使用索引加速快速找到邻居。
【参考方案1】:
这取决于您的实现。
你的距离函数可以返回任何东西;包括米,毫米,码,公里,英里,度......但你没有分享你用于计算距离的函数!
如果我没记错的话,SRID: 4326
并没有暗示任何距离计算。
sklearn 使用的"haversine"
似乎使用度,而不是米。
不管怎样,min_points=1
都是荒谬的。包含查询点,因此每个点本身都是一个集群。使用min_points <= 2
,DBSCAN 的结果将是单链接聚类。要获得基于密度的聚类,您需要选择更高的值才能获得真实密度。
您可能想使用ELKI 的 DBSCAN。根据他们的 Java 资源,他们的距离函数使用米,而且他们的 R*-tree 索引允许使用这个距离进行加速范围查询,这将产生 显着 加速(O(n log n)
而不是 @ 987654327@).
【讨论】:
以上是关于DBSCAN、python的参数eps的主要内容,如果未能解决你的问题,请参考以下文章