6

我正在尝试按照亚马逊的“查看/购买 X 的客户也查看/购买 Y 和 Z”的方式计算项目与项目的相似性。我看到的所有示例和参考资料都用于计算排名项目的项目相似度、查找用户-用户相似度或根据当前用户的历史记录查找推荐项目。在考虑当前用户的偏好之前,我想先采用一种非针对性的方法。

查看Amazon.com 推荐白皮书,他们使用以下逻辑来进行离线商品相似度:

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 之间的相似性”时,我有一个与单个值 I1(外循环)一起购买的项目(I2)列表。

这个计算是如何进行的?

另一个想法是我想多了,这比我需要的更困难 - 对与 I1 一起购买的 I2 的计数进行前 n 个查询是否足够?

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

我过去曾使用过相似度算法,但它们总是涉及排名或分数。我认为唯一可行的方法是建立一个客户-产品矩阵,对未购买/购买的产品评分为 0/1。考虑到购买历史和商品大小,这可能会变得非常大。

编辑:虽然我将python列为标签,但我更愿意将逻辑保留在数据库中,最好使用Oracle PL/SQL。

4

4 回答 4

6

让我们了解项目到项目的协作过滤。假设我们有购买矩阵

        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的向量化是基于用户购买的。

亚马逊的逻辑和上面完全一样,目标是提高效率。正如他们所说

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

于 2012-05-12T06:11:12.357 回答
5

有一本关于这个主题的好O'Reilly 书。虽然白皮书可能会以这样的伪代码列出逻辑,但我认为这种方法不会很好地扩展。这些计算都是概率计算,所以像贝叶斯定理这样的东西习惯于说,“给定人 A 购买了 X,他们购买 Z 的可能性是多少?” 直接循环数据太费劲了。你必须为每个人经历这一切。

于 2010-03-05T22:32:00.727 回答
4

@Neil 或稍后提出此问题的任何人:

相似性指标的选择取决于您,您可能希望它具有可塑性以备将来使用。首先查看有关 Frobenius 规范的 Wikipedia 文章。或者在您提交的链接中, Jaccard 系数cos(I1,I2)

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

由于许多人已经就上述问题完成了硕士论文,您可能希望从最容易实现的解决方案开始,同时为算法的复杂性留出增长空间。

于 2011-03-14T05:41:27.417 回答
0

这可能不是您问题的完美答案,但查看此问题的另一种方法是频繁项集挖掘,它计算所有频繁共同购买的产品对/组,给定最小频率阈值。您可以将客户的购买映射到其通常共同购买的产品。

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

于 2019-03-29T14:29:37.827 回答