当前位置: 首页 > news >正文

推荐系统中的相似度

文章目录

  • 前言
  • 余弦相似度:衡量向量方向的 “指南针”
  • 皮尔逊相关系数:修正均值的 “调节器”
  • 欧氏距离:衡量空间距离的 “尺子”
  • Jaccard 相似度:衡量集合重叠的 “度量仪”
  • 总结

前言

在信息爆炸的时代,推荐系统早已成为我们日常生活中不可或缺的一部分。无论是刷短视频时平台精准推送的感兴趣内容,还是网购时看到的 “猜你喜欢” 商品,背后都离不开推荐系统的功劳。而在推荐系统的核心技术中,相似度计算扮演着至关重要的角色,它就像一座隐形的桥梁,连接着用户与用户、用户与物品、物品与物品,帮助系统精准捕捉需求,实现个性化推荐。

来说,相似度是衡量两个对象(可以是用户、物品或特征)之间相似程度的指标。在推荐系统中,我们通过计算相似度来判断 “用户 A 是否和用户 B 有相似的喜好”、“物品 C 是否和物品 D 具有相似的属性”。基于这些判断,系统才能做出合理的推荐:比如给用户 A 推荐用户 B 喜欢的物品,或者给浏览过物品 C 的用户推荐物品 D。

不同的场景和数据类型需要搭配不同的相似度计算方法,选择合适的方法能让推荐效果事半功倍。接下来,我们就一起看看推荐系统中最常用的几种相似度计算方式。

余弦相似度:衡量向量方向的 “指南针”

余弦相似度是推荐系统中应用最广泛的相似度计算方法之一,它主要用于衡量两个向量在方向上的相似性。在推荐场景中,我们可以将用户或物品表示为向量,例如用户对物品的评分向量、物品的特征属性向量等。

对于两个向量aaabbb,它们的余弦相似度cos⁡θ\cos\thetacosθ等于两个向量的点积除以两个向量模长的乘积,即:

cos⁡θ=a⋅b∥a∥∥b∥=∑i=1naibi∑i=1nai2∑i=1nbi2\cos\theta=\frac{a\cdot b}{\|a\|\|b\|}=\frac{\sum_{i = 1}^{n}a_ib_i}{\sqrt{\sum_{i = 1}^{n}a_i^2}\sqrt{\sum_{i = 1}^{n}b_i^2}}cosθ=a∥∥bab=i=1nai2i=1nbi2i=1naibi

其中,aia_iaibib_ibi分别是向量aaabbb的第iii个分量,nnn是向量的维度。

余弦相似度的取值范围在[−1,1][-1,1][1,1]之间,值越接近 1,说明两个向量的方向越相似;值越接近 - 1,则说明方向越相反。

适用场景:当我们更关注两个对象的 “趋势” 而非 “绝对值” 时,余弦相似度是很好的选择。例如,在用户评分数据中,有些用户习惯给高分(比如都在 4-5 分之间),有些用户习惯给低分(比如都在 1-2 分之间),但他们对物品的相对喜好可能是相似的,这时余弦相似度就能有效捕捉这种相似性。

皮尔逊相关系数:修正均值的 “调节器”

注:对这个概念比较陌生,一下难以消化的朋友可以看一下文末参考【1】

皮尔逊相关系数广泛用于度量两个变量之间的相关程度,其值介于-1与1之间。下图展示了几组(x,y)(x,y)(x,y)的点集,以及各个点集中xxxyyy之间的相关系数。我们可以发现相关系数反映的是变量之间的线性关系和相关性的方向(第一排),而不是相关性的斜率(中间),也不是各种非线性关系(第三排)。请注意:中间的图中斜率为0,但相关系数是没有意义的,因为此时变量yyy是0。

皮尔逊相关系数举例

两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商:
ρx,y=cov⁡(x,y)σxσy=E[(x−μx)(y−μy)]σxσy\rho_{x,y} = \frac{\operatorname{cov}(x,y)}{\sigma_x \sigma_y} = \frac{E\left[(x - \mu_x)(y - \mu_y)\right]}{\sigma_x \sigma_y} ρx,y=σxσycov(x,y)=σxσyE[(xμx)(yμy)]上式定义了总体相关系数,常用希腊小写字母ρ\rhoρ作为代表符号。
估算样本的协方差和标准差,可得到皮尔逊相关系数,常用英文小写字母rrr代表:
r=∑i=1n(xi−xˉ)(yi−yˉ)∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2=1n−1∑i=1n(xi−xˉsx)(yi−yˉsy)r=\frac{\sum_{i = 1}^{n}(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_{i = 1}^{n}(x_i-\bar{x})^2}\sqrt{\sum_{i = 1}^{n}(y_i-\bar{y})^2}}= \frac{1}{n - 1} \sum_{i=1}^{n} \left( \frac{x_i - \bar{x}}{s_x} \right) \left( \frac{y_i - \bar{y}}{s_y} \right)r=i=1n(xixˉ)2i=1n(yiyˉ)2i=1n(xixˉ)(yiyˉ)=n11i=1n(sxxixˉ)(syyiyˉ)

注意第一个式子中分子和分母中的n−1n-1n1被约分掉了,sx=∑i=1n(xi−xˉ)2n−1s_x=\sqrt{\frac{\sum_{i = 1}^{n}(x_i-\bar{x})^2}{n-1}}sx=n1i=1n(xixˉ)2

