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

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
+20
26 января 2010, 20:39
110
kal1sha 108,8

комментарии (46)

+5
Zzet #
Также подходит для сайтов знакомств )
+5
0lympian #
Есть теория, что в знакомствах наоборот, интересен антипод (ну наверное не во всех, но как минимум в некоторых отношениях) :D
+4
Lite #
Это насчёт пола? Популярная теория. :)
0
v_k #
тогда число, наибольшее по модулю и будет решением.
+1
akalend #
алгоритм сваха
НЛО прилетело и опубликовало эту надпись здесь
–3
Ferroman #
июль?
+1
HDg #
Анализ данных скорее
–4
dizzyman #
Матан = Математический анализ
0
HDg #
Та вы что!!! У нас на примате (конечно же) такого предмета не было :(

З.Ы. Матан и анализ данных — немного разные вещи
+1
akalend #
это Статистический анализ, иногда упрощенно Статистика.
а матан — Математический Анализ.
разделяй и властвуй!
–1
deniamnet #
видимо, Вы не знаете, что такое матан
0
dizzyman #
Это вы мне? Странно, а я вроде даже такие лекции посещал… специальность 230105, 2 семестр.
0
dizzyman #
P.S.: Я, не в коем случае, не утверждаю что написанное в посте относится к математическому анализу :)
0
AlphaLight #
Математическая статистика, курс то ли 2, то ли 3 :)
0
TuKTeeK #
Осталось интересы с циферками сопоставить.
–1
kal1sha #
а что сложного?
–1
SmartT #
ага, как раз такой сервис уже делаю))) hrumm.ru
–1
Megazoll #
Наверное, блог «Социальные сети» подойдет лучше.
–2
kal1sha #
код на php
0
HDg #
та хоть на brainfuck
тематика-то то у него про социальные сети
+1
kal1sha #
Этот алгоритм применяют в экономике, биологии и во многих других областях.
0
Megazoll #
Тема поста «Рекомендации друзей для социальных сетей», не думаю что это применяется в биологии или где-то еще.
0
akalend #
имеется ввиду не тема, а математические (статистические) методы. А, область их приложения может быть сколь угодно широка (как страна моя родная).
+2
zeleniy #
Ага… типичный представитель, который программирует не с помощью языка, а на языке… очнись, товарищ, написать можно на чём угодно…
0
akalend #
согласен, в соцсетях на ура пойдет!
но все равно приятно,
что статистический анализ хоть кто-то на практике применяет.
–2
necromant2005 #
Сложность алгоритма какая? O(n^2)
намного инетресснее где сложность алгорима максимально стремится хотя бы к O(n)
–1
kal1sha #
не встречал линейную асимптотику
–2
necromant2005 #
Просто не вижу смысла в реалтизации алгоритмов с сложностью O(n^2) и выше. Чисто для интереса не более. Приболее менее приемлемом числе n — это займет часы.
+1
kal1sha #
если хранить многие значение для формулы в полях, то можно его сделать O(n)
+1
udpn #
Пруфкод алгоритмы линейной сложности в студию, это неочевидно. Крупный проект ваш алгоритм уже не потянет.

И да, засуньте вы содержимое этих циклов в один/два (с препроцессингом), у них же пределы одни и те же. Понять ваши намерения в момент, когда вы создали массивы со степенями и произведениями, я вообще не понял.

Хабраюзерам, которые сейчас радостно минуснут, напомню одну истину. Если бы ученым приходилось доказывать неверность каждой неверной идеи, мы бы дальше паровых машин не ушли бы никогда. До тех пор, пока критикующие не заходят за рамки здоровой критики, автор должен отстаивать точку зрения.
0
udpn #
Понять свои намерения, когда я писал этот семантически опасный коммент, я не понял. Мда.
0
TolicH #
Забавно, нам в любом случае надо считать для всех N пользователей «похожих» на них. Видимо есть какие-то методы, позволяющие не перебирать всех остальных N для каждого, было бы интересно узнать.
–1
kal1sha #
1. не все будут ей пользоваться, кто не хочет их и не используем
2. пусть пользователь сам настраивает кто ему надо и с какими интересами
3. если думать, можно много придумать :)
+1
lenis2000 #
Думаю, что эти методы заключаются в какой-то кластеризации, то есть, разделении пользователей сперва на группы по интересам (это также задача статистики).

Затем к пользователям из одного кластера уже можно применять более сложные и вычислительно затратные методы, чтобы получить более точные рекомендации.
0
clamps #
Рекомендую отличную книгу по данной тематике.
+1
multik #
спасибо за ссылку на книгу.
+6
getbraine #
разложи в ряд Тейлора с остачным членом в форме Пеано, и выбирай себе асимптотику…
0
akalend #
тут выбор невелик: Энтропия регрессии:
либо сложность алгоритма, либо малоэффективный обсчет.
вообще-то все численные алгоритмы можно преспокойно обсчитать в бэдграундовом процессе, даже на отдельном сервере используя С++ и пара миллионов пользователей не будет пределом
а РНР использовать фронтэндом, для чего он впрочем и предназначен.
0
xyz #
Также ето коофициент кореляции, кажется
0
kal1sha #
да
+1
lazycoder #
Замечательная статья, но «тем более вероятнее» — так не говорят, либо более вероятно, либо просто вероятнее, если не изменяет память. Да здравствует русский язык!
+2
Ino #
А при близости к -1 можно рекомендовать врагов.
+1
lenis2000 #
Может, это не враги, а наоборот, человеку бывает интересно пообщаться с новыми людьми… Технарям с филологами, и так далее :)
–2
v_k #
а по какой формуле высчитывать рейтинг, имея эти данные?
0
akalend #
а, вообще метод расчета очень похож на формирование матрицы расстояний в многомерном пространстве.
расчитываем расстояния меджу точками (критерии предпочтений).
Какие точки ближе всего, те — наши Друзья :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.