sklearn.cluster.DBSCAN给出意外结果

时间:2016-08-29 11:38:01

标签: python scikit-learn cluster-analysis dbscan

我正在使用DBSCAN方法来聚类图像,但它会产生意想不到的结果。我们假设我有10张图片。

首先,我使用cv2.imread在循环中读取图像。 然后我计算每个图像之间的结构相似性指数。在那之后,我有一个像这样的矩阵:

[
[ 1.         -0.00893619  0.          0.          0.          0.50148778      0.47921832  0.          0.          0.        ]

[-0.00893619  1.          0.          0.          0.          0.00996088     -0.01873205  0.          0.          0.        ]

[ 0.          0.          1.          0.57884212  0.          0.             0.         0.          0.          0.        ]

[ 0.          0.          0.57884212  1.          0.          0.              0.         0.          0.          0.        ]

[ 0.  0.  0.  0.  1.  0.  0.  0.  0.  0.]

[ 0.50148778  0.00996088  0.          0.          0.          1.          0.63224396  0.          0.          0.        ]

[ 0.47921832 -0.01873205  0.          0.          0.          0.63224396      1.          0.          0.          0.        ]

[ 0.          0.          0.          0.          0.          0.          0.  1.          0.77507487  0.69697053]

[ 0.          0.          0.          0.          0.          0.          0.  0.77507487  1.          0.74861881]

[ 0.          0.          0.          0.          0.          0.          0.  0.69697053  0.74861881  1.        ]]

看起来不错。然后我简单地调用了DBSCAN:

db = DBSCAN(eps=0.4, min_samples=3, metric='precomputed').fit(distances)
labels = db.labels_
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)

结果是

[0 0 0 0 0 0 0 0 0 0]

我做错了什么?为什么它将所有图像放入一个群集中?

2 个答案:

答案 0 :(得分:1)

DBSCAN通常假设相异(距离)而不是相似性。它也可以用相似性阈值实现(参见Generalized DBSCAN)

答案 1 :(得分:0)

问题是我已经错误地计算了距离矩阵 - 主对角线上的条目都是零。