我正在尝试按照亚马逊的“观看/购买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。
答案 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编写的非常好的算法)。这可以用作快速基准模型。