Идея коллаборативной фильтрации

Урок вводит главную идею классических рекомендаций: предпочтения можно предсказать по поведению похожих пользователей и сходству товаров, не зная их содержания.

Коллаборативная фильтрация (CF) — семейство методов, которые рекомендуют объекты на основе совпадений в поведении многих пользователей, а не на основе свойств самих объектов.

«Сарафанное радио» в коде

Идея проста и человечна: если вкусы Ани и Бориса совпадали в десяти фильмах, то одиннадцатый фильм, который понравился Ане, скорее всего понравится и Борису. Мы не разбираем, почему фильм хорош (жанр, актёры, сюжет) — мы просто замечаем, что люди с похожим поведением ведут себя похоже и дальше. Это коллективная мудрость толпы, превращённая в алгоритм.

Сила подхода в том, что он работает с любыми объектами без понимания их сути: фильмы, товары, песни, статьи. Системе не нужно знать, что такое «киберпанк» — достаточно матрицы взаимодействий.

Два взгляда на одну матрицу

Коллаборативная фильтрация делится на два зеркальных подхода.

  • User-based: «найди пользователей, похожих на меня, и порекомендуй то, что нравится им». Похожесть считается между строками матрицы.
  • Item-based: «найди товары, похожие на те, что мне уже понравились». Похожесть считается между столбцами матрицы.
            товары -->
         |  i1  i2  i3
  u1     |  5   ?   4     user-based: ищем строки, похожие на u1
  u2     |  4   1   5
  u3     |  1   5   2
            ^
            item-based: ищем столбцы, похожие на i1

Маленький пример идеи

Покажем суть на двух пользователях: у кого вкусы ближе к целевому — тот и «советчик».

target = {"Матрица": 5, "Аватар": 4}
friendA = {"Матрица": 5, "Аватар": 5, "Дюна": 5}
friendB = {"Матрица": 1, "Аватар": 2, "Титаник": 5}

def overlap_score(t, f):
    common = set(t) & set(f)
    return sum(1 for i in common if abs(t[i] - f[i]) <= 1)

print("Совпадений с A:", overlap_score(target, friendA))
print("Совпадений с B:", overlap_score(target, friendB))
print("Советчик:", "A (порекомендуем 'Дюна')")

Вывод:

Совпадений с A: 2
Совпадений с B: 0
Советчик: A (порекомендуем 'Дюна')

Как работает под капотом

Любая CF-система делает два шага: считает меру похожести между парами (пользователей или товаров) и затем агрегирует оценки «соседей» во взвешенный прогноз. Качество целиком зависит от того, насколько хорошо мера похожести ловит реальное сходство вкусов на разреженных данных — этому посвящены следующие уроки.

Частые ошибки

  • Думать, что CF понимает контент. Она не знает жанров и сюжетов — только паттерны взаимодействий.
  • Игнорировать холодный старт. Новому пользователю или товару без истории CF ничего сказать не может.
  • Считать похожесть по одному общему товару. Одно пересечение — это шум; нужна устойчивая статистика.

Итоги

  • CF рекомендует по совпадениям в поведении, а не по свойствам объектов.
  • User-based ищет похожих пользователей, item-based — похожие товары.
  • Любая CF состоит из меры похожести и агрегации оценок соседей.
  • CF беспомощна без истории — отсюда проблема холодного старта.
Проверьте себя
1. На чём основана коллаборативная фильтрация?
AНа свойствах товаров (жанр, цена, бренд)
BНа совпадениях в поведении многих пользователей
CНа случайном выборе
DНа описаниях товаров
2. Чем отличаются user-based и item-based подходы?
AUser-based считает похожесть между строками (пользователями), item-based — между столбцами (товарами)
BUser-based быстрее работает
CЭто одно и то же
DItem-based не использует матрицу