@chanvee
2014-07-04T10:17:51.000000Z
字数 2604
阅读 4385
推荐算法
协同过滤是最早提出、研究最深入、商业应用最广泛的个性化推荐技术。协同过滤的一个重要特点是对象是个体,却利用了所有用户的信息。它的主要思想就是现实生活中我们往往跟与自己“相似”的人会有相同的喜好,比如用户A和用户B都喜欢喜剧这一类电影,那么如果用户A某天看了一部新的喜剧电影对其评价也不错的话,那么我们就很有理由把该喜剧电影推荐给用户B。根据这个“相似”的不同,协同过滤算法常常被分为基于用户的协同过滤
和基于商品的协同过滤
。
协同过滤算法往往是建立在评分矩阵的基础上来进行计算的,一个评分矩阵的例子如下:
- | item 1 | item 2 | item 3 | .... | item N |
---|---|---|---|---|---|
user 1 | 3 | 5 | 3 | .... | 4 |
user 2 | 4 | 3 | 3 | .... | 5 |
user 3 | 3 | 2 | 5 | .... | 4 |
... | ... | ... | ... | .... | ... |
user N | 1 | 3 | 4 | .... | 2 |
无论是基于用户的协同过滤还是基于商品的协同过滤,它们最重要的就是定义所谓的相似性
。
对于上述评分矩阵,我们定义
由于余弦相似性没有考虑用户的评分尺度问题,所谓修正的余弦相似的就是在原余弦相似性向量的基础上减去该用户对所有评分项目的平均值,以此来消除用户评分尺度不同的影响,于是我们定义用户间的修正的余弦相似性如下:
另一种常见的相似性度量就是Pearson相关性,它的定义如下:
其实上述的三种相似性其实并不能真正的称作为相似性,应该叫做相关性,因此也存在着这样或那样的问题,所以就有各种衍生的相似性的定义,但是由于其计算的简单及所得结果还可以接受,因此上述三种方法被广泛应用。
当我们得到了各个用户之间的相似性,我们就可以给用户推荐与他“最相似”的用户所购买的产品,这里“最相似”用户的选择常见的由三种方法:(1) 选择相似度最大的前K个用户 (2) 选择相似度大于某个阈值的用户 (3) 选择相似度大于某个阈值的前K个用户。通过上述三种方法的某一种,我们可以得到每个用户的“最近邻居集”,定义NNSi
表示用户i的最近邻居集。特别的,对于诸如Movielens这类评分推荐系统的数据集,我们可以根据以下公式来预测某个用户对商品的打分:
基于商品的协同过滤是以商品为中心的,也就是说它会分析用户购买过的(已评分)商品,然后向其推荐与曾经购买过的(评分高的)商品相似的商品。这里的相似我们也可以通过上述类似的方法定义,比如把各个用户对该商品的评分(即评分矩阵的列向量)作为商品的特征来计算相似性。当然对于商品的特征不仅仅可以通过评分来定义,另一种常见的方法是基于商品的内容来定义的特征,比如亚马逊的图书推荐便是基于图书内容的相似性来进行推荐,至于怎样根据内容来定义相似性也有很多的方法,比如TF-IDF,这里就不再赘述。
基于商品的协同过滤方法有两个特别的优势:一是方便设计实时响应的算法,因为商品之间的相似度可以离线计算,这样在用户每次浏览新的商品之后就可以实时更新对用户的推荐栏;二是该方法解释性强,因为对用户进行推荐的时候,可以告诉用户推荐这款商品的原因是因为参考了他曾经购买过的若干商品,可解释性可以大大提高用户体验。
与之相对的,基于用户的协同过滤可以挖掘出一些更深层次的潜在关联,帮助提高交叉销售量,从而提高了用户购买的多样性。因为基于用户的协同过滤是基于用户的相似性,所以它很有可能挖掘出甚至是用户自己都不知道会喜爱的商品。
虽然协同过滤算法得到了广泛的应用,但是它也存在着一些问题:
冷启动
。也就是指对于新的用户或商品,由于推荐系统不存在之前的信息,因此协同过滤算法就不能对其进行推荐。稀疏性问题
。因为在实际的推荐系统中,用户很难对各个商品都进行评分,因此导致了评分矩阵会非常稀疏,从而导致计算的时间和空间增加,准确性也降低。由此出现了如矩阵填充和矩阵降维等方法来解决这个问题。