"People who watched this also watched"算法



我正在尝试编写一个算法,它的行为有点像亚马逊的"买了这个的人也买了"。

两者的区别在于,我的只是计算你在一个会话中观看的"产品",而亚马逊是计算每次购买/结账。

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

  1. 到目前为止,我正在按SessionID计算被观看的productID。
  2. 在一天结束时,我有许多productid被许多sessionid观看。
  3. 现在,我需要在数据库中创建一些派系。也就是说,逐个查看sessionsid并提取他们查看过的所有产品。然后,将其作为clique写入DB表中。
  4. 一旦我有了clique,并且正在查看产品,我将扫描此表以查看它所在的clique,然后提取所有其余的productid。
如果我的算法是正确的,你有任何参考/想法吗?有更好的吗?

我能够使用一个简单的DB结构和一个非常简单的查询实现您想要的结果:

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没有出现在结果中。

NetFlix获奖的是基于SVD的解决方案。在数据库表中实现协方差矩阵是一个挑战。在数据库中实现SVD可能是一个研究问题。但大多数人会认为这是疯狂的。

我想对你的想法做一个改进。当你弄清楚那些走到一起的小团体,并决定哪些是最牢固的关系时,你应该为每个联系增加一个权重。计算权重最简单的方法是看有多少人看了产品X,也看了产品y。观看次数越多,这种关系越强。

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

你需要的是历史。在"买了X的顾客也买了Y"的情况下,这是一个购买历史。在"看到X的客户也对Y感兴趣"的情况下,这是一个谁看到了什么的历史。

一旦你有了历史记录,你就准备好理解你的数据了。在这里,你需要调整你的思想来解决最近的邻居问题。你需要的是x的最近邻居。坐标是用户,值是0和1,这取决于用户是否看到/购买了一件商品。

计算距离最简单的方法就是平方之和;例如,它可以很容易地每小时计算一次(一旦你有足够的视图,距离将停止频繁变化),之后你将始终有一个距离表。

这种方法的示例可以在O'Reilly出版的Programming Collective Intelligence

中找到(Python)。

好的。我想我弄明白了。部分工作是代码实现。

我所做的是按sessionID, productID分组。然后,在我的代码中,我迭代每个sessionID,并使用pair创建一个字典。例如,如果我有pid 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来扫描表并找到它所在的派系。

如果你有改进的建议,请让我知道!

谢谢!

最新更新