Почему рекомендация — это не угадайка, а задача про предпочтения
Когда пользователь видит подборку фильмов, товаров или курсов, кажется, будто система каким-то образом «понимает вкус». На деле рекомендательная система строит приближение предпочтений по наблюдаемым сигналам: просмотрам, покупкам, лайкам, кликам, времени удержания и другим взаимодействиям. То есть она не читает мысли, а пытается восстановить скрытую структуру интересов по истории поведения.
Именно поэтому в рекомендательных системах почти всегда есть два слоя: данные о взаимодействиях и модель, которая превращает их в оценку того, что может понравиться дальше.
Как часто выглядит базовая идея
$$ \hat r_{ui} = p_u^\top q_i $$В матричной факторизации и многих похожих подходах оценка интереса пользователя к объекту получается как скалярное произведение двух скрытых векторов: пользовательского и объектного.
\hat r_{ui}— предсказанный интерес пользователя u к объекту ip_u— вектор скрытых предпочтений пользователяq_i— вектор скрытых характеристик объекта^\top— операция транспонирования для вычисления скалярного произведения
Интуитивно это значит, что и пользователь, и объект описываются в одном скрытом пространстве. Если их направления хорошо совпадают, оценка будет высокой. Это очень красивая геометрическая идея: система не хранит явный список правил, а учится размещать пользователей и объекты в общем смысловом пространстве.
Почему задача сложнее, чем кажется
Во-первых, пользовательские предпочтения меняются. Во-вторых, система почти всегда наблюдает только часть сигналов: отсутствие клика не обязательно означает отсутствие интереса. В-третьих, есть проблема cold start — новые пользователи и новые объекты. В-четвертых, сама метрика качества в рекомендациях не так проста: нужен баланс между точностью, новизной, разнообразием и полезностью для бизнеса.
Поэтому хорошая рекомендация — это не только модель, но и постановка того, какое именно действие мы считаем успешным.
Как показать идею на Python
import pandas as pd # создаем таблицу простых пользовательских взаимодействий
interactions = pd.DataFrame({ # задаем пользовательско-объектные оценки интереса
'user_id': [1, 1, 2, 2, 3, 3], # идентификатор пользователя
'item_id': ['A', 'B', 'A', 'C', 'B', 'C'], # идентификатор объекта
'score': [5, 3, 4, 5, 2, 4], # наблюдаемый сигнал интереса
})
matrix = interactions.pivot_table(index='user_id', columns='item_id', values='score', fill_value=0) # строим пользователь-объектную матрицу
similarity = matrix.T.corr() # грубо оцениваем близость пользователей по истории взаимодействий
print(matrix) # смотрим базовое представление взаимодействий
print(similarity.round(3)) # читаем приближенную похожесть пользователейЭто еще не полноценная рекомендательная система, но уже видно, как сырые действия превращаются в структуру, с которой можно работать. А дальше на этой структуре уже строятся более серьезные модели и стратегии ранжирования.