Python scikits ARI实现中是否存在缺陷,或者我对算法的理解是否有缺陷?

Python scikits ARI实现中是否存在缺陷,或者我对算法的理解是否有缺陷?,python,scikit-learn,cluster-analysis,scikits,Python,Scikit Learn,Cluster Analysis,Scikits,在计算时,我注意到一个奇怪的情况。对于某些看起来在标签上有很高一致性的列表,ARI仍然是0.0甚至更差 我试过几种标签,下面是观察到的最奇怪的一种: from sklearn import metrics as m labels_true = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] labels_pred = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1] res = m.adjusted_ran

在计算时,我注意到一个奇怪的情况。对于某些看起来在标签上有很高一致性的列表,ARI仍然是0.0甚至更差

我试过几种标签,下面是观察到的最奇怪的一种:

from sklearn import metrics as m

labels_true = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
labels_pred = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1]

res = m.adjusted_rand_score(labels_true,labels_pred)

>>> res = 0.0 
结果是0.0,这是两个列表完全随机标签的指标。看着它们,直觉上人们会说这是一个非常好的标签,除了一个列表条目,它是类0而不是类1的标签。这甚至是一个真实的聚类结果,例如,如果在一个没有噪声的小数据集中只有一个聚类,并且一个点被错误地分类为错误(类0)

我的问题是:我对“好”标签的理解是否完全错误,或者算法是否存在某种缺陷,甚至是未记录的输入限制

否和是

否:实现似乎是正确的,是的:您的理解有缺陷

调整后的兰德指数将给定结果与标签的任何随机排列进行比较只有在结果优于随机结果时,结果才是好的。

现在,如果你看一下日期,任何随机排列都会完全一样好。因此,正确的调整值为0:与随机排列一样好


但是,我同意您的评估,即ARI不能用于一类问题。因为在这些数据上,所有排列都是相等的。针对您的问题的错误工具:它是关于比较数据集的分区,而您没有分区数据…

我可以在我的系统上验证行为,并已在上打开错误报告。我想这是一只虫子。我们看看他们怎么说。另外,我用sklearn 0.19.1进行了验证。不确定您使用的是什么版本。感谢您打开此问题。我认为其中一个列表中只存在一个标签的情况可能存在某种缺陷。如果在两个列表的末尾都添加一个2,则会神奇地得到大约0.633的ARI。我使用的是0.20.1版,如果我手工计算上述示例的RI(无调整),如所示,则得到0.9090。但是如果我用列联表计算ARI公式的分子,它实际上是零。我甚至可以说,只要一个标签只包含一个类,它总是0。如果这一说法是真的,那就意味着公式中定义的ARI对于只有一个类且没有噪音的实验毫无用处;我可能没有对地面真相数据进行分区,但大多数算法都会犯一些小错误,并留下一个稍微分区的结果。由于ARI是一个对称度量,这就相当于对地面真实数据进行了轻微的分区(低噪声),并且只有一个类的聚类结果(无论出于何种原因)-这是最让我困惑的事情。我只需要一个适合一类问题的算法。谢谢你的见解!也许NMI在这种情况下效果更好;但是调整后的版本AMI可能也有同样的问题。机会调整意味着你需要定义一些“预期随机结果”的概念。如果你只有标签,排列是一个流行的选择。特别是一个置换和另一个的逆置换是一样的,所以它是对称的。我可以确认AMI只是面临完全相同的问题!