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 мог дать мне указания.