【发布时间】:2020-01-25 08:41:11
【问题描述】:
我有一个图像名称列表和一个(阈值)相似度矩阵。相似关系是自反的和对称的,但不一定是传递的,即如果image_i与image_j和image_k相似,那么并不一定意味着image_j和image_k相似。
例如:
images = ['image_0', 'image_1', 'image_2', 'image_3', 'image_4']
sm = np.array([[1, 1, 1, 0, 1],
[1, 1, 0, 0, 1],
[1, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[1, 1, 0, 0, 1]])
相似矩阵sm解释如下:如果sm[i, j] == 1那么image_i和image_j相似,否则不相似。这里我们看到image_0 与image_1 和image_2 相似,但image_1 和image_2 并不相似(这只是非传递性的一个例子)。
我想保留最大数量的唯一图像(根据给定的sm 矩阵,这些图像都是成对不相似的)。对于此示例,它将是 [image_2, image_3, image_4] 或 [image_1, image_2, image_3](通常有多个这样的子集,但我不介意保留哪个子集,只要它们具有最大长度)。由于我有数千张图片,因此我正在寻找一种有效的方法。
编辑:我原来的解决方案如下
np.array(images)[np.tril(sm).sum(0) == 1]
但不能保证它会返回最大长度子集。考虑以下示例:
sm = np.array([[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 0, 1, 1, 1],
[0, 0, 0, 1, 1]])
此解决方案将返回['image_1', 'image_4'],而所需的结果是['image_0', 'image_2', 'image_4'] 或['image_1', 'image_2', 'image_4']。
更新:请参阅我的回答,它使用图论更详细地解释了该问题。我仍然愿意接受建议,因为我还没有找到一种相当快速的方法来获得数千张图像列表的结果。
【问题讨论】:
-
为什么在你的例子中你没有“保留”image_0?
-
@Gulzar,因为 image_0 类似于 image_2。
-
但它与图 3 不同,并且相似性不具有传递性。如果您对要求进行更详细的解释,我会更愿意。
-
@Gulzar 由于 image_0 与 image_2 相似,我不需要它们都出现在最终列表中。假设它们是完全重复的,因此没有理由同时保留它们,即使 image_0 与 image_3 不相似。
-
最初,您只有一个独特的图像#3。但是从列表中删除图像#0 后,图像#2 也变得唯一。因此,删除图像,我们可以得到一个列表,其中所有剩余的图像都是唯一的,对吧?
标签: python numpy igraph graph-theory independent-set