所以我试图在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 ....
我做错了吗?答案 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']
这是一个常见的错误。
另请注意文章中的免责声明:
以上公式表明了一种方便的单程算法 计算样本相关性,但是,取决于数字 涉及,它有时可能数值不稳定。