سؤال

أحاول تنفيذ حساب معامل الارتباط بين الناس بين مجموعتين من البيانات في PHP. أنا فقط أحاول القيام برمجيات Porting Python التي يمكن العثور عليها في عنوان URL هذاhttp://answers.oreilly.com/topic/1066-how-to-find-similar-users-with-python/

تنفيذي هو ما يلي:

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;

}
}

التوضيح لفهم الكود بشكل أفضل، الطريقة fetchallpreeferences عودة مجموعة من الكائنات التي هي في الواقع العناصر، ويقوم بتحويلها إلى صفيف لسهولة الإدارة

لست متأكدا من أن هذا التنفيذ صحيح، على وجه الخصوص لدي شكوك حول صحة حساب القاسم.

أي نصيحة موضع ترحيب.

شكرا مقدما!

هل كانت مفيدة؟

المحلول

خوارزمية الخاص بك تبدو صحيحة رياضيا ولكن غير مستقرة عدديا. العثور على مجموع المربعات صراحة وصفة لكارثة. ماذا لو كان لديك أرقام مثل array(10000000001, 10000000002, 10000000003)ب خوارزمية تمريرة واحدة مستقرة عددي لحساب التباين يمكن أن يكون وجدت على ويكيبيديا, ، ويمكن تطبيق نفس المبدأ على حساب التباين.

أسهل حتى الآن، إذا كنت لا تهتم كثيرا بالسرعة، فيمكنك فقط استخدام تمرينين. ابحث عن الوسائل في المرة الأولى، ثم حساب الفروق والبغاء باستخدام صيغة الكتب المدرسية في الممر الثاني.

نصائح أخرى

هذا هو الحل الخاص بي:

function php_correlation($x,$y){
    if(count($x)!==count($y)){return -1;}   
    $x=array_values($x);
    $y=array_values($y);    
    $xs=array_sum($x)/count($x);
    $ys=array_sum($y)/count($y);    
    $a=0;$bx=0;$by=0;
    for($i=0;$i<count($x);$i++){     
        $xr=$x[$i]-$xs;
        $yr=$y[$i]-$ys;     
        $a+=$xr*$yr;        
        $bx+=pow($xr,2);
        $by+=pow($yr,2);
    }   
    $b = sqrt($bx*$by);
    if($b==0) return 0;
    return $a/$b;
}

http://profprog.ru/korrelyaciya-na-php-php-simple-pearson-correlation/

جرب الحزمة الخاصة بي هنا

http://www.phpclasses.org/browse/package/5854.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top