DBSCAN eps 不正确的行为

DBSCAN eps incorrect behaviour

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]

而医生说:

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

这里 9 和 15 在同一个簇中,而它们之间的欧氏距离为 6,即 >3

我错过了什么?

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

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

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

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

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

这是因为点链在一起。 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]

社区与集群不同。

集群是许多社区的联合体。 Epsilon 是距一个社区中心的最大距离;但是如果你合并多个社区,如果你的数据是 dense.

,那么距离可以变得任意大

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