首页 > 代码库 > 汇总从代数角度与几何角度理解相似度计算方法(以机器学习Mahout框架为主线)

汇总从代数角度与几何角度理解相似度计算方法(以机器学习Mahout框架为主线)

相似度的计算是数据挖掘与机器学习中的一个永恒的话题,为了能更好地理解与比较各种相似度计算的方法,能灵活运用到各种计算模型中,自己在研究机器学习之Mahout框架时,源代码中也实现了很多相似度计算方法,本文结合机器学习Mahout框架中各种相似度计算方法的实现,并且从代数角度和几何角度来理解相似度的计算方法。并阐述其优缺点,及自己的适用场景。本文通过总结和归纳,一共总结了9中距离测量方法,方法一到方法七是Mahout中完完本本实现了,其中前面是方面名,破折号后是Mahout中各方法实现的类名,本文结合Mahout in Action这本书的介绍及自己对数学知识的理解,进行了全面的阐述,希望对你有用,如有不足请提出指导意见。

 

内容摘要:

方法一:皮尔森相关度——PearsonCorrelationSimilarity

方法二:欧式(欧几里德)距离相似度——EuclideanDistanceSimilarity

方法三:余弦相似度——PearsonCorrelationSimilarity和UncenteredCosineSimilarity

方法四:Spearman(斯皮尔曼)秩相关系数——SpearmanCorrelationSimilarity

方法五:曼哈顿距离(闵可夫斯基距离《Minkowsk distance》特例)——CityBlockSimilarity

方法六:Tanimoto(谷本)系数(又称广义Jaccard系数)——TanimotoCoefficientSimilarity

方法七:对数似然相似度——LogLikelihoodSimilarity

方法八:Jaccard系数及Jaccard相似性度量(杰卡德相似性度量)

方法九:汉明距离(Hammingdistance)

方法使用对比:余弦距离和欧氏距离的对比

 

内容详细阐述如下:

方法一:皮尔森相关度——PearsonCorrelationSimilarity

类名:PearsonCorrelationSimilarity

原理:用来反映两个变量线性相关程度的统计量

范围:[-1,1],绝对值越大,说明相关性越强,负相关对于推荐的意义小。

在数据分析中实际应用说明

基于皮尔森相关系数的相似度有两个缺点:
1、没有考虑(take into account)用户间重叠的评分项数量对相似度的影响;
2、如果两个用户之间只有一个共同的评分项,相似度也不能被计算(计算过程被除数有n-1)

3、如果重叠的值都相等,也无法计算相似性(标准差为0,做除数)。

      该相似度并不是最好的选择,也不是最坏的选择,只是因为其容易理解,在早期研究中经常被提起。使用Pearson线性相关系数必须假设数据是成对地从正态分布中取得的,并且数据至少在逻辑范畴内必须是等间距的数据。Mahout中,为皮尔森相关系数计算提供了一个扩展,通过增加一个枚举类型(Weighting)的参数来使得重叠数也成为计算相似度的影响因子。

技术分享

摘自《Mahout in ActionP49

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

Mahout对该系数优化实战解析:正如前面总结所示,Mahout通过增加枚举类型(Weighting)来优化皮尔森相关系数,Mahout对其优化如下所示,只需要在构造PearsonCorrelationSimilarity时多传入一个Weighting.WEIGHTED参数,就能使有更多相同评分项目的用户之间的相似度更趋近于1或-1。
UserSimilaritysimilarity1 = new PearsonCorrelationSimilarity(model);
double value1 = similarity1.userSimilarity(1, 5);
UserSimilarity similarity2 = new PearsonCorrelationSimilarity(model,Weighting.WEIGHTED);
double value2 = similarity2.userSimilarity(1, 5);

结果:
Similarity of User1 and User5: 0.944911182523068
Similarity of User1 and User5 with weighting: 0.9655694890769175

参考资料:http://www.douban.com/note/208193209/

 

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

 

皮尔逊相关系数数学代数意义:

技术分享

皮尔逊相关系数理解有两个角度

