Mahout контент-сходство

Я создал пользовательское сходство элементов, которое имитирует сходство содержимого на основе таксономии продукта. У меня есть пользователь, которому нравятся только две вещи:

UserId    ItemId      Preference
7656361   1449133     1.00
7656361   18886199    8.00

Мой обычай itemSimilarity возвращает значения из [-1,1], где 1 должно означать сильное сходство, а -1 - сильное сходство. Два понравившихся пользователю элемента не имеют наименьших общих предков в дереве таксономии, поэтому они не имеют значения 1. Но у них есть значения от 0, 0,20 и 0,25 с некоторыми элементами.

Я даю рекомендации следующим образом:

ItemSimilarity similarity = new CustomItemSimilarity(...); 
Recommender recommender = new GenericItemBasedRecommender(model, similarity);
List<RecommendedItem> recommendations = recommender.recommend(7656361, 10);
for (RecommendedItem recommendation : recommendations) {
    System.out.println(recommendation);
}

Я получаю следующий результат:

RecommendedItem[item:899604, value:4.5]
RecommendedItem[item:1449081, value:4.5]
RecommendedItem[item:1449274, value:4.5]
RecommendedItem[item:1449259, value:4.5]
RecommendedItem[item:715796, value:4.5]
RecommendedItem[item:3255539, value:4.5]
RecommendedItem[item:333440, value:4.5]
RecommendedItem[item:1450204, value:4.5]
RecommendedItem[item:1209464, value:4.5]
RecommendedItem[item:1448829, value:4.5]

Который на первый взгляд кто-то скажет, хорошо, это даст рекомендации. Я пытался напечатать значения из itemSimilarity как это делает сравнение между парными элементами, и я получил этот удивительный результат:

ItemID1  ItemID2    Similarity
899604   1449133    -1.0
899604   18886199   -1.0
1449081  1449133    -1.0
1449081  18886199   -1.0
1449274  1449133    -1.0
1449274  18886199   -1.0
1449259  1449133    -1.0
1449259  18886199   -1.0
715796   1449133    -1.0
715796   18886199   -1.0
3255539  1449133    -1.0
3255539  18886199   -1.0
333440   1449133    -1.0
333440   18886199   -1.0
1450204  1449133    -1.0
1450204  18886199   -1.0
1209464  1449133    -1.0
1209464  18886199   -1.0
1448829  1449133    -1.0
1448829  18886199   -1.0
228964   1449133    -1.0
228964   18886199    0.25
57648    1449133    -1.0
57648    18886199    0.0
899573   1449133    -1.0
899573   18886199    0.2
950062   1449133    -1.0
950062   18886199    0.25
5554642  1449133    -1.0
5554642  18886199    0.0
...

и есть еще несколько. Они не в порядке производства. Я просто хотел сделать точку. Рекомендуются все предметы, которые имеют очень сильное различие -1, а те, которые имеют сходство 0,0, 0,2 и 0,25, вообще не рекомендуются. Как это возможно? itemSimilarity метод интерфейса ItemSimilarity иметь следующее объяснение:

Реализации этого интерфейса определяют понятие сходства между двумя элементами. Реализации должны возвращать значения в диапазоне от -1,0 до 1,0, где 1,0 представляет собой идеальное сходство.

Если я использую сходство между [0,1], я получаю следующие рекомендации:

RecommendedItem[item:228964, value:8.0]
RecommendedItem[item:899573, value:8.0]
RecommendedItem[item:950062, value:8.0]

А попарное сходство выглядит следующим образом (только для тех деревьев, для остальных 0):

228964  1449133   0.0
228964  18886199  0.25
950062  1449133   0.0
950062  18886199  0.25
228964  1449133   0.0
228964  18886199  0.25

РЕДАКТИРОВАТЬ: я также распечатал наиболее похожие предметы 1449133, 18886199 с: (GenericItemBasedRecommender)delegate).mostSimilarItems(new long[]{1449133, 18886199}, 10)и я получил: [RecommendedItem[item:228964, value:0.125], RecommendedItem[item:950062, value:0.125], RecommendedItem[item:899573, value:0.1]]

Только для позиции 18886199, (GenericItemBasedRecommender)delegate).mostSimilarItems(new long[]{18886199}, 10) я получил [RecommendedItem[item:228964, value:0.25]], За 1449133 только нет похожих предметов.

Я не понимаю, почему это не работает с сильным отличием? Другой вопрос, почему все прогнозируемые значения предпочтений 8.0 или же 4.5, Я вижу, что только пункт 18886199 аналогично рекомендуемым пунктам, но есть ли способ умножить значение 8.0 на сходство в случае 0.25и получить значение 2.0 вместо 8.0, Этого я не могу сделать, вычисляя сходство, потому что еще не знаю пользователя, но думаю, что это следует сделать на этапе рекомендации. Разве это не то, как должен работать рекомендатель, или, может быть, я должен создать пользовательский рекомендатель и выполнять работу по-своему?

Я был бы очень признателен, если бы кто-то из сообщества Mahout мог дать мне указания.

0 ответов

Другие вопросы по тегам