【问题标题】:how to use svd to recommend item based on items如何使用svd根据物品推荐物品
【发布时间】:2013-01-31 03:59:25
【问题描述】:

我已经训练了一个 SVD 模型来根据 userId 推荐项目。但是,有没有办法根据物品列表而不是userId来推荐物品?

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

也就是说,

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

所以常见的项目是[9,10],但是不知道有没有更好的办法。

【问题讨论】:

    标签: machine-learning recommendation-engine svd


    【解决方案1】:

    你描述的不是很清楚。我猜你的意思是你想要基于项目的推荐,比如Amazon 在做什么? .

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

    该算法需要密集的离线处理来准备最近的项目。完成后,对相似项目查询的响应非常快。

    编辑

    一旦您知道每个项目的最相似的 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],但是,我的问题是从项目列表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2023-02-13
    • 1970-01-01
    相关资源
    最近更新 更多