10、协同过滤

协同过滤

1 、协同过滤概念

协同过滤 (Collaborative Filtering, 简称 CF):是利用集体智慧的一个典型方法。在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法。换句话说,就是借鉴和你相关人群的观点来进行推荐。

 

协同过滤的基本思想是如果用户在过去有相同的偏好,那么在未来也会有相似的偏好,所以可以利用已知的用户过去的行为或评分对当前用户的喜好进行预测。协同推荐技术一般分为基于记忆的和基于模型的。基于记忆的模型根据保存在内存中的原始评分数据直接生成推荐,常用的如基于物品的推荐(IBCF)和基于用户的推荐(UBCF)。

2 、协同过滤的核心

要实现协同过滤的推荐算法,要进行以下三个步骤:

收集数据——》找到相似用户和物品——》计算并进行推荐

1)收集数据

这里的数据指的都是用户的历史行为数据,比如用户的购买历史,关注,收藏行为,或者发表了某些评论,给某个物品打了多少分等等,这些都可以用来作为数据供推荐算法使用,服务于推荐算法。需要特别指出的是,不同的数据准确性不同,粒度也不同,在使用时需要考虑到噪音所带来的影响。

减噪:因为用户数据在使用过程中可能存在大量噪音和误操作,所以需要过滤掉这些噪音。

归一化:不同行为数据的取值相差可能很好,例如用户的查看数据肯定比购买数据大得多。通过归一化,才能使数据更加准确。

通过上述步骤的处理,就得到了一张二维表,其中一维是用户列表,另一维是商品列表,值是用户对商品的喜好。还是以电影推荐为例,如下表


2)找到相似用户和物品

其实就是计算用户间以及物品间的相似度。以下是几种计算相似度的方法:

欧几里德距离:欧几里德距离表示相似度,距离越小,相似度越大。

皮尔逊相关系数:一般用于计算两个定距变量间联系的紧密程度,取值在[-1,+1] 之间。

Cosine 相似度:被广泛应用于计算文档数据的相似度。

Tanimoto 系数:也称为 Jaccard 系数,是 Cosine 相似度的扩展,也多用于计算文档数据的相似度。

在计算用户之间的相似度时,是将一个用户对所有物品的偏好作为一个向量,而在计算物品之间的相似度时,是将所有用户对某个物品的偏好作为一个向量。求出相似度后,接下来可以求相似邻居了

3)计算并进行推荐,在知道了如何计算相似度后,就可以进行推荐了。

上面的相似度权重有时候需要加入惩罚因子,举个例子,在日常生活中,我们个人购买卫生纸的的频率比较高,但是不能说明这些用户的兴趣点相似,但是如果它们都买了照相机,那么就可以大致推出它们都是摄影爱好者。所以像卫生纸这样的物品在计算时,相似度权重需要加上惩罚因子或者干脆直接去掉这类数据。

3、协同过滤的三种方法

1)、基于用户的 CF 的基本思想相当简单,基于用户对物品的偏好找到相邻邻居用户,然后将邻居用户喜欢的推荐给当前用户。计算上,就是将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,找到 K 邻居后,根据邻居的相似度权重以及他们对物品的偏好,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表作为推荐。下图给出了一个例子,对于用户 A,根据用户的历史偏好,这里只计算得到一个邻居 - 用户 C,然后将用户 C 喜欢的物品 D 推荐给用户 A(如果A和C在电影方面的喜好相同,那么把C喜欢的的电影推荐给A是有道理的)。


基于用户的协同过滤

step1.如果用户i对项目j没有评过分,就找到与用户i最相似的K个邻居(采用Pearson相关系数)

step2.然后用这K个邻居对项目j的评分的加权平均来预测用户i对项目j的评分。

2)、基于物品的 CF 的原理和基于用户的 CF 类似,只是在计算邻居时采用物品本身,而不是从用户的角度,即基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给他。从计算的角度看,就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度,得到物品的相似物品后,根据用户历史的偏好预测当前用户还没有表示偏好的物品,计算得到一个排序的物品列表作为推荐。下图一个例子,对于物品 A,根据所有用户的历史偏好,喜欢物品 A 的用户都喜欢物品 C,得出物品 A 和物品 C 比较相似,而用户 C 喜欢物品 A,那么可以推断出用户C 可能也喜欢物品 C。


