当前位置: 代码迷 >> 互联网 >>

  详细解决方案

热度:4524   发布时间:2013-02-26 00:00:00.0
推荐算法杂念——协同过滤应用分析

写在前面的话:

首先要给自己道个歉,时隔如此之久才再次提起思路写些总结。

虽期间也多次打开页面,提起笔,也几乎整理好了思路,但总是未付诸实践。

不管是由于何种原因,总归和自己的懒惰脱不开干系。

经过一段时间的锻炼,思路和心态上也发生了较大的改变,好吧,就以这篇blog见证自己2013开始的岁月吧。

不管前路是什么,我们都只有能更优雅地走下去。

?

言归正传,今天的主题是:基于用户行为的协同过滤

接下来的观点,部分取自教科书,更多的是自己工作中的心得体会。如有雷同,实属缘分。

?

文章主要包含如下四方面:

1,协同过滤简单介绍;

2,应用中的关注点;

3,应用效果分析?

4,可能的问题及替代方案

顾名思义,协同过滤大体上包含两个步骤:1,相似性计算;2,生成候选列表

在实现上可以分为基于itemuser两种方式。下面做下简单区分介绍:

1. 相似阶段:

基于item的方式:就是通过人的行为建立起被推荐对象之间的相关关系

例如,有很多人都对某两个item有相似的行为类型和行为量,则这两个item相似。

基于user的方式:则是通过useritem的行为类型和行为量来建立user之间的相关关系

例如,某两个人对很多item都有相似的行为类型和行为量,则这两个user相似

?

2. 候选列表生成阶段:

基于item的协同过滤,通过用户喜欢的item以及item之间的相关关系,得到用户对其他item的喜好预测。

基于user的协同过滤,通过与用户相似的用户以及相似用户各自的喜欢的item,得到用户对其相似用户的偏好item的喜好预测。

该阶段本质上是一个矩阵乘法计算过程。

?

1. 行为数据的选择

选择什么样的行为数据进行计算是能否得到期望结果的最根本保证。就像在做ML时,feature的选择一样。

1.1 item 的选择

行为量太大或太小的item都不适合做协同过滤计算。因为:

行为量太大的item,与大部分item都相似,这时推荐也没有意义。

而行为量太小的item,数据稀疏,计算不准,而且质量和被用户接受的程度也不够。?

1.2 user 的选择

行为量太大或太小的user也不适合协同过滤计算,因为:

除了上面item选择是的原因,行为太大的user也可能是异常或捣乱的用户。

而行为太小的用户,行为具有较大的随机性和不确定性,也不利于计算和推荐。

?此外,数据的选择也要结合实际的产品形态和应用场景,但上述两点是基本原则

2. 相似性计算方案的选择

?相似度的计算会直接影响到算法结果的准确程度。我们将user(item)表示成一个通过item(user)表示的向量,问题就是计算两个向量的相似度。

我们采用向量夹角余弦值来描述两个向量之间的相似度。

主要是考虑到数据稀疏性的问题,这种方式将缺失数据默认表示为0,这正是我们需要的。因为这个场景0等于没有值,而其他方式则不一定,例如欧式距离。

选择余弦夹角的方式意味着两个向量在对应分量上值的绝对大小变得没有意义了。

这是我们看中同一个向量内不同分量之间的值的相对大小,在对数据做规约时就要考虑了。?

3. 向量分量规约

由上得出,我们更关心同一个向量内不同分量之间的相对大小,因此规约方案为在一个分量内不同分量之间进行,而不是不同向量的某个相同分量。如何做还要取决于实际应用的需求。

有时候,我们可能需要将过大的分量值规约到一个较小的值,而本身较小的分量值则尽可能保持不变或变化很小。

一个合适的规约方式是双曲正切方法,就是excel中的的tanh。一般来讲可以预定义一个上限值,比如200,则只需要将原来的值如下转换即可:p=tanh(o/200)*200o为原始值,p为规约值。

?

应用效果分析

1 口味及可解释性

这一点基于item的协同过滤要比基于user的协同过滤更好。在item的相关的准确性有保证的情况下,直接根据用户偏好的item关联得到的推荐列表,在口味及可解释性上都令人满意。

而基于user的协同过滤首先要找与自己相似的用户,再找这些用户偏好的item,多了一环,而且与自己相似的用户在口味上未必与自己一致,因此口味和可解释性上都要略差。

2 多样性和新颖性

与基于item的方式相比,基于user的方式在这一点上表现更好。

同时由于我们选取的是与自己相似用户的偏好item,即使这些item和自己的口味略差。

但对于大众用户来讲,可接受度也还不错。

?

这也可以解释为什么在用户接入初期,基于user的协同过滤要比基于item的略好。

而随着用户行为的积累和挖掘的深入,基于item方式的效果会赶上来。

?

?

基于itemuser的方式在效果上各有侧重,因此在产品应用时还需要根据不同用户的特征选择合适的方式或组合。

?

?

可能的问题及替代方案

1 问题

不难发现,无论是基于item还是基于user的方式,都是一种基于两两相似的协同过滤。

考虑基于用户的协同过滤,假设我们有如下三个用户:

用户A行为<1,1,1,1,1,1,1,1>,用户B行为<1,1,1,1,0,0,0,0>,用户C行为<0,0,0,0,1,1,1,1>

?

而且假设此时给用户A进行推荐,用户B与用户C都与A相似,相似度为0.414(已经不低)。

而通过BC的偏好item来生成A的推荐候选列表时就存在问题了。

由于BC完全不相似(相似度为0),其偏好内容相差大,这时给A推荐的结果中就会出现口味不一致,风格类型不统一的问题。

?

2 方案

假设我们不仅仅考虑用户之间的两两相似,而是将用户按照行为类型及偏好划分成一个个的群落。保证同一个群落的用户具有相同的偏好,而不同群之间的用户偏好不一致。

?

可能你也想到了,这就用到了聚类的方法。

?

首先对用户进行聚类,然后将基于user的协同过滤的相似用户,替换成与被推荐用户处于同一个聚类中的其他用户,之后就按照协同过滤生成推荐列表的方法为用户生成推荐列表即可。

?

这种方法的好处是推荐结果的内聚性会相当高,都是用户细化的内容,实际应用中的推荐准确率也要高出协同过滤好多。

缺点是多样性不够,当然内聚与多样,就像鱼和熊掌,不可兼得。

?

同时聚类的方法能够覆盖到的用户也没有协同过滤的多,毕竟有些用户从聚类的角度看,属于离群点。

?

本文的主要内容是协同过滤,关于聚类的在推荐中的详细情况,请听下回分解。

  相关解决方案