Алгоритм коллаборативной фильтрации

PHP*
Коллаборативная фильтрация (англ. collaborative filtering) — это метод, который даёт автоматические прогнозы исходя из наколенной информации о интересах и вкусах пользователей.

Чаще всего можно рекомендовать музыку или книги уже имея какие-то данные о пользователе. Например, Amazon или Ozon запоминают, что я ищу или куда ходил и из этих данных строит мне рекомендацию. Но лучше, чтобы пользователь сам вводил их в свой профиль, можно даже ему рассказать, что у вас эта система стоит и чтобы он сам мог выбирать что ему дать в следующий раз.

Можно прикрутить OpenSlopeOne, который написан китайским программистом.

Рассмотрим пример. В книжном магазине есть 4 пользователя: Вася, Женя, Юра, Лариса и 8 товаров. Про каждого мы имеем информацию:

Имя Купил (id) Просмотрел (id)
Вася 1,6,7 2,3
Женя 1,2,3 5,7,4
Юра 7,8 1,4
Лариса 8 6


Настройка алгоритма:

config.ini.php
; <?php exit; ?> DO NOT REMOVE THIS LINE
[database]
host = localhost
username = ваш логин в mysql
password = ваш пароль в mysql
dbname = имя бд
port = 3306
adapter = PDO_MYSQL ; PDO_MYSQL or MYSQLI


Создаем две таблицы:

CREATE TABLE IF NOT EXISTS oso_user_ratings (
user_id int(11) NOT NULL, item_id int(11) NOT NULL, rating decimal(14,4) NOT NULL default '0.0000', KEY item_id (item_id), KEY user_id (user_id,item_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS oso_slope_one (
item_id1 int(11) NOT NULL, item_id2 int(11) NOT NULL, times int(11) NOT NULL, rating decimal(14,4) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Таблица oso_user_ratings предназначена для хранении информации о пользователях. Если пользователь купил то ставим 1 в поле rating, если не купил, то ставим 0 (правильно нужно рассчитывать по формуле: подобие предметов как косинус между векторами покупок в матрице пользователей и предметов, но для примера я покажу принцип). И соответственно в полях user_id вводим id пользователя и в item_id вводим id товара.

Принцип заключается в том, что в таблице oso_slope_one генерирует каждый товар по весу. Например, если Петя купил этот товар, и мой товар купленный есть у Пети, то логично думать, что товары Пети могут подойти ко мне. Чем больше совпадений с пользователями, тем больший процент, что этот товар мне надо. SlopeOne переводится как наклон к одному, то есть он мне в первую очередь выводит, те продукты, которые имеют наибольший приоритет (купил) у других пользователей с общими интересами.

test.php
<?php
require './OpenSlopeOne.php';
$openslopeone = new OpenSlopeOne();
$openslopeone->initSlopeOneTable();
$openslopeone->initSlopeOneTable('MySQL');
//выводим рекомендации по пользователю с id 1
var_dump($openslopeone->getRecommendedItemsByUser(1));
?>


Алгоритм мне порекомендовал:
— 8 товар Ларисы, т.к. мой купленный товар 6 она просмотрела.
— он мне порекомендовал 2,3 товар, который во первых купил Женя с моим общим товаром с id 1 и в добавок я его уже просматривал
— и т.д.

Есть маленькая ошибка он мне выводим также те товары, которые пользователь купил с общими интересами но он уже у меня есть. Это из-за того, что мы в таблицу записывали данные не по формуле, а 0 или 1.
Моя цель была просто показать принцип работы и дать пищу для размышления и отчего вы должны отталкиваться. Также каждый алгоритм нужно подкручивать под свою публику.


P.S. Если кто знаком с рекомендациями дополняйте в комментариях. Может даже в моей статье есть ошибки, т.к. сильно не тестил, а проект в котором применял алгоритм находится в стадии разработки.
+29
16 января 2010, 21:34
138
kal1sha 108,8

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

+6
fata1ex #
Советую по этой теме первые несколько глав из «Программируем коллективный разум». Примеры на python, но все очень доступно.
+2
Silentium #
; <?php exit; ?> DO NOT REMOVE THIS LINE

Понравилось решение, хоть я и не использую ini для конфигов.
+1
developer #
это не INI, а ini.php, сделано для апача, но имхо не красивое решение.
0
akirsanov #
ну почему же, вполне красиво, и вариант с инклудом файла конфига (даже в случае уязвимости на сайте) не сработает.
Ещё как вариант при наличии апача называть конфиг файл .htconfig, ^\.ht префиксы апач закрывает сам.
+1
Silentium #
этот вариант хорош тем, что не зависит от конкретного сервера
0
yktoo #
> из наколенной информации

Понравилось, хороший алгоритм.
+3
highw #
2 недели назад сдал курсак на тему «рекомендательные системы».

скажу, что это простовато.
+5
iv1 #
Поделитесь своими наработками, пожалуйста.
+1
ITdirector #
Расскажите, очень интересно )
+1
s3m #
Опубликуйте наработки или поделитесь, если не жалко.
–2
alexol #
Очень во время… только пару дней назад подумал о внедрении подобных алгоритмов, теперь есть от чего плясать.
Если кто-то подкинет еще ссылок по теме, буду признателен.

*Заранее прошу прощения, не смогу плюсануть ((( карма что б ее…
0
alexol #
По пробую сам. Вникая дальше в тему, больше всег овремени я потратил на прочтение патентов по коллаборативной фильтрации, но не нашел чего либо стоящего, в основном там амазоновские патенты были.

По теме, как оказалось не так то много материалов. В основном это работа с SlopeOne и обсуждение работы алгоритма Netflix.

Netflix позволяет работать с их алгоритмом посредством API developer.netflix.com/, сам пока еще не пробовал, но судя по отзывам то неплохо.

Еще тут неплохой анализ темы и с линками на не мнее интерестный материал inventure.ru/blog/2008/10/05/kollaborativnaya-filtraciya/
0
mefa #
Я писал как-то небольшой цикл статей на эту тему. Они достаточно поверхностны, но может Вы сможете от них оттолкнуться. habrahabr.ru/blogs/data_mining/57885/
0
Nc_Soft #
Была статья месяца 3 назад про рекоммендательный алгоритм озона, там что-то со скалярным произведением векторов.
+1
mefa #
Я лично Slope One не испытывал, но некоторые результаты тестов показывают, что он хоть и прост, но достаточно эффективен. Он хорошо описан в этой статье arxiv.org/abs/cs/0702144
0
taliban #
"… и мой товар купленный есть у Пети ..."
кажется поменять надо местами слова мне (с) йода

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