我创建了一个自定义项目相似性,它基于产品分类模拟基于内容的相似性。我有一个用户只喜欢两个项目:
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
with 最相似的项目:(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 的值与 case 中的相似度相乘0.25
,并得到值2.0
代替8.0
。在计算相似度时我不能这样做,因为我还不了解用户,但我认为应该在推荐阶段完成。这不是推荐器应该如何工作,或者我应该创建一个自定义推荐器并以自定义方式完成工作?
如果 Mahout 社区的人能给我指路,我将不胜感激。