其中,xˉ\bar{x}xˉyˉ\bar{y}yˉ分别是向量xxxyyy的均值,sxs_xsxxyx_yxy分别是向量xxxyyy的标准差,nnn是向量的维度。
皮尔逊相关系数的取值范围同样在[−1,1][-1,1][1,1]之间,1 表示完全正相关,-1 表示完全负相关,0 表示无线性相关。

适用场景:当数据中存在明显的均值差异时,皮尔逊相关系数的表现往往优于余弦相似度。例如,在电影评分系统中,用户 A 对所有电影的评分都比用户 B 高 1 分,但他们的喜好趋势一致,皮尔逊相关系数能准确识别这种相似性,而余弦相似度可能会受到评分绝对值的干扰。

欧氏距离:衡量空间距离的 “尺子”

欧氏距离是我们最熟悉的距离度量方式之一,它计算的是两个点在nnn维空间中的直线距离。

对于两个nnn维向量aaabbb,欧氏距离ddd的计算公式为:

d=∑i=1n(ai−bi)2d=\sqrt{\sum_{i = 1}^{n}(a_i - b_i)^2}d=i=1n(aibi)2

在相似度计算中,我们通常将欧氏距离转换为相似度,距离越小,相似度越大。 对应的相似度可以表示为
sim(a,b)=1/(1+d)sim(a,b)=1/(1 + d)sim(a,b)=1/(1+d)分母中+1+1+1的作用是让取值范围在(0,1](0,1](0,1]之间。

适用场景:欧氏距离适用于衡量两个对象在数值上的绝对差异。例如,在基于用户属性(如年龄、收入、消费频率等)的推荐中,欧氏距离可以有效判断用户之间的相似程度,年龄、收入等特征越接近的用户,可能具有更相似的消费需求。

但需要注意的是,欧氏距离对向量的量级比较敏感,在使用前通常需要对数据进行归一化处理,避免某一维度的数值过大影响整体结果。

Jaccard 相似度:衡量集合重叠的 “度量仪”

Jaccard 相似度主要用于衡量两个集合之间的相似性,它的计算方式是两个集合的交集大小除以并集大小。

对于两个集合AAABBB,Jaccard 相似度JJJ的计算公式为:
J=∣A∩B∣∣A∪B∣J=\frac{|A\cap B|}{|A\cup B|}J=ABAB

其中,∣A∩B∣|A\cap B|AB表示集合AAABBB的交集元素个数,∣A∪B∣|A\cup B|AB表示并集元素个数。

Jaccard 相似度的取值范围在[0,1][0,1][0,1]之间,值越接近 1,说明两个集合的重叠度越高,相似度越大。

适用场景:Jaccard 相似度在处理布尔型数据或集合数据时表现出色。例如,在用户的行为数据中(如浏览过的商品、收藏的文章等),我们可以将每个用户的行为看作一个集合,通过 Jaccard 相似度计算用户之间的相似性,交集越大的用户,兴趣可能越相近。

总结

相似度计算是推荐系统的核心基石,不同的相似度计算方法各有侧重和适用场景:余弦相似度擅长捕捉向量方向的相似性,皮尔逊相关系数能修正均值影响,欧氏距离适合衡量数值绝对差异,Jaccard 相似度则适用于集合重叠度计算。

在实际应用中,我们需要根据数据类型、业务场景以及推荐目标,选择合适的相似度计算方法,有时甚至需要结合多种方法进行综合判断。只有精准把握对象之间的相似性,推荐系统才能真正做到 “懂你所想,推你所爱”,为用户带来更优质的体验。

参考
【1】协方差和相关系数|说人话的统计学.讲人话的统计学.哔哩哔哩
【2】皮尔逊相关系数.百度百科
【3】相似度常用参数比较总结.老姚在路上.知乎

http://www.lryc.cn/news/582851.html

相关文章:

  • JAVAEE 代理
  • 短视频电商APP源码开发技术栈解析:音视频、商品链路与互动设计
  • 怪物机制分析(有限状态机、编辑器可视化、巡逻机制)
  • DCL学习
  • SpringAI学习笔记-MCP客户端简单示例
  • C#Halcon从零开发_Day18_OCR识别
  • SpringAI系列 - 基于Spring AI 1.0.0 的AI助手实现示例
  • 图像梯度处理与边缘检测:OpenCV 实战指南
  • Apache Atlas编译打包,可运行包下载地址
  • VM上创建虚拟机以及安装RHEL9操作系统并ssh远程连接
  • 7月8日星期二今日早报简报微语报早读
  • XSLT注入与安全修复方法
  • 人工智能与人工智障———仙盟创梦IDE
  • 【Note】《Kafka: The Definitive Guide》第11章:Stream Processing
  • 【Bluedroid】BLE 地址解析列表的初始化与清除机制(btm_ble_resolving_list_init)
  • MySQL 8.0 OCP 1Z0-908 题目解析(23)
  • Kafka消息倾斜
  • 编码器(Encoder)和解码器(Decoder)
  • Spring注解驱动开发
  • window wsl 环境下编译openharmony,HarmonyOS 三方库 FFmpeg
  • Flutter基础(前端教程④-组件拼接)
  • Ansible 介绍及安装
  • ffmpeg 中config 文件一些理解
  • OSPFv3和v2区别(续)
  • 客户频繁变更需求,如何保障项目进度稳定
  • Spring AI:ETL Pipeline
  • 深入解读MCP:构建低延迟、高吞吐量通信中间件
  • C语言基础(1)
  • STM32第十八天 ESP8266-01S和电脑实现串口通信
  • Flutter编译安卓应用时遇到的compileDebugJavaWithJavac和compileDebugKotlin版本不匹配的问题