2013-05-04 3 views
20

Я озадачен о том, что эта рекомендация элемент на основе находится в "погонщик в действии" .Есть алгоритм в книге:Что разница между Collaborative Filtering Item на основе рекомендации и содержания на основе рекомендации

for every item i that u has no preference for yet 
    for every item j that u has a preference for 
    compute a similarity s between i and j 
    add u's preference for j, weighted by s, to a running average 
return the top items, ranked by weighted average 

что я могу рассчитать сходство между пунктами? Если вы используете контент, это не рекомендация на основе контента?

ответ

91

товара на основе Collaborative Filtering

Первоначальная рекомендация товара на основе является полностью на основе пользовательского пункта рейтинга (например, пользователь оценили фильм с 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| 

В числителе пользователь1 является единственным элементом, который имеет кино и кулинария. В знаменателе объединение фильма и кулинарии имеет 3 разных пользователя (user1,2,3). |.| здесь обозначают размер набора. Поэтому мы знаем, что сходство между фильмом и кулинарией в нашем случае составляет 1/3. Вы просто делаете то же самое для всех возможных пар предметов (i,j).

После того, как вы закончите с вычислением подобия для всех пар, скажем, вам нужно сделать рекомендацию для пользователя 4.

  • Посмотрите на сходство в similarity(hiking, x) где х любые другие теги, вы, возможно, ,

Если вам необходимо сделать рекомендацию для пользователя 3, вы можете суммировать оценку подобия от каждого элемента в своем списке. Например,

score(movie) = Similarity(biking, movie) + Similarity(cooking, movie) 
score(hiking) = Similarity(biking, hiking) + Similarity(cooking, hiking) 

Content-Based Рекомендация

Точка содержания на основе является то, что мы должны знать содержание как пользователя, так и ст. Обычно вы создаете профиль пользователя и профиль элемента, используя содержимое разделяемого пространства атрибутов. Например, для фильма вы представляете его со звездами кино в нем и жанрами (например, с использованием двоичного кодирования). Для профиля пользователя вы можете сделать то же самое, основываясь на том, что пользователи любят некоторые кинозвезды/жанры и т. Д. Тогда сходство пользователя и элемента может быть вычислено, например, с помощью косинусного сходства.

Вот конкретный пример:

Пусть это наш пользовательский профиль (с использованием двоичного кодирования, 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 

чтобы вычислить, насколько хорошо фильм для пользователя, мы используем cosine similarity:

        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).

Надеюсь, это поможет.

+1

спасибо за сообщение, и это настолько подробно. – cstur4

+0

У Cooking 2 пользователей? –

4

«На основе предметов» на самом деле означает «позиция на основе подобия». Здесь вы можете поместить любую метрику сходства. Да, если он основан на контенте, как сходство с косинусом по векторам векторов, вы также можете назвать это «основанным на содержании».

+1

Отличная честь получить ваш ответ. И для того, чтобы сравнить эффект двух методов рекомендации, я использую RMSRecommenderEvaluator для оценки. Хотя с тем же параметром, но он не может гарантировать одинаковые данные обучения и оценивать данные. Что я могу сделать, чтобы сравнить их с теми же данными? – cstur4

+0

Вы имеете в виду, что набор случайных тренировок отличается? Попробуйте вызвать «RandomUtils.useTestSeed()» перед тем, как что-либо еще выполнится. –

+0

Но я хочу запустить несколько тестовых примеров, и я хочу, чтобы результат был другим. – cstur4