比较两个标签向量的百分比是多少

时间:2017-03-18 12:32:55

标签: python cluster-analysis data-science

背景

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

问题

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

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

>>> 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,计算每个重命名的示例中的正确性,并采用最佳正确性的解决方案。但是,可能的重命名数是标签数量的排列。这可能是一个非常大的数字,并使这种方法无法使用。

其他解决方案

我知道normalized mutual information (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]
如果1合并label2,那么

将成为0.5的正确性,而{/ 1>}则会>>> label1 = [1,1,2,2] >>> label2 = [1,2,3,4]

In [76]: df
Out[76]:
      A     B    C     D    E     F    G         H
0     a  None  123  None  Nan  None    2  aa,12asd
1  None  1234  456  None  Ee5   tie  233  a,123,sd
2  None  absc  789   Nan  Nan   abs  Abc  asd34vfd

问题

如何有效地计算

的正确性
  1. 不允许合并。
  2. 允许合并第一个标签。
  3. 允许合并第二个标签。
  4. 当然,2.和3.的解决方案肯定是一样的。

    注释

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

1 个答案:

答案 0 :(得分:0)

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

你应该只使用其中一个,特别是:

  1. 兰德指数
  2. 调整后的兰德指数
  3. 的Jaccard
  4. Fowlkes-Mallows指数