前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每周学点大数据 | No.58协同过滤模型(上)

每周学点大数据 | No.58协同过滤模型(上)

作者头像
灯塔大数据
发布2018-04-04 14:24:31
6480
发布2018-04-04 14:24:31
举报
文章被收录于专栏:灯塔大数据灯塔大数据

NO.58

协同过滤模型(上)

Mr. 王:为了能够有效地利用其他用户的评价来进行更有效的推荐,人们提出了协同过滤的推荐模型。

小可:那什么是协同过滤模型呢?它又有哪些优势呢?

Mr. 王:先说说协同过滤的思想。既然认为他人对一个项目的评价是有一定价值的,我们就要尝试去利用他人对一个项目的评分来考察该项目的好坏。但是这里存在一个问题,就是他人认为不好的项目不一定是我们认为不好的,或者说他人的评价标准不一定符合我们的评价标准。我们要去考虑,如何能够让那些和某个用户评价标准相似的人来评价该用户没有评价过的东西。这样,给出的评价就会更加符合该用户的喜好,从而推荐质量就会提高。

小可:确实是这样,喜好和我不一样的人评价好的

东西不一定是我喜欢的。可是网络上的

人有很多,我如何去发现那些喜好和我一样的人呢?

Mr. 王:我们将这种思路形式化,协同过滤就是当我们研究用户x 时,去找到与x 有相似

评分的用户集合N,根据N 中用户的评分估计x 的评分。

小可:原来是比较两个人之间的评分啊。嗯,如果我们两个人看过相同的几部电影,而且

对这几部电影的评价相似或者一致的话,我们的确有可能有相似的喜好。

Mr. 王:如果你们的喜好相似,对新项目的评价很可能也是相似的。这是协同过滤依照的一个基本假设。那么现在的问题就归结为,我们如何去发现相似的用户呢?当用户数目不多,而且评价过的项目并没有那么多时,可能会出现几个人对这几个不多的项目做出完全相同的评分;但是当项目足够多时,很难有完全相同的评价,我们就要尝试使用一些标准来判断哪些用户过去做出的评价是足够相似的。我们以评分为例,令rx 为用户x 的评分矢量,比如以星级评价就可以表示成:

其中的下画线就表示没有做出评价。在实际的系统中,做出这样评价的可能性是非常高的。

小可:因为非常容易出现两个人都没有看过的电影。

Mr. 王:我们可以尝试使用数学中的各种相似度函数,比如Jaccard 相似度、余弦相似度或者皮尔森相关系数等。比如余弦相似度,我们就可以将评分矢量进行标准化,转化成数字:

然后使用余弦相似度的数学公式即可:

余弦相似度是一种非常朴素的处理方法,处理起来也非常方便,但它也有其缺陷。不知你注意到没有,在原特征向量中没有标注的那些评分,在开始余弦相似度判定之前的标准化是如何处理的。

小可仔细思考着,观察着公式的处理,说:它们被直接标注成了0,在公式中是无法区分这些用户给了项目低分还是没有对项目评分的。通过使用这样的方法,会直接认为他们都不喜欢这个项目。

Mr. 王:这就涉及一个“缺失= 否定?”的问题。

小可:缺失对一个项目的评价显然不是否定该项目,只是还没有来得及评价罢了。而直接将向量交给公式去计算的话,它们却无法有效地分辨这个问题。

Mr. 王:有时,缺失的数据还真的会给相似度的评价带来比较大的干扰。

Mr. 王:这是一个效用矩阵的例子,左侧的ABCD 代表用户,上面的一排代表项目名称,中间的数据域是用户对项目的评分,我们给出的取值范围是1 ~ 5,也就是网络上常用的1 ~ 5星的评价。

小可:这个矩阵里还真是有大量的缺失值。

