Ответ 1
Совместная фильтрация по элементам
Исходная рекомендация по позиции полностью основана на рейтинге пользовательских позиций (например, пользователь оценивает фильм с 3 звездами, или пользователь "любит" видео). Когда вы вычисляете сходство между элементами, вы не должны знать ничего, кроме истории рейтингов всех пользователей. Таким образом, сходство между элементами вычисляется на основе рейтингов вместо метаданных содержимого элемента.
Позвольте мне привести вам пример. Предположим, у вас есть доступ только к некоторым данным рейтинга, как показано ниже:
user 1 likes: movie, cooking
user 2 likes: movie, biking, hiking
user 3 likes: biking, cooking
user 4 likes: hiking
Предположим, теперь вы хотите сделать рекомендации для пользователя 4.
Сначала вы создаете инвертированный индекс для элементов, вы получите:
movie: user 1, user 2
cooking: user 1, user 3
biking: user 2, user 3
hiking: user 2, user 4
Так как это двоичный рейтинг (например, или нет), мы можем использовать меру подобия, например Jaccard Similarity, чтобы вычислить сходство элементов.
|user1|
similarity(movie, cooking) = --------------- = 1/3
|user1,2,3|
В числителе user1 является единственным элементом, в котором есть фильм и кулинария. В знаменателе объединение фильма и кулинарии имеет 3 разных пользователя (user1,2,3). |.|
обозначим размер множества. Поэтому мы знаем, что сходство между фильмом и кулинарией в нашем случае составляет 1/3. Вы просто делаете то же самое для всех возможных пар элементов (i,j)
.
После того, как вы закончите вычисление подобия для всех пар, скажем, вам нужно сделать рекомендацию для пользователя 4.
- Посмотрите на оценку подобия
similarity(hiking, x)
, где x - любые другие теги, которые у вас могут быть.
Если вам необходимо сделать рекомендацию для пользователя 3, вы можете агрегировать оценку подобия по каждому элементу в своем списке. Например,
score(movie) = Similarity(biking, movie) + Similarity(cooking, movie)
score(hiking) = Similarity(biking, hiking) + Similarity(cooking, hiking)
Рекомендация на основе контента
Точка содержания - это то, что мы должны знать содержимое как пользователя, так и элемента. Обычно вы создаете профиль пользователя и профиль элемента, используя содержимое разделяемого пространства атрибутов. Например, для фильма вы представляете его со звездами кино в нем и жанрами (например, с использованием двоичного кодирования). Для профиля пользователя вы можете сделать то же самое, основываясь на том, что пользователи любят некоторые кинозвезды/жанры и т.д. Тогда сходство пользователя и элемента может быть вычислено, например, с помощью косинусного сходства.
Вот конкретный пример:
Предположим, что это наш профиль пользователя (с использованием двоичного кодирования, 0 означает не-похожее, 1 означает), который содержит предпочтение пользователя более 5 звезд кино и 5 жанров фильмов:
Movie stars 0 - 4 Movie Genres
user 1: 0 0 0 1 1 1 1 1 0 0
user 2: 1 1 0 0 0 0 0 0 1 1
user 3: 0 0 0 1 1 1 1 1 1 0
Предположим, что это наш профиль фильма:
Movie stars 0 - 4 Movie Genres
movie1: 0 0 0 0 1 1 1 0 0 0
movie2: 1 1 1 0 0 0 0 1 0 1
movie3: 0 0 1 0 1 1 0 1 0 1
Чтобы вычислить, насколько хорош фильм для пользователя, мы используем сходство с косинусом:
dot-product(user1, movie1)
similarity(user 1, movie1) = ---------------------------------
||user1|| x ||movie1||
0x0+0x0+0x0+1x0+1x1+1x1+1x1+1x0+0x0+0x0
= -----------------------------------------
sqrt(5) x sqrt(3)
= 3 / (sqrt(5) x sqrt(3)) = 0.77460
Аналогично:
similarity(user 2, movie2) = 3 / (sqrt(4) x sqrt(5)) = 0.67082
similarity(user 3, movie3) = 3 / (sqrt(6) x sqrt(5)) = 0.54772
Если вы хотите дать одну рекомендацию для пользователя i
, просто выберите фильм j
, который имеет самый высокий similarity(i, j)
.
Надеюсь, это поможет.