基于Mahout内容的相似性

时间:2013-08-30 09:49:27

标签: mahout mahout-recommender content-based-retrieval

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

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]],只有没有类似的项目。

我不明白为什么它不能与强烈的不同有效? 另一个问题是为什么所有预测的偏好值都是14491338.0。我可以看到只有项4.5与推荐项相似,但是有一种方法可以将8.0的值乘以18886199中的相似度,并获得{{1}的值而不是0.25。这是我在计算相似性时无法做到的,因为我还不知道用户,但我认为应该在推荐阶段完成。这不是推荐人应该如何工作,或者我应该创建一个自定义推荐人并以自定义方式完成工作?

如果来自Mahout社区的人能给我指示,我真的很感激。

0 个答案:

没有答案