协作过滤:非个性化的项目到项目的相似性

时间:2010-03-05 22:14:52

标签: python algorithm similarity recommendation-engine collaborative-filtering

我正在尝试按照亚马逊的“观看/购买X的客户也查看/购买过Y和Z”来计算物品间的相似度。我看到的所有示例和参考都是针对排名项目的计算项目相似性,用于查找用户 - 用户相似性,或者用于基于当前用户的历史来查找推荐项目。在考虑当前用户的偏好之前,我想先采用非针对性的方法。

查看Amazon.com recommendations white paper,他们使用以下逻辑进行离线项目项相似性:

For each item in product catalog, I1 
  For each customer C who purchased I1
    For each item I2 purchased by customer C
       Record that a customer purchased I1 and I2
  For each item I2 
    Compute the similarity between I1 and I2

如果我理解正确的话,当我们处于“I1和I2之间的计算模拟”时,我有一个项目列表(I2)与单个值I1(外部循环)一起购买。

如何进行此计算?

另一个想法是,我正在过度思考这个问题并使其变得比我需要的更难 - 是否足以对与I1一起购买的I2计数进行前n个查询?

我也很欣赏这种方法是否正确的建议。我的产品数据库随时有大约150k项目。由于我看过的大部分阅读材料都显示了用户项目的相似性,甚至是用户 - 用户的相似性,我是否应该选择去那条路线。

我过去曾使用相似度算法,但他们总是涉及等级或分数。我认为这样做的唯一方法是建立一个客户产品矩阵,得分为0/1而不是购买/购买。鉴于购买历史和商品尺寸,这可能会非常大。

编辑:虽然我将python列为标记,但我更喜欢将逻辑保留在db中,最好使用Oracle PL / SQL。

4 个答案:

答案 0 :(得分:5)

这个主题有一个很好的O'Reilly book。虽然白皮书可能会在伪代码中列出逻辑,但我不认为这种方法可以很好地扩展。计算都是概率计算,所以像Bayes' Theorem这样的东西习惯说,“鉴于人A买了X,他们购买Z的可能性是多少?”简单地循环数据工作太难了。你必须为每个人完成所有这些工作。

答案 1 :(得分:5)

让我们理解物品到物品的协同过滤。 假设我们有购买矩阵

        Item1  Item2 ... ItemN
 User1  0        1   ...  0
 User2  1        1   ...  0 
  .
  .
  .
 UserM  1        0   ...  0

然后我们可以使用列向量计算项目相似度,例如使用余弦。我们有一个项目相似性对称矩阵如下

        Item1  Item2 ... ItemN
 Item1  1       1/M  ...  0
 Item2  1/M     1    ...  0 
  .
  .
  .
 ItemN  0       0    ...  1

可以解释为“观看/购买X的客户也查看/购买过Y,Z,......”(协作过滤)。因为Item的矢量化基于用户的购买。

亚马逊的逻辑与上述完全相同,而其目标是 提高效率 。正如他们所说的

  

我们可以通过建立产品到产品矩阵   迭代所有项目对并计算相似性度量   对于每一对。但是,许多产品对没有共同的客户,   因此,该方法在处理时间方面效率低下   内存使用情况。 迭代算法提供了更好的方法   计算单个产品与所有相关产品之间的相似性   产品

答案 2 :(得分:3)

@Neil或后来提出这个问题的人:

相似度指标的选择取决于您,您可能希望将其留作未来的可塑性。查看有关Frobenius规范的维基百科文章。或者在您提交的链接中,使用Jaccard系数cos(I1,I2)

用户项-vs- user-user -vs- item-item或其他任何组合都无法客观地回答。这取决于您可以从用户那里获得什么样的数据,UI如何从中获取信息,您认为可靠的数据部分以及您自己的时间限制(就混合动力而言)。

由于许多人在上述问题上做过主要论文,您可能希望从最简单的可实施解决方案入手,同时为算法的复杂性留出增长空间。

答案 3 :(得分:0)

这可能不是您问题的完美答案,但是解决此问题的另一种方法是Frequent Itemset Mining,它会在给定最低频率阈值的情况下计算所有经常共同购买的产品对/组。您可以将客户的购买映射到其共同购买的产品。

没有模型训练或贝叶斯概率预测,因为这是一个纯数学问题。只需计算交易基础中一起购买的所有可能产品对的出现频率即可。这是一个指数搜索空间,但是有很多不同的有效算法和实现可以使用(SPMF是用Java编写的非常好的算法)。这可以用作快速基准模型。