其一,按照高中数学水平来理解,它很简单, 可以看做将两组数据首先做Z分数处理之后, 然后两组数据的乘积和除以样本数。

Z分数一般代表正态分布中, 数据偏离中心点的距离。等于变量减掉平均数再除以标准差。

标准差则等于变量减掉平均数的平方和,再除以样本数,最后再开方。所以, 根据这个最朴素的理解,我们可以将公式依次精简为:

技术分享

其二,按照大学的线性数学水平来理解, 它比较复杂一点,可以看做是两组数据的向量夹角的余弦。

 

皮尔逊相关的约束条件,从以上解释, 也可以理解皮尔逊相关的约束条件:

1、两个变量间有线性关系

2、变量是连续变量

3、变量均符合正态分布,且二元分布也符合正态分布

4、两变量独立

在实践统计中,一般只输出两个系数,一个是相关系数,也就是计算出来的相关系数大小,在-1到1之间;另一个是独立样本检验系数,用来检验样本一致性。

 

举例说明如下,使用维基中的例子:

例如,假设五个国家的国民生产总值分别是12358(单位10亿美元),又假设这五个国家的贫困比例分别是11%12%13%15%18%

 

创建2个向量.(R语言)

x<-c(1,2,3,5,8)

y<-c(0.11,0.12,0.13,0.15,0.18)

按照维基的例子,应计算出相关系数为1出来.我们看看如何一步一步计算出来的.

x的平均数是:3.8
y的平均数是0.138
所以,

sum((x-mean(x))*(y-mean(y)))=0.308

用大白话来写就是:

(1-3.8)*(0.11-0.138)=0.0784
(2-3.8)*(0.12-0.138)=0.0324
(3-3.8)*(0.13-0.138)=0.0064
(5-3.8)*(0.15-0.138)=0.0144
(8-3.8)*(0.18-0.138)=0.1764

0.0784+0.0324+0.0064+0.0144+0.1764=0.308

同理, 分号下面的,分别是:

sum((x-mean(x))^2)=30.8
sum((y-mean(y))^2)= 0.00308

用大白话来写,分别是:

(1-3.8)^2=7.84 #平方
(2-3.8)^2=3.24 #平方
(3-3.8)^2=0.64 #平方
(5-3.8)^2=1.44 #平方
(8-3.8)^2=17.64 #平方

7.84+3.24+0.64+1.44+17.64=30.8

同理,求得:

sum((y-mean(y))^2)= 0.00308

然后再开平方根,分别是:

30.8^0.5=5.549775
0.00308^0.5=0.05549775

用分子除以分母,就计算出最终结果:

0.308/(5.549775*0.05549775)=1

