Nei*_*ner 5 python algorithm recommendation-engine similarity collaborative-filtering
我正在尝试按照亚马逊的"观看/购买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
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的话,当我们处于"I1和I2之间的计算模拟"时,我会得到一个与单个值I1(外环)一起购买的物品清单(I2).
这个计算是如何进行的?
另一个想法是,我正在过度思考并使它变得比我需要的更难 - 是否足以对与I1一起购买的I2的数量进行前n个查询?
我也很欣赏这种方法是否正确的建议.我的产品数据库随时有大约150k项目.由于我看到的大部分阅读材料都显示了用户项目相似性甚至是用户 - 用户相似性,我是否应该选择去那条路线.
我过去曾使用相似度算法,但他们总是涉及一个等级或分数.我认为这样做的唯一方法是建立一个客户产品矩阵,得分为0/1而不是购买/购买.鉴于购买历史和物品大小,这可能会变得非常大.
编辑:虽然我将python列为标记,但我更喜欢将逻辑保留在db中,最好使用Oracle PL/SQL.
关于这个话题有一本很好的O'Reilly书.虽然白皮书可能会在伪代码中列出逻辑,但我不认为这种方法可以很好地扩展.计算都是概率计算,所以像贝叶斯定理这样的东西习惯说,"鉴于人A买了X,他们购买Z的可能性是多少?" 简单地循环数据工作太难了.你必须为每个人完成所有这些.
让我们理解项目到项目的协作过滤.假设我们有购买矩阵
Item1 Item2 ... ItemN
User1 0 1 ... 0
User2 1 1 ... 0
.
.
.
UserM 1 0 ... 0
Run Code Online (Sandbox Code Playgroud)
然后我们可以使用列向量计算项目相似度,例如使用余弦.我们有一个项目相似性对称矩阵如下
Item1 Item2 ... ItemN
Item1 1 1/M ... 0
Item2 1/M 1 ... 0
.
.
.
ItemN 0 0 ... 1
Run Code Online (Sandbox Code Playgroud)
这可以解释为"观看/购买X的客户也查看/购买了Y,Z,......"(协作过滤).因为Item的矢量化基于用户的购买.
亚马逊的逻辑与上述完全相同,而其目标是提高效率.正如他们所说
我们可以通过迭代所有项目对并为每对项目组成一个相似性度量来构建产品到产品矩阵.然而,许多产品对没有共同的客户,因此该方法在处理时间和存储器使用方面是低效的.该迭代算法通过计算一个督促,UCT以及所有相关产品之间的相似性提供了一个更好的方法