DBSCAN eps行为不正确

问题描述 投票:0回答:3
from sklearn.cluster import DBSCAN
import numpy as np
X=np.array([1,9,11,13,14,15,19]).reshape(-1, 1)
db=DBSCAN(eps=3, min_samples=1).fit(X)
print(db.labels_)

打印:

[0 1 1 1 1 1 2]

doc说:

eps : float, optional
    The maximum distance between two samples for them to be considered
    as in the same neighborhood.

这里9和15在同一簇中,而它们之间的欧几里德距离是6,> 3

我错过了什么?

python dbscan
3个回答
1
投票

邻域与群集不同。

集群是许多社区的联合体。 Epsilon是距离一个街区中心的最大距离;但如果您合并多个邻域,如果您的数据密集,距离可能会变得任意大。

但是sklearn中参数的描述也是错误的,而不仅仅是误导。当三角不等式成立时,相同邻域中的点可以相隔两个ε(如果不使用度量​​,则更多)。


1
投票

为了指出他们为什么在同一个集群中,让我给你一个关于DBSCAN做什么的高级解释。

  1. 通过连接数据点构建图形
  2. 测量每个连接组件的大小
  3. 丢弃小于阈值的分量,其在sklearn中是min_sample参数。

esp控制连接两个数据点的最大距离。对于数据集,使用[a-b]表示连接的符号,您有:

[9-11], [11-13], [13-14], [14-15]

所以这些点都在同一个组件中,并且组件比min_sample参数大,因此它被认为是一个有效的集群。


1
投票

这是因为点链在一起。 15小于14的eps,因此它包含在该群集中。

你可以在这里看到行为:

X=np.array([1,9,11,13,14,15,17,19]).reshape(-1, 1)
db=DBSCAN(eps=3, min_samples=1).fit(X)

print(db.labels_)

给:[0 1 1 1 1 1 1 1]

© www.soinside.com 2019 - 2024. All rights reserved.