Ответ
Классические подходы к построению рекомендательных систем делятся на несколько семейств.
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 + контентная) для преодоления недостатков каждого в отдельности (проблема холодного старта, разреженность данных).