打开微信扫一扫,关注微信公众号【数据与算法联盟】
转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer
前言
之前看过一段时间协同过滤的推荐算法,当时理解并不深刻,对于其浅显的理解是从海量数据中挖掘出小部分与你品味相同的用户,协同过滤分为基于用户的和基于物品的。
个性化推荐和非个性化推荐
聊个性化推荐之前,我们先理解下什么是非个性化推荐,我对其的理解为从比较单一的维度加上某个选项构成了推荐,比如说某个视频网站中娱乐类节目的观看量排名,某个图书网站中某段时间内的购买量排名等等,但是其有个缺点就是导致访问量高的物品,访问量会越来越高,因为当用户进入到推荐界面时看到的永远都是热销的,热卖的,访问量高的物品,那些排名靠后的物品只会越来越靠后。
为了解决这个问题,同时在海量数据中实现对用户的精准推荐便产生了个性化推荐,所谓的个性化推荐就是根据用户产生的行为或者再加上分析行为对象的内容属性向用户推荐其相似用户喜欢的,其喜欢物品相似的,其同一类别下的用户喜欢的物品。
基于物品和基于内容的推荐的区别
说到基于物品的推荐(Based-ItemCF,Based Item CollaborationFilte)我们很容易想到和他属于同一类别的Based-UserCF(基于用户的协同过滤推荐,Based User CollaborationFilte),Based-UserCF就是给某个用户推荐和他相似用户所喜欢的物品,其考虑的是用户之间的相似度和用户评分物品在用户喜欢物品中所占的权重,Based-UserF的计算公式为
其中,p(u,i)表示用户u对物品i的感兴趣程度,S(u,k)表示和用户u兴趣最接近的K个用户,N(i)表示对物品i有过行为的用户集合,Wuv表示用户u和用户v的兴趣相似度,Rvi表示用户v对物品i的兴趣(不过在大多数情况下,用户喜欢物品的权重都默认设置为1,即所有的Rvi都等于1,不过我们可以根据用户的浏览记录,评分高低来进行权重的计算)。
举个简单的例子,用户A对a,b,c,d,e的评分分别为1,2,3,4,5分,那么A用户对a产生的权重可以计算出来为:1/(1+2+3+4+5)=1/15,同理可得到用户A对b,c,d,e的产生的权重分别为2/15,3/15,4/15,5/15。
所有的推荐系统都是根据分析用户的行为来进行推荐的,这里的基于item进行的协同过滤推荐只不过是通过用户对物品的行为,来计算物品之间的相似度,继而求出用户对物品的兴趣度(这里说的兴趣度是用户对推荐给他的物品的可能喜欢程度),而基于内容的推荐是分析每个item 内容之间的相似程度,来计算物品的之间的相似度,比如说现在有A,B两部电影,A电影打的tag是,爱情,青春,积极,向上,B电影打的tag是爱情,青春,乐观,积极,那么这两部电影在很大程度上是相似的。
简单粗暴的Slope One
对于协同过滤或者基于内容的推荐算法而言,存在的问题是当数据量过大的时候,计算用户或者物品的相似度是很浪费时间的,当用户的评分矩阵是一个稀疏矩阵时,计算用户的相似度或者物品的相似度意义也不大,所以这时候Slope One就要发挥其伟大的价值了。
slope one 原理
其原理可以概括为一句话为:用平均值来代替某两个未知个体之间的打分差异
用户 | 对事物A打分 | 对事物B打分 | 对事物C打分 |
---|---|---|---|
X | 3 | 4 | 6 |
Y | 2 | 4 | 7 |
Z | 4 | ? | ? |
例如:用户X,Y,Z三个用户对A,B物品的评分如上表,那么Z用户对B的评分可能为多少呢?
根据平均值原理计算得Z对B的评分为:((3-4)+(2-4))/2=-1.5, 也就是说对B的打分要比A高1.5分,所以Z对B的打分为 4+1.5 = 5.5分。
同理可计算出用户Z对C的打分为:4+((7-2)+(6-3))/2 = 8分
加权算法
但通常情况下,数据量和数据规整程度往往是不一的,比如说有n个人对事物A和事物B打分了,R(A->B)表示这n个人对A和对B打分的平均差(A-B),有m个人对事物B和事物C打分了,R(B->C)表示这m个人对B和对C打分的平均差(B-C),注意都是平均差而不是平方差,现在某个用户对A的打分是Ra,对C的打分是Rc,那么A对B的打分可能是:
Rb = (n * (Ra - R(A->B)) + m * (Rc - R(B->C)))/(m+n)
问题
数据稀疏性
简单填值
用一个固定的数值填充系统中所有的未评过分的项目,从而解决稀疏性问题一种方法,常用固定值的选取方法有两种:
1:缺省值可以设为评分的平均值,或者对前两者进行某种合成。
该方法在一定程度上能缓解数据稀疏性问题,但在用户和项目数量很大的情况下填充所有缺省值,完成推荐的计算量也比较大,因此适合于小规模数据库。另外用户对未评过分的项目评分情况会有一些差异,该方法采用统一的数值进行填充,没有考虑到用户的兴趣差异,抹杀了用户的个性。
2:众数法。
众数法就是将目标用户所有评分的众数作为新项目预测评分的方法。从统计学的角度来说,采用众数法这种预测方法的准确率会比较高,但是在实际生活中,采用众数法预测用户对项目的评分可能会是错误的。另外,用户对项目的评分可能会存在多个众数或者没有众数的情况,因此众数法的应用局限性比较大。
聚类
该方法根据用户兴趣之间的差异,利用某种聚类算法将系统中的所有用户划分为不同的群体;系统把用户所在群体的中心值作为用户对未评项目的评分预测值,进行用户项目评分矩阵的填充。主要的聚类方法有k-means聚类和遗传聚类等。聚类方法针对的对象可以是用户,也可以是项目,还可以对用户和项目均进行聚类。其中,对用户进行聚类时首先要对用户-项目评分数据库进行聚类,然后选择目标用户所属类的用户作为最近邻集合;对项目进行聚类时根据用户对项目评分的相似性对项目进行k-means聚类生成相应聚类中心,在此基础上计算目标项目与聚类中心的相似性,从而只需在与目标项目最相似的若干个聚类中就能寻找到目标项目的最近邻,并能够产生推荐列表;对用户和项目均进行聚类的方法主要有层次聚类、biclustering聚类和co-clustering聚类等。聚类的方法利用相似群体的评分信息提高了预测的准确度,但不能体现用户间的爱好区别,因此推荐结果的准确率并没有得到显著提高。
降维
用户-项目评分矩阵出现数据稀疏的情况是由项目的高维数据引起的,因此可以考虑采取一定措施降低项目数据的维度,进而达到约减数据的目的。目前常见的降维技术主要有简单降维方法、矩阵分解和主成分分析(PCA)三类。
1:简单降维方法
简单的降维方法就是通过设置限制条件删除一些用户和项目,从而降低用户-评分矩阵的维度。被删除的往往是没有参加过评分活动或者是评分次数很少的用户,或者是没有被用户评价过或者是被评价的次数很少的项目。利用该方法可以在一定程度上降低评分矩阵的维度,但是无法对被删除的用户或者项目进行推荐,这就导致了用户流失和信息隐藏的问题。
2:矩阵分解
矩阵分解的最简单方法是单值分解算法。用该方法分解用户-项目评分矩阵,可以约减评分矩阵中的数据。但是该算法在分解矩阵的过程中会造成数据遗失,影响准确率。
奇异值分解(SVD)是一种矩阵分解的有效方式,该技术在计算机科学、统计学等领域有着广泛应用。SVD可以将高度相关且在一起出现的内容作为单独因子,把通常很大的矩阵向量拆解成更小阶的近似矩阵。奇异值分解能够应用于协同过滤算法解决数据稀疏性问题,主要原因是协同过滤中用户对项目评分是因为用户对这些项目的隐含特性比较感兴趣,而这些项目之间也存在着一些共同的特征。用户喜欢某一项目的表现为用户对这些项目的评分比较高,所以通过将用户的评分用线性代数方法分解为一些特征,可以根据用户对这些特征的喜好程度来预测用户对他所没有评过分的项目的喜好。
3:主成分分析
主成分分析是基于矩阵特征值分解计算的标准统计分析方法。该方法式将原来的变量重新组合成一组新的互相无关的综合变量,同时根据实际需要可以从中取出几个能够尽可能多地反映原来信息综合变量作为新的参考信息。经过PCA处理后,原始评分数据被投射到最相关的主特征向量上,从而能够约减数据集。
降维技术虽然在一定程度上能够降低用户-项目评分矩阵的规模和稀疏程度,但采用该技术也流失了一部分用户对项目的评分数据。C C Aggarwak指出降维技术产生的效果与数据集密切相关,在项目空间维度很高的情况下进行降维,效果往往难以得到保证。
结合内容的过滤
协同过滤利用的信息只是用户评分数据,基于内容的过滤可以具体显示用户的描述信息,因此将这两种方式融合在一起可以增加可利用的数据量。具体的融合方式有以下四种
- 综合考虑协同过滤和基于内容的过滤的推荐结果,采用一定方式将两种结果融合在一起。
- 将协同过滤和基于内容的过滤集成到一个统一的模型。
- 将协同过滤的部分功能集成到基于内容的过滤。
- 将基于内容过滤的部分功能集成到协同过滤。
冷启动
引导用户将自己的兴趣点表达出来
比如说当我们在注册一个文字阅读类APP时,他会让你选择自己喜欢的标签,这样当你第一次进入系统时,便可以根据你选择的标签进行推荐
利用其他平台的数据进行冷启动
将平台的注册路径改为用新浪/QQ/微信等社交平台登录,一方面可以降低用户注册成本提高转化率,一方面可以同时获得用户的社交信息,从而获得推荐系统的冷启动数据。举个大家都应该知道的产品——“今日头条”,号称5秒钟知道你的兴趣偏好,其实也是在用户登录新浪等社交平台后,获取用户的关注列表,以及爬取用户最近参与互动的feed(转发/评论/赞)进行语义分析,从而获取用户的偏好。
热门推荐
这个是最笨的方法