Mr. 王:这些缺失值的存在就严重地干扰了我们对相似度的评价。从直观上看,我们会觉得A 和B 更相似一些,他们虽然只共同看过一部电影HP1,但是评分非常接近(4 和5)。而A 和C 共同看过的电影有TW 和SW1,不难看出,这两个用户对这两部电影的评价是完全相反的,一个接近最高分,另一个接近最低分,这说明他们对电影的喜好评价是不一样的。但如果通过前面提出的判据进行数值计算上的比较,就会发现一些问题。

Mr. 王在计算器上按了几下,说:如果用Jaccard 相似度进行衡量的话,A 和B 的相似度仅有1/5,而A 和C 的相似度却有2/4。这说明如果推荐系统用Jaccard 相似度进行判定的话,反而会认为A 和C 相似。如果用Cosine 相似度进行判定的话,sim(A,B) 和sim(A,C) 分别为0.386和0.322,虽然判定为A 和B 更为相似一些,但是两者的计算结果非常的相似,这意味着如果没有AB 这组作为对照的话,从数值上看我们会认为AC 这组是非常相似的。从这种结果来看,由于这些缺失值的存在,我们的判据都出现了不同程度的失准。

小可:麻烦应该就出在这些缺失值上吧,我们的方法将它们看作了0 分。这的确不够公平。

Mr. 王:为了解决这种问题,人们提出了中心化方法。来看看下面这个表格:

我们让表格中的每一个评分都减去其所在行的均值,进行了这样的处理之后,不难发现,所有的值都变成了关于自己评价的均值的一个增量或者减量。接下来,再次计算sim (A,B) 结果就是0.092,sim(A,C) 结果就是-0.559。这一次,两者的差距就变得大多了。

小可:嗯,这样做忽略了缺失值,在处理过的矩阵中,我们再将其视为一个最低分,而将其中心化成一个均值。因为均值在这个矩阵中就是0。

Mr. 王:如果你的概率统计学得不错的话,还会发现,这种以0 为中心的数据求解的余弦相似度就是它们的相关系数。

小可在纸上写下了几个公式,计算了一会儿,说:的确是这样啊。

Mr. 王:有了前面这些准备工作,于是我们就可以根据这些相似的用户,去对一些没有进行评分的项目进行评分,并且将预测评分较高的那些项目推荐给用户了。设rx 为用户x 的评分矢量,N 为对其他的评分与用户x 最相似的k 个用户的集合。那么用户x 对其没有进行过评分的项目i 的评分预测为:

小可:用与我较相似的人对这个项目的评分的平均数预测我的评分,还算合理吧。

Mr. 王:还算合理?你有什么更好的想法吗?

小可仔细思考着,说:我觉得虽然N 中的人都是和我很相似的,但是其中依然有些人和我不那么相似。有时候由于k 取得很大,导致N 里面的人也比较多,最后找不到和我很相似的人,就会找一些不那么相似的人以求填充集合N。而他们的评分会干扰到对我的估计。所以我认为,应该加权,也就是说,与我更相似的人给出的评分,应该对预测我的评分影响更大一些。

Mr. 王满意地说:非常好,前人也考虑到了这个问题,于是就采用了相似度的加权方法,写成表达式就是这样:

在这个式子中,就做到了和你更相似的人的评分在对你的预测中会占更大的比重式中,sxy 就表示x 和y 两个用户的相似度。

Mr. 王:在实际应用中,我们不仅要考虑用户与用户的相似度,还要考虑项目和项目的相似度。对于每一个项目i,我们都去寻找其他相似的项目,根据相似项目的评分估计项目i 的评分。

小可:看起来和用户相似度的思想很相像啊,只不过这次我们对前面的用户相似度矩阵做了一个转置。我们是不是可以直接利用原来的相似性测度函数啊?

下期精彩预告

经过学习,我们了解了一下了解了协同过滤模型。在下一期中,我们将进一步研究一下协同过滤模型中涉及到的具体问题,更加详细的过滤模型。更多精彩内容,敬请关注灯塔大数据,每周五不见不散呦!

文章作者:王宏志

文章编辑:秦革

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灯塔大数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档