如何使用svd根据项目推荐项目

时间:2013-01-31 03:59:25

标签: machine-learning recommendation-engine svd

我培训了一个SVD模型来推荐基于userId的项目。但是,有没有办法根据项目列表而不是userId推荐项目?

例如,给定项目列表,[1,2,3,4,5]SVD模型会找到最相似的项[9,10]。我的解决方案是从输入[9,10]中找到每个项目的类似项目,并将常用项目作为输出。

即,

  • 与第1项类似的项目为[9,10,12]
  • 与第2项类似的项目为[9,10,13]

因此常见项目为[9,10],但我不知道是否有更好的方法。

1 个答案:

答案 0 :(得分:3)

对你所描述的内容不太清楚。我想你的意思是你想要基于项目的建议,比如Amazon正在做什么? 。

  

两者之间的相似性   项目可以通过各种方式确定,但通常的方法是   使用我们之前描述的余弦量度,其中   每个向量对应一个项而不是一个   客户,矢量的M维度对应   已购买该商品的客户。

enter image description here

此算法需要密集的离线处理才能准备最近的项目。一旦完成,对类似项目查询的响应非常快。

修改

一旦您知道每个项目的最高k个相似项目,您就会得到每个项目对的分数,即两个项目的相似程度,或score(i,j)

给出一个项目列表:[1,2,3]

首先,您会在列表中找到每个项目的热门k项。你也有每个人的分数。假设k=3

`[100,44,99]` are the top 3 items that are similar to item 1. 
score(1, 100) = 0.84, score(1, 44) = 0.4, score(1, 99) = 0.33
score(2, 44 ) = 0.3,  score(2, 33) = 0.2, score(2, 70) = 0.15
score(3, 99)  = 0.4,  score(3, 44) = 0.15, score(3, 70) = 0.01

然后汇总score([1-3],__)中所有项目的分数,即:

score(100) = 0.84
score(44) = 0.4 + 0.3 + 0.13 = 0.83
score(99) = 0.33 + 0.2 = 0.53
score(33) = 0.2
score(70) = 0.15+0.01=0.16

排序后,你知道从上到下的项应该是:

100-> 0.84
44 -> 0.83
99 -> 0.53
33 -> 0.2
70 -> 0.16

当然,在推荐项目的最终列表中,您可能希望删除已存在于给定列表中的任何内容(用户已有的项目)。

请注意,在上面的示例中,虽然项目44以3行显示,但它们的相似度得分都很低。我们仍然选择项目100作为最佳匹配。直觉是我们积累相似性贡献并比较它们的聚合贡献。