首页 > 代码库 > Amazon的推荐系统

Amazon的推荐系统

本文引自http://blog.csdn.net/fwing/article/details/4942886

 

现在的推荐系统特别火啊。做得最好的应该是Amazon了。

 

 

上面是Amazon的图书推荐。

用的就是著名的 协同过滤(Collaborative filtering)算法。

 

我们用一个简单的例子来说明。

 

下面是一个用户购买的书籍的表格。

 

 

 

计算机网络

算法导论

人工智能

数据库系统实现

概率统计

GRE 词汇手册

小明

1

0

1

0

1

0

小张

0

1

1

0

1

0

小李

1

1

0

0

0

0

小王

0

0

0

0

1

1

 

 

上面的1表示购买,0表示没有购买。

那么我们怎么来给小明推荐书籍呢?

先来看看Amazon之前的传统的协同过滤(Collaborative filtering)是怎么做的。

 

首先呢,根据每个人买的书籍,我们可以将每个用户表示成一个向量。

例如,

V(小明)=<1, 0, 1, 0, 1, 0>

V(小张)=<0, 1, 1, 0, 1, 0>

V(小李)=<1, 1, 0, 0, 0, 0>

V(小王)=<0, 0, 0, 0, 1, 1>

然后呢,我们做这样的假设,买书习惯跟小明类似的人,如果购买了小明没有买的书,那么我们就认为,小明很有可能买这本书。

于是,问题变成了找买书习惯跟小明类似的人。提到向量跟相似度,我们自然就想到了用余弦来衡量相似度。

扔个公式在此给那些忘记了的童鞋们。

 

接下来,大家动手算一下吧。

cos<V(小明), V(小张) >=0.67

cos<V(小明), V(小李) >=0.41

cos<V(小明), V(小王) >=0.41

呵呵,那么跟小明习惯最像的就是小张了。

然后,我们发现小张买了《算法导论》,但是小明没有买,于是我们就给小明推荐《算法导论》。

 

这个方法看起来很不错,那么为什么Amazon提出了另外的一种方法呢?

再来看看Amazon的item-to-item协同过滤系统吧。

有一天呢,Amazon的一个工程师脑袋抽筋,不小心把上面的表格拿错方向了。于是变成了下面的样子。

 

 

 

小明

小张

小李

小王

计算机网络

1

0

1

0

算法导论

0

1

1

0

人工智能

1

1

0

0

数据库系统实现

0

0

0

0

概率统计

0

1

0

1

GRE 词汇手册

0

0

0

1

 

 

 

如果把书的那一行看成一个向量,有啥发现没?对了,我们可以找相似的人,我们还可以找相似的书!!!

这也就是Amazon的item-to-item协同过滤系统。

很多时候,创新就是这么简单,写paper就是这么容易啊 ,换个方向思考 (呃,那位童鞋,不是叫你把书拿反了看)。

 

下面简单描述一下方法。

我们可以先算出任意两个物品之间的相似度(跟上面类似啊,自己算)。

接下开我们看到小明买了《计算机网络》和《人工智能》的书,把跟这两本书类似的书推荐给小明。

跟《计算机网络》最相似的是 《算法导论》和 《人工智能》,跟 《人工智能》最相似的是 《计算机网络》和 《算法导论》。

最后的结果,是《算法导论》^_^。

 

用这个方法呢,我们就可以给用户推荐说,买了这个商品的用户还购买了*** 

那这方法是不是有什么优点呢?(废话啊,不然Amazon会拿来用,商人是很聪明的)

 

 Tradition VS Amazon

 

    Amazon的CF算法可以在离线的情况下把item之间的相似度计算好。当一个用户登陆后,我们需要的也只是检查用户的购买历史,然后把跟这些item相似的item按一定的方法(比如受欢迎程度)排序展现给用户。一般来说,用户购买的东西只是一个小的集合,因此不需要花很多的时间来计算。

    而且,如果用户没有登陆,我们依然可以根据他的浏览历史来做推荐。例如,上面的图片就是我在没有登陆的情况下查看了一下《Beautiful Architecture》,然后Amazon给我做了推荐。

 

 

    对于Amazon这样的网站来说,用户量是远远大于商品数量的。因此,Amazon的CF算法(计算商品相似度)比起传统的CF算法(计算用户相似度),大大地节约了资源。

    对于一个未登陆的用户来说,传统的CF算法没办法根据他的浏览历史来推荐(在线计算一个用户跟其他所有用户的相似度显然不可能)。

Amazon的推荐系统