亚马逊推荐算法简介
众所周知,现在的购物网站通常采用推荐算法来帮助一个用户找到他需要的商品。该推荐算法的输入是一组与他的兴趣有关的内容(并且现在没有办法能精确地对用户兴趣建模,只能靠利用跟兴趣相关的数据),输出是一组他很可能想要购买的商品列表。
电子商务领域的推荐算法有很多具有挑战性问题需要解决,例如怎样处理海量的用户信息和商品数据、如何保证实时性并提高推荐的精准性,以及现在很多硕士论文解决了很长时间之后还在前赴后继解决的冷启动(cold start)问题和数据稀疏性(data sparsity)问题等。目前,传统的推荐算法分为以下三类:
- 协同过滤(Collaborative Filtering)
- 聚类模型(Cluster Model)
- 内容搜索(Content-based Searching)
协同过滤
协同过滤的核心思想是相似的用户会购买相似的商品,因此,根据其他用户的购买信息来推荐商品给当前用户(用户A)。这些“其他用户”,在他们自己并不知情的情况下,被推荐算法塑造成当前用户的“导购员”。为了给当前用户A推荐他想要的东西,必须找出与用户A相似的那些用户(B、C、D…),利用用户B、C、D…的信息给A产生推荐信息。因此,计算用户间的相似度的方法非常重要。
电子商务网站保存了每个用户购买过的商品,因此他们可以利用这种信息提出一种计算用户相似度的方法,即把网站所有商品作为向量的一个维度,如果一个用户买了一件商品N件,则这个维度上的值就是N,例如。
用户 | 商品1 | 商品 2 | … | 商品N |
---|---|---|---|---|
用户A | 4 | 0 | … | 2 |
假设现在有用户A和B,根据他们的购买信息可以计算A与B的相似度:
有了用户间的相似度之后,协同过滤算法就可以按以下流程框架来产生推荐:
1、根据用户相似度,找出一组与当前用户最相似的用户集合
2、得到集合
3、将当前用户购买过的商品集合记为
4、对
上面的流程是一个总的框架,每个具体步骤可以根据实际需要调整。例如,步骤4中的排序策略,可以*设定。
协同过滤的特点:
1、用一个向量表示用户,商品数越多向量维度越高,计算量越大。
2、大多数用户所购买的商品种类数相对于网站所有商品总数其实是很小的,因而用户向量会是一个稀疏向量,浪费计算资源。
总之,这种方法缺点就是计算复杂度太高,为 O(MN) ,M 代表用户数目,N代表商品数目。它不能用于大型数据集。应对策略:分区、采样、降维(例如聚类,PCA方法)。
1、用户数降维:去掉某些用户、采样
2、商品数降维:去掉冷门商品或热门商品
以上这些应对策略可以降低计算复杂度,但是同时推荐的准确性也降低了。
聚类模型
这种方法也是基于“相似用户会购买相似商品”思想,且需要计算用户间的相似度。它与协同过滤的不同在于寻找相似用户的方法上,剩余的步骤与协同过滤完全一致。
首先,利用用户相似度和无监督机器学习方法即聚类算法对所有用户聚类。将用户表示为向量,聚类算法可以将互相相似的用户归为一组,从而将用户划分为N个群组(N是聚类算法根据用户数据自动得到的)。在聚类完成后,在所得到的群组中选择一个与当前用户最相似的群组,完成寻找与当前用户相似用户集合的任务(协同过滤中第1步)。这种将当前用户A归为哪一个群组的问题,可以看做一个分类问题。这个问题可以采用多种方法解决,例如用群组中所有用户向量的平均值代表该群组,从而再计算与用户A的相似度。
将用户归类之后,认为这个群组中的用户是与当前用户最相似的用户(相对其他群组)。接下来按照协同过滤中的方法产生推荐商品。流程如下:
缺点:
1) 该方法的缺点与协同过滤中降低计算复杂度的方法类似。当聚类所得到的群组粒度较大时,推荐结果的准确率很低;但是若将聚类群组的粒度调小后,计算量又会变得很高,并不比协同过滤好多少。
2) 聚类问题是一个 NP难问题,因而不能计算得到其最优解,在实际中往往采用贪心法,得到近似最优解,降低了给一个用户产生精准推荐结果的可能性。
内容搜索
内容搜索法将推荐问题看做一个寻找相关商品的问题。根据用户购买的一件商品,利用其某个属性构造一个查询条件,用该查询条件来搜索匹配的商品并作为推荐结果。例如,寻找同一作者、同一卖家、同一品牌、同一标签的商品等搜索。
这种推荐算法其实就是一个搜索算法,其缺点是在用户当前已买过的商品数量很少时能产生较好的结果,但是在用户购买的商品数量很多时,无法构造一个有效的查询条件。
亚马逊算法
亚马逊提出了一种Item-to-Item协同过滤推荐算法(注:在2002年之前就已提出,现在看来已经很老了),这种算法的运行时间完全不受用户个数、商品个数影响,适用于大型的数据,能实时返回高质量推荐结果。
做法
在传统协同过滤算法中,“用户-商品”关系是这样描述的(表格中填入代表用户对某商品好感度的数值):
- | 商品1 | 商品2 | 商品3 | … | 商品M |
---|---|---|---|---|---|
用户1 | |||||
用户2 | |||||
用户3 | |||||
… | |||||
用户N |
也就是用一个M维的向量来表示一个用户(M等于所有商品总数),然后计算用户之间的相似度。
如果想要计算商品之间的相似度,应该怎么做呢?亚马逊算法的思路是这样:寻找用户经常一起购买的两件商品,如果这两件商品被同时购买的次数越多说明它们越相似。因此,我们可以将数据库中所有商品两两比较一遍,计算出任意两件商品之间的相似度。然而这种方法非常耗时间,亚马逊算法内部采用了以下算法来计算商品相似度:
伪代码
For each item I in product-catalog
For each customer C who purchased I
For each item J purchased by customer C
Record that a customer purchased I and J
End For
End For
For each item J
Compute the similarity between I and J.
End For
End For
对于如何计算商品相似度,我们可以把前面的“用户-商品”矩阵旋转一下,用买过这件商品的用户数作为表示商品的向量的一个维度,从而得到“商品-用户”关系矩阵,然后用余弦相似度计算商品间的相似度。
参考信息
推荐算法的评价:
我们可以用点击率(click through)和转化率(conversion rate)来评价一个推荐算法的效果如何。
推荐算法还可以在以下方面进行改进:
1、目前只利用了用户直接购买或评价过的商品信息,其实还有更多信息可以利用,从而表达用户的兴趣。
2、