我使用维基百科上的公式来计算马修的相关系数。它在大多数情况下运行得相当好,但我在工具的实现中遇到问题,而且我没有看到问题。
MCC =((TP * TN) - (FP * FN))/ sqrt(((TP + FP)(TP + FN)(TN + FP)(TN + FN)))
其中TP,TN,FP和FN是相应字段的非负整数计数。 哪个应该只返回值$ \ epsilon $ [-1,1] 我的实现如下:
double ret;
if ((TruePositives + FalsePositives) == 0 || (TruePositives + FalseNegatives) == 0 ||
( TrueNegatives + FalsePositives) == 0 || (TrueNegatives + FalseNegatives) == 0)
//To avoid dividing by zero
ret = (double)(TruePositives * TrueNegatives -
FalsePositives * FalseNegatives);
else{
double num = (double)(TruePositives * TrueNegatives -
FalsePositives * FalseNegatives);
double denom = (TruePositives + FalsePositives) *
(TruePositives + FalseNegatives) *
(TrueNegatives + FalsePositives) *
(TrueNegatives + FalseNegatives);
denom = Math.Sqrt(denom);
ret = num / denom;
}
return ret;
当我使用它时,正如我所说,它在大多数情况下都能正常工作,但是例如如果TP = 280,TN = 273,FP = 67和FN = 20,那么我们得到: MCC =(280 * 273) - (67 * 20)/ sqrt((347 * 300 * 340 * 293))= 75100 / 42196.06 =(约)1.78 这是Matthews Correlation Coefficient的正常行为吗?我是一名贸易程序员,所以统计数据不是我正式培训的一部分。此外,我已经用答案查看了问题,但没有人讨论这种行为。这是我的代码或公式本身的错误吗?
答案 0 :(得分:3)
代码清晰,看起来正确。 (但是,你的眼睛总是可以欺骗。)
一个问题是关注输出是否保证介于-1和1之间。假设所有输入都是非负的,我们可以将分子向上和分母向下舍入< / em>,从而过高估计结果,将所有&#34; False *&#34;归零。术语,生产
TP*TN / Sqrt(TP*TN*TP*TN) = 1.
通过将所有&#34; True *&#34;归零来获得下限。条款。因此,除非出现无效输入,否则工作代码无法生成大于1的值。
因此,我建议设置一个警卫(例如Assert
声明)以确保输入是非负的。 (显然,在前面的论证中,它们是否是不可变的是重要的。)放置另一个断言来检查输出是否在区间[-1,1]中。这些将共同检测(a)无效输入或(b)计算错误中的一个或两个。