Pull to refresh

Рекомендации друзей для социальных сетей

PHP *
Не давно писал как можно рекомендовать товар в Интернет-магазинах или других местах, используя информацию о пользователе. Сейчас хочу показать алгоритм, который позволяет рекомендовать друзей, например в социальных сетях.

Первый шаг, представим информацию о пользователя в интервальной шкале и рекомендуем пользователю друзей используя коэффициент корреляции Пирсона, который будет измеряет степень линейной зависимости между двумя интервальными переменными. Например, у нас есть 4 пользователя: Дима, Анна, Петя и Саша. Мы знаем о них информацию, которую представляем в виде чисел в массиве (интересы, блоги, возраст и т.д.)

<?php
//Dima
$name[0]=array(1,4,5,5,4);
//Anna
$name[1]=array(3,5,6,5,4);
//Petr
$name[2]=array(3,2,4,2,1);
//Sasha
$name[3]=array(5,4,3,1,1);


Коэффициент Пирсона выглядит так:

image

где xi и yi — сравниваемые количественные признаки
n – число сравниваемых наблюдений

На втором шаге, мы вставляем значение в формулу и смотрим какие пользователи подходят для Димы:
$n=5;
$x=$name[0];
$y=$name[1];

for ($j=1;$j<count($name);$j++) {
$x=$name[0];
$y=$name[$j];
//begin
$s_x=0;
$s_y=0;
$s_pow_x=0;
$s_pow_y=0;
$s_x_y=0;

//x*y
for ($i=0;$i<5;$xy[$i]=$x[$i]*$y[$i],$i++);
//x pow 2
for ($i=0;$i<5;$x_pow_2[$i]=$x[$i]*$x[$i],$i++);
//y pow 2
for ($i=0;$i<5;$y_pow_2[$i]=$y[$i]*$y[$i],$i++);
//Summa xi
for ($i=0;$i<5;$s_x+=$x[$i],$i++);
//Summa yi
for ($i=0;$i<5;$s_y+=$y[$i],$i++);
//Summa x pow 2
for ($i=0;$i<5;$s_pow_x+=$x_pow_2[$i],$i++);
//Summa y pow 2
for ($i=0;$i<5;$s_pow_y+=$y_pow_2[$i],$i++);
//Summa x*y
for ($i=0;$i<5;$s_x_y+=$xy[$i],$i++);

$r_x_y=(($n*$s_x_y)-($s_x*$s_y))/sqrt((($n*$s_pow_x) - ($s_x*$s_x))*(($n*$s_pow_y) - ($s_y*$s_y)));
print $r_x_y;
}


Чем значение больше приближена к 1, тем более вероятнее, что их интересы совпадают с его интересами:
Имя
Он наш друг
Величина на выходе
Аня
(80%)
0.880704845928
Петя
(0%)
-0.0800640769025
Саша
(0%)
-0.697424162876
Tags:
Hubs:
Total votes 38: ↑29 and ↓9 +20
Views 1.5K
Comments Comments 46