<?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在产品打分上完全相反,最后得到的相似度也很低,符合客观事实