用Java计算Phi系数

时间:2015-03-06 19:08:38

标签: java confusion-matrix statistical-test

我想用Java计算混淆矩阵2 x 2的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 = 6930 trueN = 6924 falseP = 0,falseN = 0 ,此代码的输出为3629.03401901938 。 我已经计算了 excel 中的Phi系数,它为相同的值返回值 1

什么是错的?

任何帮助都将受到高度赞赏

2 个答案:

答案 0 :(得分:10)

我可以复制此错误,但仅当truePtrueNfalsePfalseNint时。

如果它们是int s,那么此行会溢出int的范围,然后才能将其分配到double

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

此值仅为1.74822976E8,应为2.3023989982224E15,大于Integer.MAX_VALUE,略大于20亿(2E9)。

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

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

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

为确保整体有效计算,请对所有4个变量使用doubletruePtrueNfalsePfalseN

答案 1 :(得分:3)

如果每个变量都是double,则代码会生成所需的输出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