基于物品的协同过滤

step1.如果用户i对项目j没有评过分,就把ri,j置为0。找到与物品j最相似的k个近邻(采用余弦距离)

step2.然后用这K个邻居对项目j的评分的加权平均来预测用户i对项目j的评分。

由于物品之间的相似度比较稳定,可以离线先算好,定期更新即可。在电商行业这种算法用的比较多。

3)、混合协同过滤

所谓的混合算法,主体思路还是基于用户的协同过滤,只是在计算两个用户的相似度时又嵌套了item-based CF思想。

度量用户i和用户j相似度更好的方法是:

1.用户i参与评分的项目集合为Ii,用户j参与评分的项目集合为Ij,找到它们的并集Uij=Ii∪Ij

2.在集合Uij中用户i未评分的项目是Ni=Uij−Ii,采用item-based CF方法重新估计用户i对Ni中每个项目的评分。

3.这样用户i和j对Uij的评分就都是非0值了,在此情况下计算他们的相似度。

4、协同过滤的复杂度及适应场景

  Item CF和User CF是基于协同过滤推荐的两个最基本的算法,User CF是很早以前就提出来了,Item CF是从 Amazon 的论文和专利发表之后(2001 年左右)开始流行,大家都觉得 Item CF从性能和复杂度上比 User CF更优,其中的一个主要原因就是对于一个在线网站,用户的数量往往大大超过物品的数量,同时物品的数据相对稳定,因此计算物品的相似度不但计算量较小,同时也不必频繁更新。但我们往往忽略了这种情况只适应于提供商品的电子商务网站,对于新闻,博客或者微内容的推荐系统,情况往往是相反的,物品的数量是海量的,同时也是更新频繁的,所以单从复杂度的角度,这两个算法在不同的系统中各有优势,推荐引擎的设计者需要根据自己应用的特点选择更加合适的算法。

 求出两个用户的相似度:相似度可以是公式1(jaccd)或者公式2(余弦公式)。 如果想计算每两个用户的相似度需要的时间复杂度为O(n*n*d)。n为用户数目,d为商品的数目。

公式1)Jaccard 公式

 公式2)余弦相似度

 公式1和公式2衡量用户的相似度其实上是比较粗糙的。举个例子,小时候基本每个人都会买《新华字典》,其实并不能据此说明他们的兴趣相似,然而如果两个人都买了《模式识别》,那么就基本可以肯定他们的兴趣是比较相似的。《新华字典》与《模式识别》的区别在于一个是火爆的物品,一个相对不火爆。因此相似度的计算方式可以修改为公式4。公式4)

基于物品的协同过滤算法在应用中更频繁。基于物品的协同过滤算法主要基于这样的思想: 如果用户x购买了物品A,那么她很可能会购买与A很相似的物品B(比如A是面膜,B是洗面奶)。这样的话就需要计算物品间的相似度。公式5)

 

i和j分别表示两个物品, 其中N(i) 表示喜欢物品i的人,N(j) 表示喜欢物品j的人。这个公式可以理解购买了i的用户中有多少人购买了j。 这个公式其实有一个问题: 如果物品j是一个特别热门的物品, 那么物品j跟很多物品的相似度都会很高, wij 很可能都会接近1。因此为了避免热门物品造成的这种影响, 我们把公式修改为:

 

适用场景:对于一个在线网站,用户的数量往往超过物品的数量,同时物品数据相对稳定,因此计算物品的相似度不但计算量小,同时不必频繁更新。但是这种情况只适用于电子商务类型的网站,像新闻类,博客等这类网站的系统推荐,情况往往是相反的,物品数量是海量的,而且频繁更新。所以从算法复杂度角度来说,两种算法各有优势。

5、推荐多样性和精度

