Обязательно

Коллаборативная фильтрация

Классика RecSys — рекомендуем на основе похожих пользователей и товаров

Время изучения: 20 мин

Что такое коллаборативная фильтрация

Коллаборативная фильтрация (Collaborative Filtering, CF) — самый классический подход в RecSys. Идея: рекомендуем на основе коллективного поведения пользователей, не зная ничего о самих товарах. Если люди с похожим вкусом любили одно и то же — вероятно, им понравятся и другие общие вещи.

CF работает с матрицей user-item: строки — пользователи, столбцы — товары, значения — оценки или факты взаимодействия. Задача — заполнить пустые ячейки. Два основных варианта: User-based CF и Item-based CF.

User-based CF

Алгоритм: для целевого пользователя u находим K ближайших соседей (самых похожих пользователей), смотрим что им нравилось, и рекомендуем это пользователю u.

  • Шаг 1: Для каждой пары пользователей (u, v) считаем сходство sim(u, v)
  • Шаг 2: Для пользователя u выбираем K самых похожих (k-nearest neighbors)
  • Шаг 3: Предсказываем оценку товара i как взвешенное среднее оценок соседей

Формула предсказания оценки:

r^u,i=rˉu+vN(u)sim(u,v)(rv,irˉv)vN(u)sim(u,v)\hat{r}_{u,i} = \bar{r}_u + \frac{\sum_{v \in N(u)} \text{sim}(u, v) \cdot (r_{v,i} - \bar{r}_v)}{\sum_{v \in N(u)} |\text{sim}(u, v)|}

Здесь r̄_u — средняя оценка пользователя u (нормализуем, потому что кто-то ставит все пятёрки, а кто-то — все тройки), N(u) — множество K ближайших соседей.

Item-based CF

Вместо «похожих пользователей» ищем «похожие товары». Если пользователю понравился фильм A, и фильмы A и B часто оценивают одинаково — рекомендуем фильм B.

  • Шаг 1: Для каждой пары товаров (i, j) считаем сходство sim(i, j) по столбцам матрицы
  • Шаг 2: Для товара i, который нужно оценить, берём K самых похожих товаров, которые пользователь уже оценил
  • Шаг 3: Предсказание — взвешенное среднее оценок пользователя на похожих товарах
r^u,i=jN(i)sim(i,j)ru,jjN(i)sim(i,j)\hat{r}_{u,i} = \frac{\sum_{j \in N(i)} \text{sim}(i, j) \cdot r_{u,j}}{\sum_{j \in N(i)} |\text{sim}(i, j)|}

Меры сходства

Cosine Similarity

Косинусное сходство — самая популярная мера. Считает косинус угла между двумя векторами:

sim(a,b)=abab=iaibiiai2ibi2\text{sim}(\mathbf{a}, \mathbf{b}) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \cdot \|\mathbf{b}\|} = \frac{\sum_i a_i b_i}{\sqrt{\sum_i a_i^2} \cdot \sqrt{\sum_i b_i^2}}

Значение от -1 (полная противоположность) до 1 (полное сходство). Не зависит от «масштаба» — работает корректно даже если один пользователь ставит оценки 1-5, а другой 3-5.

Pearson Correlation

Корреляция Пирсона — по сути, cosine similarity на центрированных данных (вычитаем среднее):

sim(u,v)=i(ru,irˉu)(rv,irˉv)i(ru,irˉu)2i(rv,irˉv)2\text{sim}(u, v) = \frac{\sum_i (r_{u,i} - \bar{r}_u)(r_{v,i} - \bar{r}_v)}{\sqrt{\sum_i (r_{u,i} - \bar{r}_u)^2} \cdot \sqrt{\sum_i (r_{v,i} - \bar{r}_v)^2}}

Pearson лучше обрабатывает разницу в «строгости» оценок: если Алиса ставит в среднем 4, а Боб — 2, но их предпочтения одинаковые, cosine покажет разницу, а Pearson — сходство.

User-based vs Item-based: когда что лучше

  • Item-based CF стабильнее: предпочтения товаров меняются редко, а вкусы пользователей — постоянно. Матрицу сходства товаров можно пересчитывать реже
  • Item-based CF масштабируется лучше: товаров обычно меньше, чем пользователей (хотя не всегда)
  • User-based CF лучше ловит неожиданные рекомендации (serendipity): «похожий пользователь смотрел совершенно другой жанр»
  • Amazon использует Item-based CF — «С этим товаром покупают». Это один из самых успешных примеров CF в продакшене

Почему Item-based CF обычно лучше User-based?

1) Стабильность: отношения между товарами меняются медленнее, чем вкусы пользователей. 2) Масштабируемость: сходства товаров можно предпосчитать оффлайн. 3) Объяснимость: «Вам нравится X → рекомендуем похожий Y» понятнее, чем «Похожие пользователи любят Y».

Проблемы коллаборативной фильтрации

Разреженность (Sparsity)

Матрица user-item заполнена на 0.01-1%. У большинства пар пользователей нет общих оценённых товаров → сходство посчитать невозможно или ненадёжно. Это главная боль CF.

Масштабируемость (Scalability)

Подсчёт сходства для всех пар — O(n²). При миллионах пользователей это нереально. Решения: LSH (Locality-Sensitive Hashing), approximate nearest neighbors (FAISS, Annoy), предпосчёт оффлайн.

Popularity Bias

CF склонна рекомендовать популярное: у популярных товаров больше оценок → они чаще оказываются «похожи» на многие товары. Длинный хвост каталога остаётся незамеченным.

kNN-based подходы

Коллаборативная фильтрация в своей основе — это k-nearest neighbors (kNN). Ключевые гиперпараметры:

  • K (число соседей): маленький K — шумные рекомендации, большой K — размытые. Типичные значения: 20-50
  • Мера сходства: cosine, Pearson, Jaccard (для implicit feedback)
  • Минимальное число общих элементов: не считаем сходство, если пользователи/товары пересекаются менее чем по N элементам
  • Нормализация: вычитание среднего (mean-centering), z-score нормализация

На практике kNN-based CF до сих пор работает удивительно хорошо как baseline и часто используется в production наряду с более сложными моделями.

Итого

  • CF рекомендует на основе коллективного поведения, не зная свойств товаров
  • User-based CF: ищем похожих пользователей → рекомендуем что нравится им
  • Item-based CF: ищем похожие товары → рекомендуем похожее на то что уже нравится
  • Cosine similarity и Pearson correlation — основные меры сходства
  • Item-based обычно лучше: стабильнее, масштабируемее, объяснимее
  • Главные проблемы: разреженность, масштабируемость, popularity bias
  • kNN-based CF — хороший baseline, до сих пор используется в продакшене