3

我创建了一个自定义项目相似性,它基于产品分类模拟基于内容的相似性。我有一个用户只喜欢两个项目:

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, 18886199with 最相似的项目:(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.04.5。我可以看到只有项目18886199与推荐项目相似,但是有没有办法将 8.0 的值与 case 中的相似度相乘0.25,并得到值2.0代替8.0。在计算相似度时我不能这样做,因为我还不了解用户,但我认为应该在推荐阶段完成。这不是推荐器应该如何工作,或者我应该创建一个自定义推荐器并以自定义方式完成工作?

如果 Mahout 社区的人能给我指路,我将不胜感激。

4

0 回答 0