我的PHP皮尔森相关系数代码有什么问题

时间:2011-09-16 06:09:30

标签: php algorithm math correlation

所以我试图在PHP中实现Sample Pearson Correlation Coefficient:

(转到http://en.wikipedia.org/wiki/Pearson_correlation_coefficient并搜索“样本Pearson相关系数的替代公式”也可用于我试图实施的特定公式)

   $sum = 0;
   $TF1 = 0;
   $TF2 = 0;
   $wSquare1 = 0;
   $wSquare2 = 0;
   $m = sizeof($sample);
   foreach($sample as $x){
      if(!isset($obj1[$x])){
         $obj1[$x]['count'] = 0;
      }
      if(!isset($obj2[$x])){
         $obj2[$x]['count'] = 0;
      }
      $sum += $obj1[$x]['count'] * $obj2[$x]['count'];
      $TF1 += $obj1[$x]['count'];
      $TF2 += $obj2[$x]['count'];
      $wSquare1 += $obj1[$x]['count']^2;
      $wSquare2 += $obj2[$x]['count']^2;
   }
   $numer = $sum * $m - $TF1 * $TF2;
   $denom_left = $m*$wSquare1 - $TF1^2;
   $denom_right = $m*$wSquare2 - $TF2^2;
   $denom = sqrt($denom_left) * sqrt($denom_right);
   $pears = $numer / $denom;
   return $pears;

但有时我的代码会返回一个大于1的值,而PCC不应该超过1 ....

我做错了吗?

1 个答案:

答案 0 :(得分:6)

我还没有完全检查你的数学,但有一件事突然出现在我面前 $TF1^2$obj1[$x]['count']^2。他们正在使用bitwise XOR operator

我相信您需要pow($TF1, 2)pow($obj1[$x]['count'], 2)

或者: $TF1 * $TF1$obj1[$x]['count'] * $obj1[$x]['count']

这是一个常见的错误。

另请注意文章中的免责声明:

  

以上公式表明了一种方便的单程算法   计算样本相关性,但是,取决于数字   涉及,它有时可能数值不稳定