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

Ответ

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

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

Ответ 18+ 🔞

Да ты посмотри, какая тут овердохуища подходов развелось, чтобы людям что-то посоветовать! Прямо как на базаре — выбирай, не хочу. Ну ладно, разберём по полочкам, а то голова кругом пойдёт.

1. Коллаборативная фильтрация (Collaborative Filtering - CF): Суть проще пареной репы: смотрим, кто что делал раньше — что смотрел, что покупал, что оценил. Всё, как в жизни: если два чувака дохуя раз вместе в сортир ходили курить, то, наверное, и сигареты у них одинаковые.

  • User-Based CF: Тут логика простая, как три копейки — «похожим людям нравится похожее». Находим соседей нашему пользователю, которые на него похожи, и суём ему то, что у этих соседей в фаворитах. Типа, если Вася и Петя оба смотрели «Бригаду» и «Бумера», то Васе можно смело предлагать то, что Петя недавно лайкнул.
  • Item-Based CF: А это уже хитрее. Тут мы товары между собой сравниваем. Логика: «Людям, которым зашёл товар X, обычно и товар Y заходит». Считаем, насколько один фильм или книга похожи на другую (обычно через косинусное сходство, этакую хитрожопую математику), и вуаля — рекомендация готова.

Вот тебе пример, как это в коде выглядит, чтоб не быть голословным:

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

# Матрица, где строки — пользователи, а столбцы — товары. Цифры — оценки.
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
target_item_idx = 0
# Сортируем по убыванию сходства и берём топ-2, исключая сам товар (он себе самый похожий, ёпта)
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 или нейросетевые эмбеддинги, чтобы понять смысл. В общем, пытаемся читать мысли через метаданные.

3. Матричные разложения (Matrix Factorization): Вот тут уже начинается магия, чувак. Берём нашу огромную и дырявую, как решето, таблицу «пользователь-товар» и пытаемся разложить её на две маленькие и плотные. Типа вычленить скрытые смыслы или темы. SVD и особенно ALS — это священные коровы этой темы, на них пол-интернета держится. Помнишь тот конкурс Netflix, где миллион долларов давали? Так вот, они там вовсю использовались.

Глянь, как это в surprise делается, чтоб не бздеть:

from surprise import SVD, Dataset, Reader
from surprise.model_selection import train_test_split

# Готовим данные: кто, что и как оценил
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)

# Создаём и обучаем модель SVD
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.2!

4. Гибридные системы: Ну а это, бля, вершина эволюции. Когда одной штуки мало, берут всё и мешают в кучу. Коллаборативную фильтрацию скрещивают с контентной, чтобы победить главные проблемы: когда новый пользователь пришёл (холодный старт, ему не на что смотреть) или когда данных вообще кот сука собака налакался. Гибридная система как хитрая жопа — и там подстрахует, и тут подтянет. В общем, доверия к такой уже побольше, чем ноль ебать.

Вот и вся наука, если без соплей. Выбирай, что душе угодно, только не охуей от выбора.