研究推荐引擎的学者们在相同的数据集合上分别用 User CF 和 Item CF 计算推荐结果,发现推荐列表中,只有 50% 是一样的,还有 50% 完全不同。但是这两个算法确有相似的精度,所以可以说,这两个算法是很互补的。

关于推荐的多样性,有两种度量方法:

第一种度量方法是从单个用户的角度度量,就是说给定一个用户,查看系统给出的推荐列表是否多样,也就是要比较推荐列表中的物品之间两两的相似度,不难想到,对这种度量方法,Item CF 的多样性显然不如 User CF 的好,因为 Item CF 的推荐就是和以前看的东西最相似的。

第二种度量方法是考虑系统的多样性,也被称为覆盖率 (Coverage),它是指一个推荐系统是否能够提供给所有用户丰富的选择。在这种指标下,Item CF 的多样性要远远好于 User CF, 因为 User CF 总是倾向于推荐热门的,从另一个侧面看,也就是说,Item CF 的推荐有很好的新颖性,很擅长推荐长尾里的物品。所以,尽管大多数情况,Item CF 的精度略小于 User CF, 但如果考虑多样性,Item CF 却比 User CF 好很多。

 

如果你对推荐的多样性还心存疑惑,那么下面我们再举个实例看看 User CF 和 Item CF 的多样性到底有什么差别。首先,假设每个用户兴趣爱好都是广泛的,喜欢好几个领域的东西,不过每个用户肯定也有一个主要的领域,对这个领域会比其他领域更加关心。给定一个用户,假设他喜欢 3个领域 A,B,C,A 是他喜欢的主要领域,User CF 和 Item CF 倾向于做出什么推荐:如果用 User CF,它会将 A,B,C 三个领域中比较热门的东西推荐给用户;而如果用Item CF,它会基本上只推荐 A 领域的东西给用户。所以我们看到因为 User CF只推荐热门的,所以它在推荐长尾里项目方面的能力不足;而 Item CF 只推荐 A 领域给用户,这样他有限的推荐列表中就可能包含了一定数量的不热门的长尾物品,同时Item CF 的推荐对这个用户而言,显然多样性不足。但是对整个系统而言,因为不同的用户的主要兴趣点不同,所以系统的覆盖率会比较好。

从上面的分析,可以很清晰的看到,这两种推荐都有其合理性,但都不是最好的选择,因此他们的精度也会有损失。其实对这类系统的最好选择是,如果系统给这个用户推荐 30 个物品,既不是每个领域挑选 10 个最热门的给他,也不是推荐 30 个 A 领域的给他,而是比如推荐15 个 A 领域的给他,剩下的 15 个从 B,C 中选择。所以结合User CF和 Item CF 是最优的选择,结合的基本原则就是当采用 Item CF 导致系统对个人推荐的多样性不足时,我们通过加入 User CF 增加个人推荐的多样性,从而提高精度,而当因为采用 User CF 而使系统的整体多样性不足时,我们可以通过加入 Item CF 增加整体的多样性,同样可以提高推荐的精度

用户对推荐算法的适应度

前面我们大部分都是从推荐引擎的角度考虑哪个算法更优,但其实我们更多的应该考虑作为推荐引擎的最终使用者 -- 应用用户对推荐算法的适应度。

对于 User CF,推荐的原则是假设用户会喜欢那些和他有相同喜好的用户喜欢的东西,但如果一个用户没有相同喜好的朋友,那 User CF 的算法的效果就会很差,所以一个用户对的 CF 算法的适应度是和他有多少共同喜好用户成正比的。

Item CF 算法也有一个基本假设,就是用户会喜欢和他以前喜欢的东西相似的东西,那么我们可以计算一个用户喜欢的物品的自相似度。一个用户喜欢物品的自相似度大,就说明他喜欢的东西都是比较相似的,也就是说他比较符合 Item CF 方法的基本假设,那么他对 Item CF 的适应度自然比较好;反之,如果自相似度小,就说明这个用户的喜好习惯并不满足 Item CF 方法的基本假设,那么对于这种用户,用 Item CF 方法做出好的推荐的可能性非常低。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值