基于协同过滤算法的电影推荐系统Word下载.docx
《基于协同过滤算法的电影推荐系统Word下载.docx》由会员分享,可在线阅读,更多相关《基于协同过滤算法的电影推荐系统Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
将用户评过分的电影信息和推荐给该用户的电影信息显示在网页结果页中,推荐完成。
一、Taste介绍
Taste是ApacheMahout提供的一个个性化推荐引擎的高效实现,该引擎基于java实现,可扩展性强,同时在mahout中对一些推荐算法进行了MapReduce编程模式转化,从而可以利用hadoop的分布式架构,提高推荐算法的性能。
在Mahout0.5版本中的Taste,实现了多种推荐算法,其中有最基本的基于用户的和基于内容的推荐算法,也有比较高效的SlopeOne算法,以及处于研究阶段的基于SVD和线性插值的算法,同时Taste还提供了扩展接口,用于定制化开发基于内容或基于模型的个性化推荐算法。
Taste不仅仅适用于Java应用程序,还可以作为内部服务器的一个组件以HTTP和WebService的形式向外界提供推荐的逻辑。
Taste的设计使它能满足企业对推荐引擎在性能、灵活性和可扩展性等方面的要求。
下图展示了构成Taste的核心组件:
从上图可见,Taste由以下几个主要组件组成:
DataModel:
DataModel是用户喜好信息的抽象接口,它的具体实现支持从指定类型的数据源抽取用户喜好信息。
在Mahout0.5中,Taste提供JDBCDataModel和两种类的实现,分别支持从数据库和文件文件系统中读取用户的喜好信息。
对于数据库的读取支持,在Mahout0.5中只提供了对MySQL和PostgreSQL的支持,如果数据存储在其他数据库,或者是把数据导入到这两个数据库中,或者是自行编程实现相应的类。
UserSimilarit和ItemSimilarity:
前者用于定义两个用户间的相似度,后者用于定义两个项目之间的相似度。
Mahout支持大部分驻留的相似度或相关度计算方法,针对不同的数据源,需要合理选择相似度计算方法。
UserNeighborhood:
在基于用户的推荐方法中,推荐的内容是基于找到与当前用户喜好相似的“邻居用户”的方式产生的,该组件就是用来定义与目标用户相邻的“邻居用户”。
所以,该组件只有在基于用户的推荐算法中才会被使用。
Recommender:
Recommender是推荐引擎的抽象接口,Taste中的核心组件。
利用该组件就可以为指定用户生成项目推荐列表。
二、相似性度量
本章节将系统中用到的几个相似性度量函数作以介绍,taste中已经具体实现了各相似性度量类。
UserCF和ItemCF都依赖于相似度的计算,因为只有通过衡量用户之间或物品之间的相似度,才能找到用户的“邻居”,才能完成推荐。
下面就对常用的相似度计算方法进行详细的介绍:
1.基于皮尔森相关性的相似度——Pearsoncorrelation-basedsimilarity
皮尔森相关系数反应了两个变量之间的线性相关程度,它的取值在[-1,1]之间。
当两个变量的线性关系增强时,相关系数趋于1或-1;
当一个变量增大,另一个变量也增大时,表明它们之间是正相关的,相关系数大于0;
如果一个变量增大,另一个变量却减小,表明它们之间是负相关的,相关系数小于0;
如果相关系数等于0,表明它们之间不存在线性相关关系。
用数学公式表示,皮尔森相关系数等于两个变量的协方差除于两个变量的标准差。
Pearsoncorrelation-basedsimilarity
协方差(Covariance):
在概率论和统计学中用于衡量两个变量的总体误差。
如果两个变量的变化趋于一致,也就是说如果其中一个大于自身的期望值,另一个也大于自身的期望值,那么两个变量之间的协方差就是正值;
如果两个变量的变化趋势相反,则协方差为负值。
Covariance
其中u表示X的期望E(X),v表示Y的期望E(Y)
标准差(StandardDeviation):
标准差是方差的平方根
StandardDeviation
方差(Variance):
在概率论和统计学中,一个随机变量的方差表述的是它的离散程度,也就是该变量与期望值的距离。
Variance
即方差等于误差的平方和的期望
基于皮尔森相关系数的相似度有两个缺点:
(1)没有考虑(takeintoaccount)用户间重叠的评分项数量对相似度的影响;
(2)如果两个用户之间只有一个共同的评分项,相似度也不能被计算
Table1
上表中,行表示用户(1~5)对项目(101~103)的一些评分值。
直观来看,User1和User5用3个共同的评分项,并且给出的评分走差也不大,按理他们之间的相似度应该比User1和User4之间的相似度要高,可是User1和User4有一个更高的相似度1。
同样的场景在现实生活中也经常发生,比如两个用户共同观看了200部电影,虽然不一定给出相同或完全相近的评分,他们之间的相似度也应该比另一位只观看了2部相同电影的相似度高吧!
但事实并不如此,如果对这两部电影,两个用户给出的相似度相同或很相近,通过皮尔森相关性计算出的相似度会明显大于观看了相同的200部电影的用户之间的相似度。
Mahout对基于皮尔森相关系数的相似度给出了实现,它依赖一个DataModel作为输入。
PearsonCorrelationSimilarity
同时,Mahout还针对缺点
(1)进行了优化,只需要在构造PearsonCorrelationSimilarity时多传入一个Weighting.WEIGHTED参数,就能使有更多相同评分项目的用户之间的相似度更趋近于1或-1。
UserSimilaritysimilarity1=newPearsonCorrelationSimilarity(model);
doublevalue1=similarity1.userSimilarity(1,5);
UserSimilaritysimilarity2=newPearsonCorrelationSimilarity(model,Weighting.WEIGHTED);
doublevalue2=similarity2.userSimilarity(1,5);
结果:
SimilarityofUser1andUser5:
0.944911182523068
SimilarityofUser1andUser5withweighting:
0.9655694890769175
2.基于欧几里德距离的相似度——EuclideanDistance-basedSimilarity
欧几里德距离计算相似度是所有相似度计算里面最简单、最易理解的方法。
它以经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到坐标系上,并计算他们彼此之间的直线距离。
EuclideanDistance2-Coordinate
Table2
图中用户A和用户B分别对项目X、Y进行了评分。
用户A对项目X的评分为2,对项目Y的评分为4,表示到坐标系中为坐标点A(1.8,4);
同样用户B对项目X、Y的评分表示为坐标点B(4.5,2.5),因此他们之间的欧几里德距离(直线距离)为:
sqrt((B.x-A.x)^2+(A.y-B.y)^2)
EuclideanDistance
计算出来的欧几里德距离是一个大于0的数,为了使其更能体现用户之间的相似度,可以把它规约到(0,1]之间,具体做法为:
1/(1+d)。
参见Table2
EuclideanDistance-basedSimilarity
只要至少有一个共同评分项,就能用欧几里德距离计算相似度;
如果没有共同评分项,那么欧几里德距离也就失去了作用。
其实照常理理解,如果没有共同评分项,那么意味着这两个用户或物品根本不相似。
3.余弦相似度——CosineSimilarity
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。
相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。
CosineSimilarity
与欧几里德距离类似,基于余弦相似度的计算方法也是把用户的喜好作为n-维坐标系中的一个点,通过连接这个点与坐标系的原点构成一条直线(向量),两个用户之间的相似度值就是两条直线(向量)间夹角的余弦值。
因为连接代表用户评分的点与原点的直线都会相交于原点,夹角越小代表两个用户越相似,夹角越大代表两个用户的相似度越小。
同时在三角系数中,角的余弦值是在[-1,1]之间的,0度角的余弦值是1,180角的余弦值是-1。
借助三维坐标系来看下欧氏距离和余弦相似度的区别:
DistanceandCosine3-Coordinates
从图上可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;
而余弦相似度衡量的是空间向量的夹角,更加的是体现在方向上的差异,而不是位置。
如果保持A点的位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦相似度cosθ是保持不变的,因为夹角不变,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦相似度的不同之处。
根据欧氏距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模型:
欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;
而余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)。
Mahout没有专门给出基于余弦相似度的实现。
4.调整余弦相似度——AdjustedCosineSimilarity
在余弦相似度的介绍中说到:
余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感。
因此没法衡量每个维数值的差异,会导致这样一个情况:
比如用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得出的结果是0.98,两者极为相似,但从评分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似度对数值的不敏感导致了结