我正在尝试按照亚马逊的“观看/购买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。
这个主题有一个很好的O'Reilly book。虽然白皮书可能会在伪代码中列出逻辑,但我不认为这种方法可以很好地扩展。计算都是概率计算,所以像Bayes' Theorem这样的东西习惯说,“鉴于人A买了X,他们购买Z的可能性是多少?”简单地循环数据工作太难了。你必须为每个人完成所有这些。
让我们理解项目到项目的协作过滤。假设我们有购买矩阵
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的矢量化基于用户的购买。
亚马逊的逻辑与上述完全相同,而其目标是提高效率。正如他们所说
我们可以通过迭代所有项目对并为每对项目组成一个相似性度量来构建产品到产品矩阵。然而,许多产品对没有共同的客户,因此该方法在处理时间和存储器使用方面是低效的。迭代算法通过计算单个产品与所有相关产品之间的相似性来提供更好的方法
@Neil或后来提出这个问题的人:
相似性度量的选择取决于您,您可能希望将其留作未来的可塑性。查看有关Frobenius规范的维基百科文章。或者在您提交的链接中,Jaccard系数cos(I1,I2)
。
用户项-vs- user-user -vs- item-item或任何组合无法客观地回答。这取决于您可以从用户获得哪种数据,UI如何从中获取信息,您认为可靠的数据部分以及您自己的时间限制(就混合动力而言)。
由于许多人在上述问题上做过主要论文,您可能希望从最简单的可实现解决方案开始,同时为算法的复杂性留出增长空间。
对于您的问题,这可能不是一个完美的答案,但另一种看待这个问题的方法是Frequent Itemset Mining,它在给定最小频率阈值的情况下计算所有经常共同购买的产品对/组。您可以将客户的购买映射到其共同购买的产品。
没有模型训练或贝叶斯概率预测,因为它是纯粹的数学问题。只需计算在您的交易基础中一起购买的所有可能产品对的频率。这是一个指数搜索空间,但有很多不同的高效算法和实现可供使用(SPMF是一个用Java编写的非常好的)。这可以作为快速基线模型。