我正在使用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]
我做错了什么?为什么它将所有图像放入一个群集中?
答案 0 :(得分:1)
DBSCAN通常假设相异(距离)而不是相似性。它也可以用相似性阈值实现(参见Generalized DBSCAN)
答案 1 :(得分:0)
问题是我已经错误地计算了距离矩阵 - 主对角线上的条目都是零。