如何使用奇异值分解(SVD)基于物品推荐物品

4
我已经训练了一个SVD模型,用于基于userId推荐物品。但是是否有一种方法可以根据物品列表而不是userId推荐物品呢?
例如,给定一个物品列表[1,2,3,4,5],SVD模型会找到最相似的物品[9,10]。我的解决方案是从输入的[9,10]中为每个物品找到相似的物品,并将它们作为输出的共同物品。
即:
- 与物品1相似的物品是[9,10,12] - 与物品2相似的物品是[9,10,13]
因此,共同的物品是[9,10],但我不知道是否有更好的方法。
1个回答

3

您描述的不是很清楚。我猜您是想要基于物品的推荐,就像亚马逊所做的那样?

两个物品之间的相似度可以用各种方法确定,但常见的方法是使用我们先前描述的余弦测量,其中每个向量对应于一个物品而不是客户,向量的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号项目作为最佳匹配项。直觉是我们累积相似性贡献并比较它们的聚合贡献。

我现在可以获取相似的项目,例如,使用svd.similar(itemid)来获取相似的项目[9,10,11],但是我的问题是从项目列表中获取最相似的项目。 - remykits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接