举例讲解协同过滤中相似度的计算方式

本文对比了几种协同过滤中相似度的计算方法,包括利用二维数组依次计算、采用HashMap查找计算以及仅使用UserHashMap实现等,并分析了各种方法的时间复杂度。

协同过滤中相似度的计算很有技巧性,下面对比几种计算的方式。

假设输入的Item-User矩阵为:

这里写图片描述

设用户共有M个,Item共有N个,在本例子中,M=3,N=4M=3,N=4。矩阵中为空的元素代表对应的用户对Item没有行为,也可以认为该用户对该Item的评分为0.

一、用二维数组依次计算

这种方式的实现步骤如下:

1、遍历User,依次取出U1,U2,U3U1,U2,U3。当取到U1U1的时候,计算所有item之间的相似度,此处以余弦方式度量相似度。因为相似度矩阵是一个对称矩阵,所以只计算上三角或者下三角即可。当计算U2U2的时候,需要累加U1U1的计算结果,U3U3同样要累加前面的计算结果,这样当user遍历完成之后,即可得到两个Item之间的内积,当然余弦相似度还要除以两个Item的模长的乘积。模长的计算可以在遍历User的时候同步计算。

计算内积的具体过程为:

这里写图片描述

2、用内积除以模长得到余弦相似度,这一步比较简单,不详细讨论。

现在来分析一下这种方法的时间复杂度。很明显要遍历User,上面已经假设User的数量为M,而对每一个User而言,要计算所有Item两两之间的相似度,因之需要计算相似度矩阵的上三角或下三角,所以其计算的次数为:

这里写图片描述
考虑所有的用户,还要在上面的基础上再乘以MM,所以最后的次数为:
这里写图片描述

二、采用HashMap查找计算

这种方法只计算User-Item矩阵中值不为空的元素,对稀疏的矩阵而言,没有冗余的计算。但是需要额外构造一个ItemHashMap,从遍历ItemHashMap开始。

在ItemHashMap中,Item为key,User为value。

1、遍历ItemHashMap,依次取出I1,I2,I3,I4I1,I2,I3,I4。取到I1I1的时候,先从ItemHashMap中查找看过该Item的User有哪些,在本例子中为U1,U3U1,U3。然后再分别计算这些User中每个User看过的Item之间的相似度,这一步很重要,是为了避免计算User-Item矩阵中为空的元素。

2、用户U1U1看过的Item有I1,I3I1,I3,用户U3U3看过的Item有I1,I2,I4I1,I2,I4。那么作如下计算:

这里写图片描述
3、同理,可以这样计算I2,I3,I4I2,I3,I4。因为是对称矩阵,只需要计算相似度矩阵上三角或者下三角即可。如下所示:

这里写图片描述

假设平均每个Item被P个用户看过,平均每个用户看过Q个Item,那么应当有:

这里写图片描述

分析上面的过程,不难发现,这种方式的计算次数为:

这里写图片描述

在实际的数据中,User-Item矩阵必然是稀疏,如果User-Item矩阵一点都不稀疏,也即没有不为空的元素,那么也就失去了推荐的意义,因为对于每一个用户而言,他把所有的Item都看过了,那还给他推荐什么呢?正常情况下,应该有P≪MP≪M,所以这种算法是有意义的。

上面两种方法计算的相似度矩阵是一致的,如下所示:

这里写图片描述

三、只使用UserHashMap实现

这种方式在实现第二种方式达到的效果之外,还可以节省空间。大概的思想是,遍历UserHashMap,每取到一个User之后,先获取该User所看过的Item,然后计算这些看过的Item两两之间的相似度,然后将结果保存在相似度矩阵中,后面的User生成的相似度直接累加上去即可,这样最终的结果也就生成了。

更多文章参考https://www.cnblogs.com/lengyue365/p/5279435.html

