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
我错过了什么?
邻域与群集不同。
集群是许多社区的联合体。 Epsilon是距离一个街区中心的最大距离;但如果您合并多个邻域,如果您的数据密集,距离可能会变得任意大。
但是sklearn中参数的描述也是错误的,而不仅仅是误导。当三角不等式成立时,相同邻域中的点可以相隔两个ε(如果不使用度量,则更多)。
为了指出他们为什么在同一个集群中,让我给你一个关于DBSCAN做什么的高级解释。
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]