再举个简单的R语言例子(R在这里下载: http://cran.r-project.org/bin/macosx/)

假设有100人, 一组数据是年龄,平均年龄是35岁,标准差是5岁;另一组数据是发帖数量,平均帖子数量是45份post,标准差是8份帖子.

假设这两组都是正态分布.我们来求这两者的皮尔逊相关系数,R脚本如下:

> x<-rnorm(n=100,mean=35,sd=5)  #创建一组平均数为35,标准差为5,样本数为100的随机数

> y<-rnorm(n=100,mean=45,sd=8) #创建一组平均数为45,标准差为8,样本数为100的随机数

> cor.test(x,y,method="pearson") #计算这两组数的相关,并进行T检验

然后R输出结果为:

Pearson‘s product-moment correlation

 

data: x and y

t = -0.0269, df = 98, p-value = http://www.mamicode.com/0.9786

alternative hypothesis: true correlation isnot equal to 0

95 percent confidence interval:

 -0.1990316 0.1938019

sample estimates:

        cor

-0.002719791

当然,这里是随机数.也可以用非随机的验证一下计算.

皮尔逊相关系数用于网站开发

直接将R与Ruby关联起来

调用很简单,仿照上述例子:

cor(x,y)

就输出系数结果了.

有这么几个库可以参考:

https://github.com/alexgutteridge/rsr...

https://github.com/davidrichards/stat...

https://github.com/jtprince/simpler

说明, 以上为ruby调用库. pythone程序员可以参考: Rpy (http://rpy.sourceforge.net/)

简单的相关系数的分类

0.8-1.0 极强相关

0.6-0.8 强相关

0.4-0.6 中等程度相关

0.2-0.4 弱相关

0.0-0.2 极弱相关或无相关

参考网址:http://segmentfault.com/q/1010000000094674

 

方法二:欧式(欧几里德)距离相似度——EuclideanDistanceSimilarity

类名:EuclideanDistanceSimilarity

原理:利用欧式距离d定义的相似度s,s=1 / (1+d)。

范围:[0,1],值越大,说明d越小,也就是距离越近,则相似度越大。

在数据分析中实际应用说明

同皮尔森相似度一样,该相似度也没有考虑重叠数对结果的影响,同样地,Mahout通过增加一个枚举类型(Weighting)的参数来使得重叠数也成为计算相似度的影响因子。

技术分享

摘自《Mahout in ActionP51

         如图中用户User1和用户User2分别对项目Item101、Item102、Item103进行了评分。用户User1对项目Item101的评分为5.0,对项目Item102的评分为3.0,对项目Item103的评分为2.5,表示到三维坐标系中为坐标点A(5.0,3.0,2.5);同样用户User2对项目Item101、Item102、Item103的评分表示为坐标点B(2.0,2.5,5.0),因此他们之间的欧几里德距离(直线距离)为:d(x,y) = sqrt((B.x - A.x)^2 + (A.y - B.y)^2 + (A.z - B.z)^2)。

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

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

 

欧式(欧几里德)距离数学代数意义:

         欧氏距离定义: 欧氏距离(Euclidean distance)是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。 在二维和三维空间中的欧式距离的就是两点之间的距离。

技术分享

n维欧氏空间是一个点集,它的每个点可以表示为(x(1),x(2),…x(n)),其中x(i)(i=1,2…n)是实数,称

为x的第i个坐标,两个点x和y=(y(1),y(2)…y(n))之间的距离d(x,y)定义为上面的公式。欧氏

距离看作信号的相似程度。距离越近就越相似,就越容易相互干扰,误码率就越高。 

欧氏距离(http://en.wikipedia.org/wiki/Euclidean_distance )即两项间的差是每个变量差值的平方和再平方根,目的是计算其间的整体距离即不相似性。我们熟悉的欧氏距离虽然很有用,但也有明显的缺点。它将样品的不同属性(即各指标或各变量)之间的差别等同看待,这一点有时不能满足实际要求。例如,在教育研究中,经常遇到对人的分析和判别,个体的不同属性对于区分个体有着不同的重要性。因此,有时需要采用不同的距离函数。

补充说明:http://topic.csdn.net/u/20090819/15/4d4ccbe6-f186-48e6-a150-61c1f41dc4d2.html 

相关的参考:http://blog.csdn.net/chl033/article/details/5526337

 

方法三:余弦相似度——PearsonCorrelationSimilarityUncenteredCosineSimilarity

类名:PearsonCorrelationSimilarity和UncenteredCosineSimilarity

原理:多维空间两点与所设定的点形成夹角的余弦值。

范围:[-1,1],值越大,说明夹角越大,两点相距就越远,相似度就越小。

在数据分析中实际应用说明

在数学表达中,如果对两个项的属性进行了数据中心化,计算出来的余弦相似度和皮尔森相似度是一样的,在mahout中,实现了数据中心化的过程,所以皮尔森相似度值也是数据中心化后的余弦相似度。另外在新版本中,Mahout提供了UncenteredCosineSimilarity类作为计算非中心化数据的余弦相似度。

 

数学代数意义:

         余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。

向量,是多维空间中有方向的线段,如果两个向量的方向一致,即夹角接近零,那么这两个向量就相近。而要确定两个向量方向是否一致,这就要用到余弦定理计算向量的夹角。余弦定理描述了三角形中任何一个夹角和三个边的关系。给定三角形的三条边,可以使用余弦定理求出三角形各个角的角度。

技术分享

         当两条新闻向量夹角余弦等于1时,这两条新闻完全重复(用这个办法可以删除爬虫所收集网页中的重复网页);当夹角的余弦值接近于1时,两条新闻相似(可以用作文本分类);夹角的余弦越小,两条新闻越不相关。

补充说明(为了更好地理解,请参看本节Blog文章中——余弦距离和欧氏距离的对比

由于欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;而余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题。解决这个问题,请参考:调整余弦相似度 —— Adjusted Cosine Similarity

为了更好地理解可以参看如下网址:

余弦距离、欧氏距离和杰卡德相似性度量的对比分析

         http://www.cnblogs.com/chaosimple/archive/2013/06/28/3160839.html

 

方法四:Spearman(斯皮尔曼)秩相关系数——SpearmanCorrelationSimilarity

类名:SpearmanCorrelationSimilarity

原理:Spearman秩相关系数通常被认为是排列后的变量之间的Pearson线性相关系数。

范围:{-1.0,1.0},一致时为1.0,不一致时为-1.0。

在数据分析中实际应用说明

计算非常慢,有大量排序。针对推荐系统中的数据集来讲,用Spearman秩相关系数作为相似度量是不合适的。

斯皮尔曼相关性可以理解为是排列后(Rank)用户喜好(值)之间的Pearson相关度。《Mahoutin Action》中有这样的解释:假设对于每个用户,我们找到他最不喜欢的物品,重写他的评分值为“1”;然后找到下一个最不喜欢的物品,重写评分值为“2”,以此类推。然后我们对这些转换后的值,求Pearson相关系数,这就是Spearman相关系数。
    斯皮尔曼相关度的计算舍弃了一些重要信息,即真实的评分值。但它保留了用户喜好(值)的本质特性——排序(ordering),它是建立在排序(或等级,Rank)的基础上计算的。回顾前面表中User1~User5对Item101~Item103的喜好(评分)值,通过斯皮尔曼相关系数计算出的相似度为:

技术分享

摘自《Mahout in ActionP53

从上面表格我们发现,计算出来的相似度值要么是1,要么是-1,因为这依赖于用户的喜好(值)和User1的喜好(值)是否趋于“一致变化”还是呈“相反趋势变化"。
    Mahout对斯皮尔曼相关系数给出了实现,具体可参考SpearmanCorrelationSimilarity,它的执行效率不是非常高,因为斯皮尔曼相关性的计算需要花时间计算并存储喜好(值)的一个排序(Ranks),具体时间取决于数据的数量级大小。正因为这样,斯皮尔曼相关系数一般用于学术研究或者是小规模的计算
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
    考虑到SpearmanCorrelation的效率,可以把SpearmanCorrelationSimilarity包装一层Cache,具体做法为:
UserSimilaritysimilarity2 = new CachingUserSimilarity(newSpearmanCorrelationSimilarity(model), model);
    这样,每次计算的结果会直接放入Cache,下一次计算的时候可以立即得到结果,而不是重新再计算一次。

参考网址:http://www.douban.com/note/208193209/

 

斯皮尔曼相关系数数学代数理解:

         说到相关,大家很容易就会想到Pearson积差相关,很少会想到Spearman等级相关。可是Spearman相关很有用。虽然Pearson相关是最常用的相关,但是它一般用来研究等距或等比数据的线性相关。因此,当数据不属于这种情况时,Spearman相关就派上用场了。

Spearman相关的显著性检验是一种非参数检验方法。

一般在两种情况下会用到:

1,  当研究的变量为顺序型数据时。

2,  当研究的变量为非线性数据时。

Spearman相关不仅仅用来考查顺序型变量间的相关,即使在原始数据时等比或等距时,也可以使用。当X和Y两个变量之间有较强的正向关系,但是这种关系对线性模型并不符合。在这种情况下,Spearman相关就可以用来检验关系的稳定性,这种检验时独立于特定模型的。如果说Pearson相关是检验形式的,那么Spearman相关就是检验稳定性的。因为,Spearman相关是与X和Y值所对应的等级有关的,而不管X和Y具体的取值。而Pearson相关是以具体的数值来计算的,很大程度上受具体数值的影响,而Spearman相关中,具体数值被转化为依次排名。因此,如果两个变量是稳定相关的,那么它们的等级将会线性相关,即一个正向的相关意味着每次X值增加,Y值也会相应增加,至于增加多少,就不去管它了。因此,当我们关心的是两个变量之间关系的稳定性而不是关系的形式时,可以使用Spearman相关

参考网址:

http://blog.sina.com.cn/s/blog_492fc79e01009gnu.htmlhttp://blog.sina.com.cn/s/blog_492fc79e01009gnu.html

 

方法五:曼哈顿距离(闵可夫斯基距离《Minkowsk distance》特例)——CityBlockSimilarity

类名:CityBlockSimilarity

原理:曼哈顿距离的实现,同欧式距离相似,都是用于多维数据空间距离的测度

范围:[0,1],同欧式距离一致,值越小,说明距离值越大,相似度越大。

在数据分析中实际应用说明

比欧式距离计算量少,性能相对高。

 

曼哈顿(闵(明)可夫斯基)距离数学代数理解:

可看成是欧氏距离的指数推广,还没有见到过很好的应用实例,但通常,推广都是一种进步,特别的:

当p=1时,也成做曼哈顿距离,也称绝对距离,曼哈顿距离来源于城市区块距离,是将多个维度上的距离进行求和后的结果。ManhattanDistanceMeasure.

当q=∞时,称为切比雪夫距离ChebyshevDistanceMeasure 

切比雪夫距离起源于国际象棋中国王的走法,我们知道国际象棋国王每次只能往周围的8格中走一步,那么如果要从棋盘中A格(x1, y1)走到B格(x2, y2)最少需要走几步?扩展到多维空间,其实切比雪夫距离就是当p趋向于无穷大时的明氏(闵(明)可夫斯基)距离:

技术分享

参考网址:http://www.cnblogs.com/shipengzhi/articles/2540382.html

 

CityBlock(或者曼哈顿)相似度(补充)

出租车几何或曼哈顿距离(ManhattanDistance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点上在标准坐标系上的绝对轴距总和。图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。

技术分享

参考网址:http://blog.csdn.net/suwei19870312/article/details/17355149

 

方法六:Tanimoto(谷本)系数(又称广义Jaccard系数)——TanimotoCoefficientSimilarity

类名:TanimotoCoefficientSimilarity

原理:又名广义Jaccard系数,是对Jaccard系数的扩展,等式为

范围:[0,1],完全重叠时为1,无重叠项时为0,越接近1说明越相似。

在数据分析中实际应用说明

处理无打分的偏好数据。

         TanimotoCoefficient和前面的5中相关度计算方式有很大的不同,它不关心用户对物品的具体评分值是多少,它在关心用户与物品之间是否存在关联关系。Tanimoto Coefficient依赖于用户和物品之间的这种Boolean关系作为输入。
    更准确的说法为:Tanimoto Coefficient主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具体值的大小,只能获得“是否相同”这个结果,所以Tanimoto Coefficient只关心个体间共同具有的特征是否一致这个问题。Tanimoto Coefficient又被叫做Jaccard Coefficient,其值等于两个用户共同关联(不管喜欢还是不喜欢)的物品数量除于两个用户分别关联的所有物品数量。

技术分享

摘自《Mahout in ActionP54

Tanimoto(谷本)系数数学代数理解:

技术分享

         通常应用于X为布尔向量,即各分量只取0或1的时候。此时,表示的是X,Y的公共特征的占X,Y所占有的特征的比例。

技术分享

参考网址:

http://www.douban.com/note/208193209/

http://www.cnblogs.com/shipengzhi/articles/2540382.html

 

方法七:对数似然相似度——LogLikelihoodSimilarity

类名:LogLikelihoodSimilarity

原理:重叠的个数,不重叠的个数,都没有的个数

范围:具体可去百度文库中查找论文《AccurateMethods for the Statistics of Surprise and Coincidence》

说明

处理无打分的偏好数据,比Tanimoto系数的计算方法更为智能。

 

方法八:Jaccard系数及Jaccard相似性度量(杰卡德相似性度量)

杰卡德相似系数/杰卡德距离

两个集合A和B交集元素的个数在A、B并集中所占的比例,称为这两个集合的杰卡德系数,用符号 J(A,B) 表示。杰卡德相似系数是衡量两个集合相似度的一种指标(余弦距离也可以用来衡量两个集合的相似度)。与杰卡德相似系数相反的概念是杰卡德距离(Jaccard Distance),可以用如下公式来表示:

技术分享

杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。

 

杰卡德相似系数的应用

假设样本A和样本B是两个n维向量,而且所有维度的取值都是0或1。例如,A(0,1,1,0)和B(1,0,1,1)。我们将样本看成一个集合,1表示集合包含该元素,0表示集合不包含该元素。

p:样本A与B都是1的维度的个数

q:样本A是1而B是0的维度的个数

r:样本A是0而B是1的维度的个数

s:样本A与B都是0的维度的个数

那么样本A与B的杰卡德相似系数可以表示为:J=p/(p+q+r)

此处分母之所以不加s的原因在于:

对于杰卡德相似系数或杰卡德距离来说,它处理的都是非对称二元变量。非对称的意思是指状态的两个输出不是同等重要的,例如,疾病检查的阳性和阴性结果。

按照惯例,我们将比较重要的输出结果,通常也是出现几率较小的结果编码为1(例如HIV阳性),而将另一种结果编码为0(例如HIV阴性)。给定两个非对称二元变量,两个都取1的情况(正匹配)认为比两个都取0的情况(负匹配)更有意义。负匹配的数量s认为是不重要的,因此在计算时忽略。

 

杰卡德相似度算法分析

杰卡德相似度算法没有考虑向量中潜在数值的大小,而是简单的处理为0和1,不过,做了这样的处理之后,杰卡德方法的计算效率肯定是比较高的,毕竟只需要做集合操作。Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具体值的大小,只能获得是否相同这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题

参考网址:

http://www.cnblogs.com/chaosimple/archive/2013/06/28/3160839.html

http://www.cnblogs.com/shipengzhi/articles/2540382.html


方法九:汉明距离(Hammingdistance)

在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。

    例如:

    1011101 与 1001001 之间的汉明距离是 2。
    2143896 与 2233796 之间的汉明距离是 3。
    "toned" 与 "roses" 之间的汉明距离是 3。

参考网址:http://www.cnblogs.com/shipengzhi/articles/2540382.html

 

方法使用对比:余弦距离和欧氏距离的对比

从上面余弦距离分析可知,余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异。

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

技术分享

从上图可以看出,欧氏距离衡量的是空间各点的绝对距离,和各个点所在的位置坐标直接相关;而余弦距离衡量的是空间向量的夹角,更加体现在方向上的差异,而不是位置。如果保持A点位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦距离 cos? 是保持不变的(因为夹角没有发生变化),而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦距离之间的不同之处。欧氏距离和余弦距离各自有不同的计算方式和衡量特征,因此它们适用于不同的数据分析模型:

欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。

余弦距离更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。

参考文献:http://www.cnblogs.com/chaosimple/archive/2013/06/28/3160839.html

 

参考资料:

Mahout中相似度计算方法介绍:

         http://www.cnblogs.com/dlts26/archive/2012/06/20/2555772.html

如何理解皮尔逊相关系数(Pearson Correlation Coefficient)

         http://segmentfault.com/q/1010000000094674

Mahout推荐算法API详解

http://blog.fens.me/mahout-recommendation-api/

Mahout官网及官网博文:http://mahout.apache.org/

汇总从代数角度与几何角度理解相似度计算方法(以机器学习Mahout框架为主线)