`
wbj0110
  • 浏览: 1603739 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Mahout的相似性度量(相似度算法)

阅读更多
User CF 和 Item CF 都依赖于相似度的计算,因为只有通过衡量用户之间或物品之间的相似度,才能找到用户的“邻居”,才能完成推荐。上文简单的介绍了相似性的计算,但不完全,下面就对常用的相似度计算方法进行详细的介绍:
 

1. 基于皮尔森相关性的相似度 —— Pearson correlation-based similarity

皮尔森相关系数反应了两个变量之间的线性相关程度,它的取值在[-1, 1]之间。当两个变量的线性关系增强时,相关系数趋于1或-1;当一个变量增大,另一个变量也增大时,表明它们之间是正相关的,相关系数大于0;如果一个变量增大,另一个变量却减小,表明它们之间是负相关的,相关系数小于0;如果相关系数等于0,表明它们之间不存在线性相关关系。

用数学公式表示,皮尔森相关系数等于两个变量的协方差除于两个变量的标准差。

 

协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。如果两个变量的变化趋于一致,也就是说如果其中一个大于自身的期望值,另一个也大于自身的期望值,那么两个变量之间的协方差就是正值;如果两个变量的变化趋势相反,则协方差为负值。


 

其中u表示X的期望E(X), v表示Y的期望E(Y)

 

标准差(Standard Deviation):标准差是方差的平方根

 

方差(Variance):在概率论和统计学中,一个随机变量的方差表述的是它的离散程度,也就是该变量与期望值的距离


 

即方差等于误差的平方和的期望

 

基于皮尔森相关系数的相似度有两个缺点:

(1) 没有考虑(take into account)用户间重叠的评分项数量对相似度的影响;
(2) 如果两个用户之间只有一个共同的评分项,相似度也不能被计算

 

上表中,行表示用户(1~5)对项目(101~103)的一些评分值。直观来看,User1和User5用3个共同的评分项,并且给出的评分走差也不大,按理他们之间的相似度应该比User1和User4之间的相似度要高,可是User1和User4有一个更高的相似度1。

 

同样的场景在现实生活中也经常发生,比如两个用户共同观看了200部电影,虽然不一定给出相同或完全相近的评分,他们之间的相似度也应该比另一位只观看了2部相同电影的相似度高吧!但事实并不如此,如果对这两部电影,两个用户给出的相似度相同或很相近,通过皮尔森相关性计算出的相似度会明显大于观看了相同的200部电影的用户之间的相似度。

 

Mahout对基于皮尔森相关系数的相似度给出了实现,它依赖一个DataModel作为输入。


同时,Mahout还针对缺点(1)进行了优化,只需要在构造PearsonCorrelationSimilarity时多传入一个Weighting.WEIGHTED参数,就能使有更多相同评分项目的用户之间的相似度更趋近于1或-1。

 

[java] view plaincopy
 
  1. UserSimilarity similarity1 = new PearsonCorrelationSimilarity(model);  
  2. double value1 = similarity1.userSimilarity(15);  
  3.   
  4. UserSimilarity similarity2 = new PearsonCorrelationSimilarity(model, Weighting.WEIGHTED);  
  5. double value2 = similarity2.userSimilarity(15);  
结果:
Similarity of User1 and User5: 0.944911182523068
Similarity of User1 and User5 with weighting: 0.9655694890769175
 

2. 基于欧几里德距离的相似度 —— Euclidean Distance-based Similarity

欧几里德距离计算相似度是所有相似度计算里面最简单、最易理解的方法。它以经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到坐标系上,并计算他们彼此之间的直线距离。


图中用户A和用户B分别对项目X、Y进行了评分。用户A对项目X的评分为1.8,对项目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)

计算出来的欧几里德距离是一个大于0的数,为了使其更能体现用户之间的相似度,可以把它规约到(0, 1]之间,具体做法为:1 / (1 + d)。参见上表

只要至少有一个共同评分项,就能用欧几里德距离计算相似度;如果没有共同评分项,那么欧几里德距离也就失去了作用。其实照常理理解,如果没有共同评分项,那么意味着这两个用户或物品根本不相似

 

3. 余弦相似度 —— Cosine Similarity

余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。

与欧几里德距离类似,基于余弦相似度的计算方法也是把用户的喜好作为n-维坐标系中的一个点,通过连接这个点与坐标系的原点构成一条直线(向量),两个用户之间的相似值就是两条直线(向量)间夹角的余弦值。因为连接代表用户评分的点与原点的直线都会相交于原点,夹角越小代表两个用户越相似,夹角越大代表两个用户的相似度越小。同时在三角系数中,角的余弦值是在[-1, 1]之间的,0度角的余弦值是1,180角的余弦值是-1。

借助三维坐标系来看下欧氏距离和余弦相似度的区别:

 

从图上可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;而余弦相似衡量的是空间向量的夹角,更加的是体现在方向上的差异,而不是位置。如果保持A点的位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦相似cosθ是保持不变的,因为夹角不变,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦相似的不同之处。

根据欧氏距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模型:欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;而余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)。

Mahout没有专门给出基于余弦相似度的实现。

 

4. 调整余弦相似 —— Adjusted Cosine Similarity

在余弦相似的介绍中说到:余弦相似更多的是从方向上区分差异,而对绝对的数值不敏感。因此没法衡量每个维数值的差异,会导致这样一个情况:比如用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似得出的结果是0.98,两者极为相似,但从评分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似对数值的不敏感导致了结果的误差,需要修正这种不合理性,就出现了调整余弦相似,即所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似计算,得到-0.8,相似为负值并且差异不小,但显然更加符合现实。

 

5. 斯皮尔曼相关 —— Spearman Correlation

斯皮尔曼相关性可以理解为是排列后(Rank)用户喜好值之间的Pearson相关度。《Mahout in Action》中有这样的解释:假设对于每个用户,我们找到他最不喜欢的物品,重写他的评分值为“1”;然后找到下一个最不喜欢的物品,重写评分值为“2”,依此类推。然后我们对这些转换后的值求Pearson相关系数,这就是Spearman相关系数。

斯皮尔曼相关度的计算舍弃了一些重要信息,即真实的评分值。但它保留了用户喜好值的本质特性——排序(ordering),它是建立在排序(或等级,Rank)的基础上计算的。

回顾前面表中User1~5对Item101~103的喜好(评分)值,通过斯皮尔曼相关系数计算出的相似度为:

 

我们发现,计算出来的相似度值要么是1,要么是-1,因为这依赖于用户的喜好值和User1的喜好值是否趋于“一致变化”还是呈“相反趋势变化"。

Mahout对斯皮尔曼相关系数给出了实现,具体可参考SpearmanCorrelationSimilarity,它的执行效率不是非常高,因为斯皮尔曼相关性的计算需要花时间计算并存储喜好值的一个排序(Ranks),具体时间取决于数据的数量级大小。正因为这样,斯皮尔曼相关系数一般用于学术研究或者是小规模的计算。
[java] view plaincopy
 
  1. UserSimilarity similarity1 = new SpearmanCorrelationSimilarity(model); // construct a Spearman Correlation-based Similarity  

结果:

User1 to User1 : 1.0
User2 to User1 : -1.0
User3 to User1 : NaN
User4 to User1 : 1.0
User4 to User1 : 1.0

 

考虑到Spearman Correlation的效率,可以把SpearmanCorrelationSimilarity包装一层Cache,具体做法为:

 

[java] view plaincopy
 
  1. UserSimilarity similarity2 = new CachingUserSimilarity(new SpearmanCorrelationSimilarity(model), model);  

这样,每次计算的结果会直接放入Cache,下一次计算的时候可以立即得到结果,而不是重新再计算一次。

 

6. 基于谷本系数的相似性度量 —— Tanimoto Coefficient-based Similarity

Tanimoto Coefficient和前面的5中相关度计算方式有很大的不同,它不关心用户对物品的具体评分值是多少,它在关心用户与物品之间是否存在关联关系。还记得上一篇文章《Mahout学习笔记——数据承载》里面提到的布尔喜好值(Boolean Preference)吧!Tanimoto Coefficient依赖于用户和物品之间的这种Boolean关系作为输入。

更准确的说法为:Tanimoto Coefficient主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具体值的大小,只能获得“是否相同”这个结果,所以Tanimoto Coefficient只关心个体间共同具有的特征是否一致这个问题。Tanimoto Coefficient又被叫做Jaccard Coefficient,其值等于两个用户共同关联(不管喜欢还是不喜欢)的物品数量除于两个用户分别关联的所有物品数量。

也就是关联的交集除于关联的并集,用公式表示为:


 

其值介于[0, 1]之间,如果两个用户关联的物品完全相同,交集等于并集,值为1;如果没有任何关联,交集为空,值为0。
注:本块中说到的关联指用户对物品有评分值
 

 

大家可以加我个人微信号:scccdgf

 

 

或者关注soledede的微信公众号:soledede
 
分享到:
评论

相关推荐

    用R解析Mahout用户推荐协同过滤算法(UserCF)

    它基于用户的历史行为数据,通过发现用户之间的相似性来预测他们可能对未评价项目的好恶,进而进行个性化推荐。UserCF侧重于用户之间的相似性,寻找具有相似兴趣或品味的用户,并将一个用户喜欢的项目推荐给其他相似...

    基于协同过滤算法的电影推荐系统 (2).docx

    2. **用户界面**:用户可以在首页设置推荐参数,比如邻居个数和相似性度量方法。一旦用户提交了这些参数,系统就会基于协同过滤算法进行处理,并展示推荐结果。 3. **性能优化**:文档中提到,系统在性能方面存在...

    基于协同过滤算法的电影推荐系统 (2).pdf

    协同过滤算法是推荐系统中的一种常见技术,尤其在电影推荐领域广泛应用。该算法的基本思想是通过分析...在电影推荐系统的设计和实现中,选择合适的相似性度量方法,以及优化推荐算法以应对各种挑战,都是至关重要的。

    基于协同过滤算法的电影系统 (2).docx

    本文将深入探讨基于协同过滤算法的电影推荐系统的设计原理、核心组件以及相似性度量方法。 首先,协同过滤算法是一种基于用户行为和兴趣的推荐策略,不依赖于内容本身的特性,而是通过分析用户的历史行为,如电影...

    基于协同过滤算法的电影推荐系统设计 (2).docx

    在相似性度量方面,皮尔森相关性常被用作计算用户或物品相似度的工具。皮尔森相关系数通过测量两个变量的协方差和标准差,得出它们之间的线性相关程度,范围在 [-1, 1] 之间。正相关(系数>0)表示随着一个变量的...

    基于协同过滤算法的电影推荐系统设计 (2).pdf

    例如,皮尔森相关性是一种常见的相似性度量,它测量两个变量之间的线性相关程度,范围在-1到1之间。当相关系数接近1或-1时,表示两个变量高度相关,0表示无线性相关。在电影推荐中,皮尔森相关系数用于评估用户对...

    聚类分析 (4).docx

    聚类分析是数据挖掘和统计学中的一个重要概念,其目标是将数据对象依据相似性归类到不同的簇中。这个过程旨在发现数据内在的结构和模式,使得同一簇内的对象间相似度高,而不同簇间的对象差异大。聚类分析的应用广泛...

    java基于Mahout实现协同过滤推荐算法的电影推荐系统源码+详细说明.zip

    在Java中使用Mahout进行推荐系统开发,首先需要理解其核心概念,如相似度度量(如余弦相似度)、用户和物品的向量表示以及预测生成等。 项目源码中可能包含以下几个关键部分: 1. 数据预处理:获取用户评分数据,...

    kmeans算法文本聚类java源码(分词,TF/IDF等)

    使用余弦相似度来计算两篇文档的相似度,它是通过计算两个向量的夹角余弦值来衡量它们的相似程度。在文本聚类中,将每个文档看作一个向量,其维度是词汇表的大小,值是TF-IDF值。两个向量的余弦相似度越高,表示这两...

    Java基于协同过滤算法的电影推荐系统源代码,利用修正的余弦相似度算法做影片推荐

    1. **协同过滤算法**:协同过滤是推荐系统中最常见的方法之一,它基于用户行为或物品属性的相似性进行预测。在电影推荐系统中,协同过滤分为用户-用户协同过滤和物品-物品协同过滤。本项目可能采用了用户-用户协同...

    基于协同过滤算法的电影推荐系统.docx

    总的来说,协同过滤算法在电影推荐系统中的应用是通过分析用户的行为和偏好,寻找潜在的相似性,以预测用户可能的兴趣,从而提供个性化推荐。Apache Mahout 的 Taste 框架为此提供了强大的技术支持,能够处理大规模...

    基于协同过滤算法的电影系统.pdf

    【相似性度量】在协同过滤中,相似性度量是关键。皮尔森相关系数是一种常用的方法,它测量两个变量之间的线性相关性,范围在-1到1之间。1表示完全正相关,-1表示完全负相关,0表示没有线性关系。在电影推荐中,...

    mahout学习1---推荐引擎的构建1

    这通常通过协同过滤算法实现,如余弦相似度或皮尔逊相关系数,来度量两个用户对共同评价物品的相似性。如果两个用户对同一组物品的评分相近,那么他们可能有相似的兴趣,系统可以将一个用户喜欢的但另一个用户还未...

    Artificial Intelligence (AI) Algorithms:Java中的不同人工智能算法。 例如:向量空间-开源

    4. **相似度计算**:使用余弦相似度或其他合适的距离度量方法来评估两个文档向量之间的相似性。余弦相似度计算的是两个向量的夹角余弦值,数值范围在-1到1之间,值越接近1,表示两个向量越相似。 5. **应用**:向量...

    基于.协同过滤算法的电影推荐系统.pdf

    例如,皮尔森相关系数(Pearson Correlation Coefficient)是一种常用的相似性度量,其值范围在 [-1, 1],1 表示完全正相关,-1 表示完全负相关,0 表示没有线性相关。这个系数可以计算两个用户对同一组电影的评分...

    mahout 简介,中文

    Mahout的灵活性和可扩展性使其成为企业和研究机构进行机器学习实践的理想选择。随着大数据和人工智能领域的持续发展,Mahout作为一款成熟且功能强大的工具,将继续在学术界和工业界发挥重要作用。

    系统聚类 java

    系统聚类是数据分析领域中的一个重要概念,主要用于将数据集中的对象根据它们的相似性或差异性划分成不同的群组,即聚类。在Java中,系统聚类可以通过各种算法实现,如K-Means、层次聚类(Hierarchical Clustering)...

    Mahout之Item-based应用使用

    Mahout提供了几种不同的相似度度量方法,如皮尔逊相关系数、余弦相似度等。例如,我们可以使用余弦相似度来衡量两个项目向量之间的角度,值越接近1表示相似度越高。 2. **邻近项集的构建**:基于计算出的相似度,...

Global site tag (gtag.js) - Google Analytics