协同过滤中的相似度

先不谈深奥难懂的机器学习,推荐系统核心问题是寻找相似的用户以及相似的物品,如何判断相似是这篇文章所要探讨的。

先用主观意识去思考一个问题,现实生活中我们是怎么判断某个人和自己很像。你会从他的日常行为、长相、穿着等方面去衡量。那怎么将这些主观的意识转换成计算机可理解的,我们可以把日常的行为、喜好当做不同的维度,比是否喜欢唱歌,是否爱看书这两个维度来衡量,那么我们就可以用向量的形式来表达(1,1)、(1,0)、(0,0)。那么问题就转化成怎么判断向量之间是相似的,转换成数学意义就是距离或者方向。距离越近越相似,方向越靠近约相似。

这样相似度的计算对象就是向量了,或者叫做高维空间下的坐标,然后表示向量数值的类型有两种,一个是实数值 一个是布尔值。下面根据不同的计算方式来理解二者的不同。

欧式距离

欧式距离是一个欧式空间下度量距离的的方法。两个物体在同一空间下表示为两个点,假如叫做 p 和 q,分别都是 n 个坐标(即就是 n 维)。

显然,欧式距离得到的值是一个非负数,最大值是正无穷。一般相似度的度量结果希望是[-1,1] 或者 [0,1] 之间的,所以这个公式无法在正常的场景中使用,需要做个转换。

上面这个公式把 0 到正无穷的欧式距离转换成 0 到 1 的相似度。

欧式距离度量的是空间两个点的绝对差异,适用于分析用户能力模型之间的差异,比如消费能力,贡献能力

余弦相似度

余弦相似度度量的是两个向量之间的夹角,也就是夹角的余弦值。当两个向量的夹角为 0 度时,余弦值为 1,当夹角为 90 度时,余弦值为0,夹角为 180度时,余弦值为 -1。取值的范围为[-1,1]。

余弦相似度的特点:它和向量的长度无关,两个向量,只要方向一致,无论程度强弱,都可以认为是相似的。在协同过滤中,余弦相似度某种程度上更加依赖两个物品的共同评价用户数,而不是用户给予的评分多少,这就是余弦相似度被向量长度归一化后的结果。比如这样的一个例子,用户A对两部电影的评分分别是 1 分和 2分,用户B对同样的两部电影评分分别是 4 分和 5 分,通过余弦相似度计算的出来的结果达到0.98。这和实际的直觉不符合,明明用户A不喜欢这两部电影。针对这个问题,余弦相似度有个改进,就是先计算向量每个维度的均值,然后每个向量在各个维度都减去均值后在计算余弦值。

余弦相似度在度量文本相似度、用户相似度、物品相似度的时候比较常用。

皮尔逊相关度

皮尔逊相关度本质上也是一种余弦相似度,不对是先对向量做了中心化,向量 p 和 q 各自减去向量的均值后,在计算余弦相似度。

这里需要注意的是和上面的余弦相似度优化算法不一样的是前者是对列向量中心化,后者是对行向量中心化。皮尔逊相关度度量的是两个随机变量是不是在同增同减。变化趋势是否一致,所以不是适合用作计算布尔值向量之间的相关度,因为两个布尔值向量也就是对应两个0-1分布的随机变量,这样的随机变量的变化只有0和1两个值,也就没有变化趋势这一说。

杰卡德(Jaccard)相似度

杰卡德相似度是两个集合的交接元素个数在并集中所占比例,非常实用与布尔值向量计算,比如用户之间的收藏行为。