PHP Pearson korelasyon

2 Cevap php

I'm trying to implement the calculation of correlation coefficient of people between two sets of data in php. I'm just trying to do the porting python script that can be found at this url http://answers.oreilly.com/topic/1066-how-to-find-similar-users-with-python/

benim uygulaması şudur:

class LB_Similarity_PearsonCorrelation implements LB_Similarity_Interface{
public function similarity($user1, $user2){

    $sharedItem = array();
    $pref1 = array();
    $pref2 = array();

    $result1 = $user1->fetchAllPreferences();
    $result2 = $user2->fetchAllPreferences();

    foreach($result1 as $pref){
        $pref1[$pref->item_id] = $pref->rate;
    }

    foreach($result2 as $pref){
        $pref2[$pref->item_id] = $pref->rate;
    }

    foreach ($pref1 as $item => $preferenza){
        if(key_exists($item,$pref2)){
            $sharedItem[$item] = 1;
        }
    }

    $n = count($sharedItem);
    if ($n == 0) return 0;

    $sum1 = 0;$sum2 = 0;$sumSq1 = 0;$sumSq2 = 0;$pSum = 0;

    foreach ($sharedItem as $item_id => $pre) {
        $sum1 += $pref1[$item_id];
        $sum2 += $pref2[$item_id];

        $sumSq1 += pow($pref1[$item_id],2);
        $sumSq2 += pow($pref2[$item_id],2);

        $pSum += $pref1[$item_id] * $pref2[$item_id];
    }

    $num = $pSum - (($sum1 * $sum2) / $n);
    $den = sqrt(($sumSq1 - pow($sum1,2)/$n) * ($sumSq2 - pow($sum2,2)/$n));
    if ($den == 0) return 0;
    return $num/$den;

}
}

iyi kodu anlamak açıklama, yöntem fetchAllPreferences yönetim kolaylığı için bir dizi haline getirir, aslında öğeleri nesnelerin bir dizi geri dönmek,

Bu uygulama özellikle ben payda hesaplama doğruluğu hakkında bazı şüphelerim var, doğru olduğundan emin değilim.

Herhangi bir tavsiye açığız.

şimdiden teşekkürler!

2 Cevap

Sizin algoritması matematiksel olarak doğru ama sayısal kararsız görünüyor. Kareler toplamını bulmak açıkça felaket için bir reçetedir. Ne gibi sayılar varsa array(10000000001, 10000000002, 10000000003)? Varyans hesaplamak için bir sayısal olarak kararlı Tek-geçiş algoritması found on Wikipedia olabilir ve aynı ilke kovaryans işlem uygulanabilir.

Eğer hız hakkında çok umurumda değil kolay ama, sadece iki geçiş kullanabilirsiniz. Ilk geçişte araçları bulmak, sonra ikinci geçişte ders kitabı formülü kullanarak sapmaları ve kovaryansın hesaplamak.