что не так с моим кодом коэффициента корреляции PHP Пирсона - PullRequest
1 голос
/ 16 сентября 2011

поэтому я пытался реализовать пример коэффициента корреляции Пирсона в PHP:

(перейдите к http://en.wikipedia.org/wiki/Pearson_correlation_coefficient и найдите «Альтернативные формулы для образца коэффициента корреляции Пирсона также доступны» для конкретной формулы, которую я пытался реализовать)

   $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 Ответ

6 голосов
/ 16 сентября 2011

Я не полностью проверил вашу математику, но одна вещь, которая мне показалась, была $TF1^2 и $obj1[$x]['count']^2. Они используют битовый оператор XOR .

Я полагаю, вы хотите pow($TF1, 2) и pow($obj1[$x]['count'], 2)

альтернативный вариант: $TF1 * $TF1 и $obj1[$x]['count'] * $obj1[$x]['count']

Это распространенная ошибка.

Также следует помнить об отказе от статьи:

Приведенная выше формула предлагает удобный однопроходный алгоритм для расчет выборочных корреляций, но в зависимости от чисел В некоторых случаях это может быть численно нестабильным

...