2011-09-16 54 views
1

所以我試圖在PHP中實現樣品Pearson相關係數:有什麼錯我的PHP Pearson相關係數代碼

(去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; 

但後來我有時代碼將返回一個值,雖然是不應該PCC超過1 ....

上午我大於1做錯了什麼?

+0

您的代碼錯過了示例數據,您應該命名其中哪些失敗。也許你應該先爲這個函數編寫一個單元測試?或者是stackoverflow你的單元測試? :) – hakre

+0

示例數據是相當大的擺在這裏......,我想看看我的實現數學是正確的,這樣我可以集中精力找出數據,而不是數學 –

+0

好,使它在github上或類似的可用,並與testdata添加unittests。然後分享鏈接。 – hakre

回答

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']

它’一個普遍的錯誤。

另外要注意從製品的免責聲明的:

上述公式表明對於 計算樣本相關性的便利單通算法,但是,取決於 涉及的人數,它有時可以數值不穩定

+0

或只是簡單的'$ TF1 * $ TF1' –

+0

@yi_H:好點!該_將避免函數調用。我想,如果你是【微優化]只在乎(http://www.codinghorror.com/blog/2005/01/micro-optimization-and-meatballs.html)。 :) – Herbert

+0

我試圖優化它*可讀性*它看起來更好用簡單的表達式:) –