我正在尝试编写一个算法,它的行为有点像亚马逊的"买了这个的人也买了"。
两者的区别在于,我的只是计算你在一个会话中观看的"产品",而亚马逊是计算每次购买/结账。
我在实现和弄清楚算法应该是什么方面有一点困难。
- 到目前为止,我正在按SessionID计算被观看的productID。
- 在一天结束时,我有许多productid被许多sessionid观看。
- 现在,我需要在数据库中创建一些派系。也就是说,逐个查看sessionsid并提取他们查看过的所有产品。然后,将其作为clique写入DB表中。
- 一旦我有了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
好的。我想我弄明白了。部分工作是代码实现。
我所做的是按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来扫描表并找到它所在的派系。
如果你有改进的建议,请让我知道!谢谢!