我正试图通过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_
[]
意味着没有发现核心,对吧?下面是另外两个输出。
>>> db.components_
array([], shape=(0, 10), dtype=float64)
>>> db.labels_
array([-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.])
为什么会有集群?
我认为实现可能只是假设您的距离矩阵是数据本身。
请参阅:通常您不会为DBSCAN计算完整的距离矩阵,而是使用数据索引进行更快的邻居搜索。
从1分钟谷歌判断,考虑添加metric="precomputed"
,因为:
适合(X)
X:样本之间的距离数组,或特征数组。该数组被视为特征数组,除非给出的度量是"预先计算的"。