我创建了一个自定义项目相似度,它基于产品分类法模拟基于内容的相似性。我的用户只喜欢两件物品:
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
的{{1}}方法具有以下表达式:
此接口的实现定义了相似性的概念 两件物品之间。实现应该返回范围中的值 -1.0到1.0,1.0代表完美的相似性。
如果我使用[0,1]之间的相似性,我会得到以下建议:
ItemSimilarity
成对相似度如下(仅适用于那些树,其他为0):
RecommendedItem[item:228964, value:8.0]
RecommendedItem[item:899573, value:8.0]
RecommendedItem[item:950062, value:8.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)
仅针对项目18886199,[RecommendedItem[item:228964, value:0.125], RecommendedItem[item:950062, value:0.125], RecommendedItem[item:899573, value:0.1]]
我获得了(GenericItemBasedRecommender)delegate).mostSimilarItems(new long[]{18886199}, 10)
。对于[RecommendedItem[item:228964, value:0.25]]
,只有没有类似的项目。
我不明白为什么它不能与强烈的不同有效?
另一个问题是为什么所有预测的偏好值都是1449133
或8.0
。我可以看到只有项4.5
与推荐项相似,但是有一种方法可以将8.0的值乘以18886199
中的相似度,并获得{{1}的值而不是0.25
。这是我在计算相似性时无法做到的,因为我还不知道用户,但我认为应该在推荐阶段完成。这不是推荐人应该如何工作,或者我应该创建一个自定义推荐人并以自定义方式完成工作?
如果来自Mahout社区的人能给我指示,我真的很感激。