<think>好的,我现在需要帮助用户解答关于协同过滤算法计算相似度的公式,特别是余弦相似度和皮尔逊相关系数的问题。首先,我得回忆一下协同过滤的基本概念,以及常用的相似度计算方法。用户提到了余弦相似度和皮尔逊相关系数,所以我需要重点解释这两个公式,并指出它们的区别和联系。 首先,用户可能是在做推荐系统的相关项目或学习,需要了解如何计算用户或项目之间的相似度协同过滤主要分为基于用户的和基于物品的,而相似度计算是关键步骤。用户可能已经知道一些基本概念,但需要具体的公式和对比。 接下来,我需要确认余弦相似度的公式。余弦相似度衡量的是两个向量的夹角余弦值,范围在-1到1之间。公式应该是向量点积除以各自模长的乘积。不过要注意,在协同过滤中,通常处理的是用户评分数据,可能会有中心化处理,这时候余弦相似度就和皮尔逊相关系数有关联了。 然后是皮尔逊相关系数,它实际上是协方差除以标准差的乘积。根据引用[2]和[3],皮尔逊相似度是中心化后的余弦相似度。所以需要说明这一点,并且指出两者的计算差异。比如,皮尔逊会减去均值,而余弦是否减去均值取决于是否中心化。 用户的问题中还提到了引用内容,特别是引用[3]提到在数据中心化后,余弦相似度和皮尔逊相同,Mahout中的实现也是如此。所以需要强调数据中心化的重要性,以及这两个方法在不同情况下的应用。 另外,用户可能想知道在具体应用中如何选择这两种方法。例如,处理是否中心化的数据,或者数据是否存在偏差的情况。比如,如果用户的评分习惯不同,有的用户偏向高分,有的偏向低分,这时候皮尔逊可能更适合,因为它考虑了平均值的差异。 还需要注意语法问题,数学公式要正确使用LaTeX,行内公式用$...$,独立公式用$$...$$。例如,余弦相似度的公式应该写成: $$sim_{cos}(u,v) = \frac{\sum_{i \in I_{uv}} r_{ui} \cdot r_{vi}}{\sqrt{\sum_{i \in I_{uv}} r_{ui}^2} \cdot \sqrt{\sum_{i \in I_{uv}} r_{vi}^2}}}$$ 而皮尔逊的公式则是: $$sim_{pearson}(u,v) = \frac{\sum_{i \in I_{uv}} (r_{ui} - \bar{r}_u)(r_{vi} - \bar{r}_v)}{\sqrt{\sum_{i \in I_{uv}} (r_{ui} - \bar{r}_u)^2} \cdot \sqrt{\sum_{i \in I_{uv}} (r_{vi} - \bar{r}_v)^2}}}$$ 需要确保这些公式的LaTeX语法正确,并且独立公式单独成段。 此外,用户可能需要了解两者的适用场景,比如引用[2]提到皮尔逊不适合布尔值向量,而余弦可以处理这种情况。所以需要指出皮尔逊更适合连续数据,且考虑变量变化趋势,而余弦适用于向量方向的重要性,比如文本相似度。 最后,生成的相关问题需要围绕用户可能进一步关心的点,比如如何选择这两种方法,其他相似度度量方式,或者实际应用中的优化技巧等。例如: 1. 什么情况下选择余弦相似度而不是皮尔逊相关系数? 2. 协同过滤中除了余弦和皮尔逊还有哪些相似度计算方法? 3. 实际应用中如何处理数据稀疏性问题? 在回答过程中,要引用用户提供的引用内容,比如引用[2]和[3]中提到的皮尔逊和余弦的关系,以及中心化处理的部分,这样能增强答案的可信度。 检查是否有遗漏点,比如是否提到两者的取值范围,或者具体例子说明差异。例如,如果两个用户的评分趋势一致,但一个普遍评分高,另一个低,余弦相似度可能较高,而皮尔逊会调整均值后仍然显示高相似度,或者可能不同?需要确认这一点,可能举例说明。 总之,需要结构清晰地分点解释两个公式,对比它们的区别,并引用相关资料,最后生成相关问题帮助用户深入理解。</think>### 协同过滤算法中的相似度计算公式 在协同过滤算法中,**余弦相似度**和**皮尔逊相关系数**是最常用的两种相似度计算方法,以下是它们的公式及对比: --- #### 1. **余弦相似度 (Cosine Similarity)** 余弦相似度通过计算两个向量的夹角余弦值衡量相似性,适用于高维稀疏数据(如用户-物品评分矩阵)。 **公式**: $$sim_{cos}(u,v) = \frac{\sum_{i \in I_{uv}} r_{ui} \cdot r_{vi}}{\sqrt{\sum_{i \in I_{uv}} r_{ui}^2} \cdot \sqrt{\sum_{i \in I_{uv}} r_{vi}^2}}}$$ 其中: - $r_{ui}$ 和 $r_{vi}$ 分别表示用户 $u$ 和 $v$ 对物品 $i$ 的评分 - $I_{uv}$ 是用户 $u$ 和 $v$ 共同评分的物品集合 **特点**: - 忽略向量长度,仅关注方向差异 - 不适用于评分偏差较大的场景(如用户评分尺度不同)[^1] --- #### 2. **皮尔逊相关系数 (Pearson Correlation Coefficient)** 皮尔逊相关系数通过中心化修正评分偏差,衡量两个变量的线性相关性。 **公式**: $$sim_{pearson}(u,v) = \frac{\sum_{i \in I_{uv}} (r_{ui} - \bar{r}_u)(r_{vi} - \bar{r}_v)}{\sqrt{\sum_{i \in I_{uv}} (r_{ui} - \bar{r}_u)^2} \cdot \sqrt{\sum_{i \in I_{uv}} (r_{vi} - \bar{r}_v)^2}}}$$ 其中: - $\bar{r}_u$ 和 $\bar{r}_v$ 是用户 $u$ 和 $v$ 的评分均值 **特点**: - 对中心化后的数据计算余弦相似度,等价于皮尔逊系数[^3] - 范围在 $[-1,1]$,1表示完全正相关,-1表示完全负相关 - 适用于修正用户评分习惯差异(如严格评分者 vs 宽松评分者)[^2] --- #### 3. **关键区别** | 维度 | 余弦相似度 | 皮尔逊相关系数 | |-------------------|-----------------------------|-----------------------------| | **中心化处理** | 无 | 减去用户评分均值 | | **适用场景** | 向量方向重要性高(如文本) | 需消除评分偏差(如推荐系统) | | **数据敏感性** | 受向量长度影响 | 关注线性相关性 | --- #### 4. **应用示例** - **余弦相似度**:适合计算物品的文本描述相似性(如TF-IDF向量)[^1] - **皮尔逊系数**:在Netflix推荐中修正用户评分尺度差异 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值