1. 程式人生 > >推薦演算法之-皮爾遜相關係數計算兩個使用者喜好相似度

推薦演算法之-皮爾遜相關係數計算兩個使用者喜好相似度

<?php
/**
 * 餘玄相似度計算出3個使用者的相似度
 * 通過7件產品分析使用者喜好相似度
 * 相似度使用函式 sim(user1,user2) =cos∂
 *
 * 設A、B為多維矩陣
 *
 *          ∑(Ai•Bi)            ∑(Ai•Bi)            ∑(USER1_i•USER2_i)
 * cos∂ = --------------- = -----------------  =  -------------------------
 *          |Ai|•|Bi|          √∑ Ai² • √∑ Bi²     √∑ USER1_i² • √∑ USER2_i²
 */

$infoTable = [
    'user1' => [
        5, 5, 4, 7, 8, 9, 4, //  分別為產品1評分,產品2評分,產品3評分,產品4評分,產品5評分,產品6評分,產品7評分
    ],
    'user2' => [
        1, 9, 1, 9, 2, 2, 8,
    ],
    'user3' => [
        5, 5, 5, 7, 8, 9, 3,
    ],
    'user4' => [
        9, 1, 9, 1, 8, 9, 1,
    ],
];

function calc($user1, $user2)
{
    global $infoTable;

    $sumAiBi = 0;
    $sumAi   = 0;
    $sumBi   = 0;
    $len     = 7; //7個產品
    for ($i = 0; $i < $len; $i++) {
        //∑(Ai•Bi)
        $sumAiBi += $infoTable[$user1][$i] * $infoTable[$user2][$i];

        //∑USER1_i
        $sumAi += pow($infoTable[$user1][$i], 2);

        //∑USER2_i
        $sumBi += pow($infoTable[$user2][$i], 2);
    }

    return $sumAiBi / (sqrt($sumAi) * sqrt($sumBi));

}

echo 'user1 & user2=' . calc('user1', 'user2') . PHP_EOL;
echo 'user1 & user3=' . calc('user1', 'user3') . PHP_EOL;
echo 'user2 & user3=' . calc('user2', 'user3') . PHP_EOL;
echo 'user2 & user4=' . calc('user2', 'user4') . PHP_EOL;

從上面可以看出user2和user4在產品打分上完全相反,最後得到的相似度也很低,符合客觀事實