Какие классические алгоритмы рекомендательных систем вы знаете?

«Какие классические алгоритмы рекомендательных систем вы знаете?» — вопрос из категории Рекомендательные системы, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Классические подходы к построению рекомендательных систем делятся на несколько семейств.

1. Коллаборативная фильтрация (Collaborative Filtering - CF): Основана на историческом поведении пользователей (оценки, просмотры, покупки).

  • User-Based CF: "Похожим пользователям нравятся похожие товары". Находим k-NN для целевого пользователя и рекомендуем то, что понравилось его соседям.
  • Item-Based CF: "Людям, которым понравился товар X, также нравится товар Y". Вычисляем попарные сходства между товарами (чаще через косинусную меру или корреляцию Пирсона) и рекомендуем наиболее похожие.

Пример Item-Based CF с использованием матрицы взаимодействий:

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# user-item матрица (пользователи x товары)
interaction_matrix = np.array([[5, 3, 0, 1],
                               [4, 0, 0, 1],
                               [1, 1, 0, 5],
                               [0, 0, 0, 4]])

# Вычисляем сходство между товарами (по столбцам)
item_similarity = cosine_similarity(interaction_matrix.T)

# Для товара 0 находим топ-2 похожих товара
target_item_idx = 0
similar_items = np.argsort(item_similarity[target_item_idx])[::-1][1:3]  # исключаем сам товар
print(f"Товары, похожие на {target_item_idx}: {similar_items}")

2. Контентная фильтрация (Content-Based Filtering): Рекомендации на основе атрибутов пользователей и товаров.

  • Для текста (описания, новости) используют TF-IDF или эмбеддинги (Word2Vec, BERT) для векторизации и косинусное сходство.
  • Для товаров с метаданными (жанр, актеры, год) можно строить профиль пользователя как средний вектор понравившихся товаров.

3. Матричные разложения (Matrix Factorization):

  • SVD (Singular Value Decomposition) и его вероятностная версия. Алгоритм ALS (Alternating Least Squares) эффективно решает задачу в разреженных матрицах (как user-item). Лежит в основе знаменитого конкурса Netflix Prize.
  • Библиотека surprise в Python предоставляет готовые реализации.
    
    from surprise import SVD, Dataset, Reader
    from surprise.model_selection import train_test_split

Загрузка данных в формате 'user', 'item', 'rating'

reader = Reader(rating_scale=(1, 5)) data = Dataset.load_from_df(df[['user_id', 'item_id', 'rating']], reader)

trainset, testset = train_test_split(data, test_size=0.25)

algo = SVD(n_factors=100, n_epochs=20, lr_all=0.005, reg_all=0.02) algo.fit(trainset)

Предсказание рейтинга для пользователя 1 товару 10

pred = algo.predict(uid='1', iid='10') print(pred.est)



**4. Гибридные системы:** Комбинируют несколько подходов (например, CF + контентная) для преодоления недостатков каждого в отдельности (проблема холодного старта, разреженность данных).