“看过这个的人也看了”算法

时间:2011-10-16 06:05:44

标签: algorithm

我正在尝试编写一种算法,这种算法有点像亚马逊的“购买此产品的人也购买了”。

两者之间的区别在于,我只计算您在一次会话中观看的“产品”,而亚马逊正计算每次购买/结账。

我在实施和弄清算算法应该是什么方面有点困难。

  1. 到目前为止,我正在通过SessionID计算被监视的产品ID。
  2. 到一天结束时,我有很多会员ID监视的许多ProductID。
  3. 现在,我需要在数据库中创建某种派系。也就是说,在SessionsID上逐一进行并提取他们查看过的所有产品。然后,将其写成数据库表中的一个集团。
  4. 一旦我有了派系,并且正在查看产品,我正在扫描此表以查看它所在的clique,然后提取所有其余的productID。
  5. 如果我的算法正确,您有任何参考/想法吗?还有更好的吗?

5 个答案:

答案 0 :(得分:3)

我能够使用简单的数据库结构和非常简单的查询来实现您想要的结果:

TABLE `exa`

| sesh_id | prod_id |
---------------------
| 1       | 1       |
| 1       | 2       |
| 1       | 3       |
| 1       | 4       |
| 2       | 2       |
| 2       | 3       |
| 2       | 4       |
| 3       | 3       |
| 3       | 4       |
| 4       | 1       |
| 4       | 2       |
| 4       | 5       |

查询

SELECT c.prod_id, COUNT(*)
FROM `exa` a
JOIN `exa` b ON a.prod_id=b.prod_id
JOIN `exa` c ON b.sesh_id=c.sesh_id
WHERE a.`prod_id`=3 AND c.prod_id!=3
GROUP BY c.prod_id
ORDER BY 2 DESC;

结果

| prod_id | COUNT |
| 4       | 9     |
| 2       | 6     |
| 1       | 3     |

这个想法是,每次会话查看产品时,都会插入到表格中[在这种情况下exa]

然后,在任何特定的产品视图中,您都可以查看并查看查看此产品的其他产品也按频率加权查看。因此,在这个特定的例子中,每个看过产品#3的人都看过产品#4,所以它首先出现在排序中。 产品#5仅由会话#4查看,而会话#4未查看产品#3,因此产品#5未出现在结果中。

答案 1 :(得分:3)

基于SVD的解决方案赢得了NetFlix奖。在数据库表中实现协方差矩阵是一项挑战。在数据库中实施SVD可能是一个研究问题。但大多数人都会称之为疯狂。

答案 2 :(得分:1)

我会改进你的想法。当你弄清楚一起出现的团队并决定哪个团队建立最强的关系时,你应该为每个连接增加一个权重。计算重量的最简单方法是看看有多少看过产品X的人也看过Y.视图越多,关系越强。

答案 3 :(得分:1)

您不需要任何(任何!)+1 s。

您需要的是历史。如果“购买X的客户也购买了Y”,这是一个购买历史。如果“看到X的客户也对Y感兴趣”,这是谁看到了什么的历史。

只要您有历史记录,就可以了解数据。在这里,你需要调整你的思想到最近的邻居问题。你需要的是X的最近邻居。坐标是用户,值是0和1取决于用户是否看到/购买了一个项目。

计算距离的最简单方法就是平方三角洲的总和;例如,它可以很容易地计算每小时一次(一旦你有足够的视图,距离就会经常停止变化),之后你总会有一个方便的距离表。

这种方法的例子可以在O'Reilly出版的Programming Collective Intelligence中找到(在Python中)

答案 4 :(得分:0)

确定。 我想我想通了。 部分工作是代码实现。

我所做的是通过sessionID,productID进行分组。 然后,在我的代码中,我迭代思考每个sessionID,然后我用对做一个字典。 例如,如果我有10和20和30,这基本上是一个集团。 所以我按以下方式插入字典: 1. 10-20, weight 1 2. 20-10, weight 1 3. 10-30, weight 1 4. 30-10, weight 1 5. 20-30, eight 1. 6. 30-20, weight 1.

如果我再次遇到其中一个值,我会在适当的对上添加+1。

最后,我将重量和对齐。

现在我所要做的就是通过给定的productID来扫描表格并找到它所在的集团。

如果您有改进建议,请告诉我们!

谢谢大家!