在现实中普遍使用的推荐系统通常都是基于协同过滤算法的,这类算法一般都须要计算用户与用户或者项目与项目之间的类似度,对于数据量以及数据类型不一样的数据源,须要不一样的类似度计算方法来提升推荐性能,在mahout提供了大量用于计算类似度的组件,这些组件分别实现了不一样的类似度计算方法。下图用于实现类似度计算的组件之间的关系: html
图一、项目类似度计算组件 算法
图二、用户类似度计算组件 ide
下面就几个重点类似度计算方法作介绍: 性能
类名:PearsonCorrelationSimilarity idea
原理:用来反映两个变量线性相关程度的统计量 htm
范围:[-1,1],绝对值越大,说明相关性越强,负相关对于推荐的意义小。 blog
说明:一、 不考虑重叠的数量;二、 若是只有一项重叠,没法计算类似性(计算过程被除数有n-1);三、 若是重叠的值都相等,也没法计算类似性(标准差为0,作除数)。 排序
该类似度并非最好的选择,也不是最坏的选择,只是由于其容易理解,在早期研究中常常被提起。使用Pearson线性相关系数必须假设数据是成对地从正态分布中取得的,而且数据至少在逻辑范畴内必须是等间距的数据。Mahout中,为皮尔森相关计算提供了一个扩展,经过增长一个枚举类型(Weighting)的参数来使得重叠数也成为计算类似度的影响因子。 ci
类名:EuclideanDistanceSimilarity get
原理:利用欧式距离d定义的类似度s,s=1 / (1+d)。
范围:[0,1],值越大,说明d越小,也就是距离越近,则类似度越大。
说明:同皮尔森类似度同样,该类似度也没有考虑重叠数对结果的影响,一样地,Mahout经过增长一个枚举类型(Weighting)的参数来使得重叠数也成为计算类似度的影响因子。
类名:PearsonCorrelationSimilarity和UncenteredCosineSimilarity
原理:多维空间两点与所设定的点造成夹角的余弦值。
范围:[-1,1],值越大,说明夹角越大,两点相距就越远,类似度就越小。
说明:在数学表达中,若是对两个项的属性进行了数据中心化,计算出来的余弦类似度和皮尔森类似度是同样的,在mahout中,实现了数据中心化的过程,因此皮尔森类似度值也是数据中心化后的余弦类似度。另外在新版本中,Mahout提供了UncenteredCosineSimilarity类做为计算非中心化数据的余弦类似度。
类名:SpearmanCorrelationSimilarity
原理:Spearman秩相关系数一般被认为是排列后的变量之间的Pearson线性相关系数。
范围:{-1.0,1.0},当一致时为1.0,不一致时为-1.0。
说明:计算很是慢,有大量排序。针对推荐系统中的数据集来说,用Spearman秩相关系数做为类似度量是不合适的。
类名:CityBlockSimilarity
原理:曼哈顿距离的实现,同欧式距离类似,都是用于多维数据空间距离的测度
范围:[0,1],同欧式距离一致,值越小,说明距离值越大,类似度越大。
说明:比欧式距离计算量少,性能相对高。
类名:TanimotoCoefficientSimilarity
原理:又名广义Jaccard系数,是对Jaccard系数的扩展,等式为
范围:[0,1],彻底重叠时为1,无重叠项时为0,越接近1说明越类似。
说明:处理无打分的偏好数据。
类名:LogLikelihoodSimilarity
原理:重叠的个数,不重叠的个数,都没有的个数
范围:具体可去百度文库中查找论文《Accurate Methods for the Statistics of Surprise and Coincidence》
说明:处理无打分的偏好数据,比Tanimoto系数的计算方法更为智能。