Обновить

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

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. Если кто знаком с рекомендациями дополняйте в комментариях. Может даже в моей статье есть ошибки, т.к. сильно не тестил, а проект в котором применял алгоритм находится в стадии разработки.
Теги:openslopeoneslope onephpрекомендации
Хабы: PHP
Рейтинг +29
Количество просмотров 13k Добавить в закладки 149
Комментарии
Комментарии 16

Похожие публикации

Лучшие публикации за сутки