Mahout实战之相似性度量

来源:互联网 发布:工商网络监管 编辑:程序博客网 时间:2024/05/22 04:53

1. 相似度计算

之前我们提到过基于用户的推荐程序包括两个重要的部分:UserNeighborhood和UserSimilarity。可见相似度时推荐算法中重要的一环,如果对用户之间的相似性缺乏可靠并有效的定义,这类推荐方法是没有意义的。无论是“基于物品”还是“基于用户”,推荐算法都十分依赖于相似度的计算。接下来将阐述Mahout中所用到的相似度计算标准。

a.基于皮尔逊相关系数的相似度

皮尔逊相关系数相似度,在Mahout中最为直接的体现是PearsonCorrelationSimilarity这一实现,它是一个基于皮尔逊相关系数的相似性度量标准。
皮尔逊相关系数是一个介于-1和1之间的数,它度量两个一一对应的数列之间的线性相关程度。也就是说,它表示两个数列中对应数字一起增大或一起减小的可能性。 当这两个数列存在一个大致的线性关系时,这种倾向越强,相关值趋于1;相关性弱时,趋于0。在负相关情况下,一个序列的值高而另一个序列的值低——相关值趋于-1。

皮尔逊相关系数在统计学中使用广泛,在推荐系统中用于度量用户或物品之间的相似性,它度量两个用户针对同遗物品的偏好值变化趋势的一致性——都偏高或都偏低。

尽管结果很直观,但皮尔逊相关系数依然存在一些问题。
- 首先皮尔逊相关系数没有考虑两个用户同时给出偏好值的物品数目。例如两个看过200部相同电影的用户,几遍他们给出的评分偶尔不一致,但可能也要比两个金看过两部相同电影的用户更想死。
- 其次,基于皮尔逊相关系数计算的定义,如果两个用户的交集仅包含一个物品,则无法计算相关性。这是没有计算用户1和3之间相关性的原因。在小的或者稀疏的数据集上,这个问题就会凸显出来。
- 最后,只要任何一个序列中出现偏好值相同的情况,相关系数都是未定义 。这种情况并不需要两个序列中的偏好值都完全一样。

因此,独立使用皮尔逊相关系数进行相似度计算还缺乏一定的可靠性。Mahout中的PearsonCorrelationSimilarity还引入了以个扩展,即加权(weigting)。

//...UserSimilarity similarity=new PearsonCorrelationSimilarity(model,Wighting.WEIGHTED);

在此构造函数中添加Wighting.WEIGHTED参数,其主要作用是使正相关值向1.0便宜,而负相关值向-1.0便宜。

b. 基于欧式距离定义相似度

Mahout中以EculideanDistanceSimilarity实现欧式距离相似度计算,欧式距离相似度将用户投影成多维空间的点,用户对每个物品的评价构成这个用户在该空间的坐标,并以此计算不同用户之间的距离。这个距离d便可表征不同用户之间的相似度。实际中我们往往采用

Similarity=1/(1+d)

来表示相似度。距离为0,也就是两点重合时,其结果为1;随着距离d的增加,该表达式会逐渐降低为0。

欧氏距离相似度很容易直观得被理解,比之于皮尔逊相关系数,它可以得到任意两个用户之间的相似度。但基于欧氏距离的实现同样可能得到一些与直觉不符合的结果。

c. 余弦相似度

余弦相似性度量(cosine measure similarity)也将用户偏好值视为空间中的点,并基于此进行相似性度量。你需要将用户偏好值视为n为空间中的点。计算不同用户向量之间夹角的余弦值,并以此判定两用户的相似系数。

在Mahout中,余弦相似度是以PearsonCorrelationSimilarity来实现的。

d. 斯皮尔曼相似系数——基于相对排名定义相似度

斯皮尔曼线管稀疏其实是皮尔逊相关系数的变体。该相关系数并非基于原始的偏好值,而是基于偏好值的相对排名来计算的。

原创粉丝点击