2

我试图通过 scikit-learn 理解 DBSCAN 实现,但我遇到了麻烦。这是我的数据样本:

X = [[0,0],[0,1],[1,1],[1,2],[2,2],[5,0],[5,1],[5,2],[8,0],[10,0]]

然后我按照提供的示例计算 D

D = distance.squareform(distance.pdist(X))

D返回一个矩阵,其中包含每个点与所有其他点之间的距离。因此对角线始终为 0。

然后我运行 DBSCAN 为:

 db = DBSCAN(eps=1.1, min_samples=2).fit(D)

eps = 1.1意味着,如果我很好地理解了文档,那么距离小于或等于 1.1 的点将被考虑在一个集群(核心)中。

D[1]返回以下内容:

>>> D[1]
array([  1.        ,   0.        ,   1.        ,   1.41421356,
     2.23606798,   5.09901951,   5.        ,   5.09901951,
     8.06225775,  10.04987562])

这意味着第二个点到第一个和第三个点的距离为 1。所以我希望他们建立一个集群,但是......

>>> db.core_sample_indices_
[]

这意味着没有找到核心,对吧?这是其他 2 个输出。

>>> db.components_
array([], shape=(0, 10), dtype=float64)
>>> db.labels_
array([-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.])

为什么会有集群?

4

1 回答 1

4

我认为实现可能只是假设您的距离矩阵是数据本身

请参阅:通常您不会计算 DBSCAN 的完整距离矩阵,而是使用数据索引来进行更快的邻居搜索。

从 1 分钟的 Google 来看,考虑添加metric="precomputed",因为:

适合(X)

X:样本之间的距离数组,或特征数组。该数组被视为特征数组,除非该度量被指定为“预先计算”。

于 2013-04-10T11:11:30.877 回答