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