1

我想为混淆矩阵 2 x 2 计算 Java 中的 Phi 系数,其中代码如下:

double str= (trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);
               double output= Math.sqrt(str);
                if (output!= 0.0)
                return (trueP * trueN) / output;
            else return 0.0;

其中trueP=6930trueN=6924falseP=0 和 falseN = 0,此代码的输出为 3629.03401901938。我已经在excel中计算了 Phi 系数,它对于相同的值返回值1

什么是错?

任何帮助将不胜感激

4

2 回答 2

10

我可以复制此错误,但前提是truePtrueNfalsePfalseNints。

如果它们是s,那么这一行在分配给 之前就int溢出了 的范围。intdouble

double str= (trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);

这个值只有1.74822976E8当它应该是 时2.3023989982224E15,大于Integer.MAX_VALUE,略大于 20 亿(2E9)。

将第一个值强制转换为 adouble以强制对整个表达式进行浮点运算,因为double它具有更大范围的有效值。

double str= ( (double) trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);

当我这样做时,我会得到你想要的输出1.0

为确保整体计算有效,double请对所有 4 个变量使用 s:truePtrueNfalsePfalseN

于 2015-03-06T19:19:34.350 回答
3

如果每个变量都是双倍的,您的代码会产生所需的输出 1.0 :

只需编译并运行以下 java 类,它将您要分配给 trueP、trueN、falseP 和 falseN 的值:

class confusion {
    public static void main(String[] args) {
    double trueP=6930;
    double trueN=6924;
    double falseP=0;
    double falseN=0;
    double str= (trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);
               double output= Math.sqrt(str);
                if (output!= 0.0) {
                    double output2 =(trueP * trueN) / output;
                    System.out.println(output2);
            }
                else  {
                System.out.println(output); // Display the string.
            }
    }
}

原因是 double 可以为您的情况保持足够大的最大值:

static double   MAX_VALUE
A constant holding the largest positive finite value of type double, (2-2-52)·21023.

正如你在这里看到的:http: //docs.oracle.com/javase/7/docs/api/java/lang/Double.html

于 2015-03-06T19:23:17.887 回答