Php 皮尔逊相关性在精确匹配时返回0

Php 皮尔逊相关性在精确匹配时返回0,php,pearson-correlation,Php,Pearson Correlation,我正在使用此PHP例程计算Pearson相关性: function correlation ($x,$y) { $length = count($x); $mean1 = array_sum($x)/$length; $mean2 = array_sum($y)/$length; $a = $b = 0; $a2 = $b2 = 0; $axb = 0; for ($i = 0; $i < $length; $i++) {

我正在使用此PHP例程计算Pearson相关性:

function correlation ($x,$y) {
    $length = count($x);
    $mean1 = array_sum($x)/$length;
    $mean2 = array_sum($y)/$length;
    $a = $b = 0;
    $a2 = $b2 = 0;
    $axb = 0;
    for ($i = 0; $i < $length; $i++) {
        $a = $x[$i]-$mean1;
        $b = $y[$i]-$mean2;
        $axb +=$a*$b;
        $a2 += pow($a,2);
        $b2 += pow($b,2);
    }
    if ($sqrt = sqrt($a2*$b2))
        return $axb/$sqrt;
    return 0;
}
为什么??如何做到这一点?谢谢大家!


有关信息:

皮尔逊相关性是一个介于-1和1之间的数字,表示 两个变量线性相关的程度。皮尔逊酒店 相关性也称为“积矩相关性” 系数”(PMCC)或简单的“相关性”

方法1(自己动手): 使用PHP进行统计是一条艰难的道路

首先,由于您使用的是弱类型语言(您不需要指定变量的类型),该语言可以解释为
int
,因此,您需要将所有变量设置为type
float
,然后再次执行以运行此操作。PHP中的float可能会有一些问题,请参见我为什么这样说:

但是如果你不介意高精度,你可以修改你的精度你可以设置
round()
函数或者你可以设置
ini\u set('precision',3)
以获取数据的精度

还有一件事。如果需要精度,则需要使用
bc
扩展名,因为PHP中的浮点是一个问题,可能会影响结果

请在此处查看有关卑诗省数学扩展的更多信息:或尝试使用其他语言

有关浮点的一些参考资料:


方法2(使用语言功能):
而且,PHP在这方面有一些帮助功能。所以,如果这不是一个要学习的家庭作业或类似的东西,你可以试试这个:

“如何完成?”…如何完成什么?你没有提到预期的结果是什么我已经忘记了我在大学学到的所有统计数据,但是你得到了零,因为这是你的默认返回值,可以避免被零除。当散点图中基本上只有一个点时,计算相关性是没有意义的。@ADyson 00000和00000是相等的,并且具有完全相关性,那么为什么它返回0而不是1,以及如何使它返回1?1表示值形成一条完美的线,Y随着X的增长而增长。两个相等的值不能形成一条线(或者它们可以在任何方向上形成无限多条线,不管您想考虑什么)。维基百科有一个独特的功能。要得到1,只需替换
返回0
返回1-但我怀疑它在数学上是否正确。我认为更好的结果应该是
null
int
float
的问题实际上发生在强类型语言C中,其中
10/3
呈现
3
。在松散类型的语言(如PHP)中,您会自动获得精度。此外,当您需要30位小数或500位整数时,浮点数学精度是一个问题。@阿尔瓦罗冈萨雷斯您对
C
语言的考虑是正确的。但是,正如下面的例子()所示,我们可以看到PHP中有些地方并不完全正确。
echo correlation([0,0,0,0,0],[0,0,0,0,0]); // Returns 0!!
echo correlation([0,0,0,0,0],[1,1,1,1,1]); // Returns 0!!
echo correlation([1,1,1,1,1],[1,1,1,1,1]); // Returns 0!!
echo correlation([0,0,0,0,0],[9,9,9,9,9]); // Returns 0!!
echo correlation([0,0,0,0,0],[0,1,2,3,4]); // Returns 0 OK
echo correlation([9,9,9,9,9],[0,1,2,3,4]); // Returns 0 OK
echo correlation([0,1,2,3,4],[0,1,2,3,4]); // Returns 1 OK