我想要比较两种聚类方法。我用一个方法聚类我的数据对象,然后用另一个方法聚类,并为两个方法标记对象。现在我想比较第二种方法以与第一种方法相同的方式标记数据对象的百分比。
我的数据对象有两种类型的标签。标签是没有任何内在含义的整数,除了具有相同标签(每个标签类型)的那些数据对象属于同一组。我想知道这两个标签的百分比是多少。
例如(其中==是元素的伪代码):
>>> 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
。我不想在这里讨论这是否聪明。在我后来的应用程序中,这就是我需要的。
此外,对于label1
和label2
的不同,标签数量可能会有所不同。对于我的应用程序,我可能实际上对此宽容有用,允许将标签合并到任何一侧。例如
>>> 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
如何有效地计算
的正确性当然,2.和3.的解决方案肯定是一样的。
答案 0 :(得分:0)
有几种成熟的方法来评估两个聚类结果的相似性。他们已经解决了对齐问题,如果聚类数量不同,问题就会变得更糟。
你应该只使用其中一个,特别是: