我正在使用这个PHP例程来计算皮尔逊相关性:
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;
}
当我在几个条件下测试它时,它在完全匹配时返回 0:
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
为什么?以及如何做到这一点?谢谢!
有关信息:
皮尔逊相关是介于 -1 和 1 之间的数字,表示 两个变量线性相关的程度。皮尔逊酒店 相关性也称为"乘积时刻相关性 系数"(PMCC(或简称"相关性"。
方法1(自己做(:
使用 PHP 进行统计是一条艰难的道路。
首先,由于您使用的是弱类型语言(您不需要在变量上指定类型(,该语言可以解释为int
因此,您需要将所有变量设置为类型float
并再次执行以运行它。在 PHP 中使用 float 可能会遇到一些问题,请参阅我为什么谈论这个:https://3v4l.org/1FU9J
但是,如果您不介意高精度,则可以修改精度,可以设置round()
函数,也可以设置ini_set('precision', 3);
以获得数据的精度。
另一件事。如果您需要精度,则需要使用扩展bc
因为 PHP 中的浮点是一个问题,可能会影响您的结果。
在此处查看有关扩展的更多信息bc math
:https://www.php.net/manual/en/book.bc.php 或尝试使用其他语言。
关于浮点的一些参考:
- https://www.leaseweb.com/labs/2013/06/the-php-floating-point-precision-is-wrong-by-default/
- 浮子有问题!(在菲律宾语中(
方法 2(使用语言函数(:
而且,PHP有一些功能可以帮助解决这个问题。所以,如果这不是要学习的家庭作业或类似的东西,你可以试试这个:https://www.php.net/manual/en/function.stats-stat-correlation.php