比较两个标签向量相同的百分比



>Background

我想比较两种聚类方法。我先用一种方法聚类数据对象,然后用另一种方法聚类数据对象,并为两种方法标记对象。现在,我想比较一下第二种方法以与第一种方法相同的方式标记数据对象的百分比。

问题

我有具有两种类型标签的数据对象。标签是没有任何内在含义的整数,其他具有相同标签(每个标签类型)的数据对象属于同一组。我想知道两个标签相同的百分比是多少。

例如(伪代码,其中 == 是按元素的):

>>> label1 = [1,1,1,1,2,2,2,3,3,3,3,3,4,4]
>>> label2 = [1,1,2,2,2,2,2,2,2,3,3,4,4,4]
>>> correctness = sum_of_true(label1 == label2) / 14
correctness: 9 / 14 = 0.6428571

但是,标签的使用方式可能不同。例如

>>> label1 = [1,1,1,1,2,2,2,3,3,3,3,3,4,4]
>>> label2 = [2,2,2,2,1,1,1,4,4,4,4,4,3,3]

实际上是相同的标签,正确性应该1.0.

为此,我需要重命名 label2,使标签尽可能类似于 label1。

低效的解决方案

一个低效的解决方案是简单地尝试在所有可能的解决方案中重命名label2,计算每次重命名的正确性,如上例所示,并采用具有最佳正确性的解决方案。但是,可能的重命名数是标签数的排列。这可能是一个非常巨大的数字,并使这种方法无法使用。

其他解决方案

我知道规范化互信息(nmi)是比较标签的一种手段,但这不是我想要的。原因是首先 nmi 不是线性的,其次很难理解和交流,第三我只是想要别的东西 ;-) - 在这种情况下,要了解相同标记的数据对象的数量(~百分比)。我想要这个其他东西的原因与标签的后期应用有关。

所以例如

>>> label1 = [1,1,1,1]
>>> label2 = [1,2,3,4]

我仍然希望这是正确的1/4.我不想在这里讨论这是否明智。在我后来的应用程序中,这就是我需要的。

允许合并

此外,还有一个问题是,对于label1label2,标签的数量可能不同。对于我的应用程序,我对此宽容可能实际上很有用,允许将标签合并到两侧的一个标签。例如

>>> label1 = [1,1,1,1]
>>> label2 = [1,2,3,4]

如果对合并label2宽容,将成为1的正确性,0.5

对于
>>> label1 = [1,1,2,2]
>>> label2 = [1,2,3,4]

问题

如何有效地计算正确性

  1. 不允许合并。
  2. 允许合并第一个标签。
  3. 允许合并第二个标签。

当然,2. 和 3. 的解决方案是相同的。

笔记

  • 我正在使用python进行实现。
  • 如果您知道,请告诉我这个问题使用什么标签。我不确定。

有几种成熟的方法来评估两个聚类结果的相似性。他们已经解决了对齐问题,如果集群数量不同,问题会变得更糟。

您可能应该只使用其中之一,特别是:

  1. 兰特指数
  2. 调整后的兰特指数
  3. 杰卡德
  4. 福尔克斯-锦葵指数

最新更新