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

相似度度量方法

推荐系统中的相似度度量方法研究

引言

在推荐系统中,计算用户或物品之间的相似度是核心任务之一。通过相似度计算,我们可以找到相似的用户或物品,进而实现协同过滤推荐。本文将详细介绍三种常用的相似度计算方法:余弦相似度、均方差相似度和皮尔逊相关系数,并对其数学原理进行推导分析。

1. 余弦相似度 (Cosine Similarity)

1.1 数学原理

余弦相似度通过计算两个向量间的夹角余弦值来度量它们的相似性。两个向量的夹角越小,相似度越高。当两个向量方向完全一致时,余弦值为1;当两个向量方向完全相反时,余弦值为-1;当两个向量正交时,余弦值为0。

1.2 数学公式推导

假设有两个用户A和B,它们对物品的评分分别表示为向量 a⃗\vec{a}ab⃗\vec{b}b。余弦相似度计算公式为:

Cosine(A,B)=a⃗⋅b⃗∣∣a⃗∣∣⋅∣∣b⃗∣∣=∑i∈IABai×bi∑i∈IABai2×∑i∈IABbi2\text{Cosine}(A,B) = \frac{\vec{a} \cdot \vec{b}}{||\vec{a}|| \cdot ||\vec{b}||} = \frac{\sum_{i \in I_{AB}} a_i \times b_i}{\sqrt{\sum_{i \in I_{AB}} a_i^2} \times \sqrt{\sum_{i \in I_{AB}} b_i^2}}Cosine(A,B)=∣∣a∣∣∣∣b∣∣ab=iIABai2×iIABbi2iIABai×bi

1.3 代码实现

// Cosine 余弦相似度
func Cosine(a []float64, b []float64) float64 {m, n, l := .0, .0, .0for i := range a {m += a[i] * a[i]n += b[i] * b[i]l += a[i] * b[i]}return l / (math.Sqrt(m) * math.Sqrt(n))
}

其中,IABI_{AB}IAB 表示用户A和用户B共同评分过的物品集合,aia_iaibib_ibi 分别表示用户A和用户B对物品i的评分。

2. 均方差相似度 (Mean Squared Difference Similarity)

2.1 数学原理

均方差相似度基于用户评分的差异来衡量物品相似性。它计算两个用户对共同评分项目的评分差异,差异越小,相似度越高。

2.2 数学公式推导

MSD首先计算两个用户对共同评分物品的评分差的平方和的平均值(即均方误差MSE),然后将其转化为相似度:

MSE(A,B)=1∣IAB∣∑i∈IAB(ai−bi)2\text{MSE}(A,B) = \frac{1}{|I_{AB}|}\sum_{i \in I_{AB}}(a_i - b_i)^2MSE(A,B)=IAB1iIAB(aibi)2

MSD(A,B)=1MSE+1=11∣IAB∣∑i∈IAB(ai−bi)2+1\text{MSD}(A,B) = \frac{1}{\text{MSE} + 1} = \frac{1}{\frac{1}{|I_{AB}|}\sum_{i \in I_{AB}}(a_i - b_i)^2 + 1}MSD(A,B)=MSE+11=IAB1iIAB(aibi)2+11

2.3 代码实现

// MSD 均方差相似度
func MSD(a []float64, b []float64) float64 {count := .0sum := .0for i := range a {if !(math.IsNaN(a[i]) || math.IsNaN(b[i])) {sum += (a[i] - b[i]) * (a[i] - b[i])count++}}return 1.0 / (sum/count + 1.0)
}

其中,∣IAB∣|I_{AB}|IAB 表示A和B共同评分的物品数量。分母加1是为了避免除以零的情况,同时确保相似度在0到1之间。当两个用户的评分完全一致时,MSE为0,MSD为1;当评分差异无穷大时,MSD趋近于0。

3. 皮尔逊相关系数 (Pearson Correlation Coefficient)

3.1 数学原理

皮尔逊相关系数衡量两个变量间的线性相关程度。它通过去中心化处理,有效消除了用户评分尺度不一致的问题。相关系数范围为[-1, 1],1表示完全正相关,-1表示完全负相关,0表示无相关性。

3.2 数学公式推导

首先计算用户A和B的平均评分:

aˉ=1∣IA∣∑i∈IAai\bar{a} = \frac{1}{|I_A|}\sum_{i \in I_A}a_iaˉ=IA1iIAai
bˉ=1∣IB∣∑i∈IBbi\bar{b} = \frac{1}{|I_B|}\sum_{i \in I_B}b_ibˉ=IB1iIBbi

然后计算相关系数:

Pearson(A,B)=∑i∈IAB(ai−aˉ)(bi−bˉ)∑i∈IAB(ai−aˉ)2∑i∈IAB(bi−bˉ)2\text{Pearson}(A,B) = \frac{\sum_{i \in I_{AB}}(a_i-\bar{a})(b_i-\bar{b})}{\sqrt{\sum_{i \in I_{AB}}(a_i-\bar{a})^2}\sqrt{\sum_{i \in I_{AB}}(b_i-\bar{b})^2}}Pearson(A,B)=iIAB(aiaˉ)2iIAB(bibˉ)2iIAB(aiaˉ)(bibˉ)

3.3 代码实现

// Pearson 皮尔逊相似度
func Pearson(a []float64, b []float64) float64 {// A 平均值count, sum := .0, .0for i := range a {sum += a[i]count += 1}meanA := sum / count// B 平均值count, sum = .0, .0for i := range b {sum += b[i]count += 1}meanB := sum / count//// 去中心化的余弦相似度m, n, l := .0, .0, .0for i := range a {if !(math.IsNaN(a[i]) || math.IsNaN(b[i])) {ratingA := a[i] - meanAratingB := b[i] - meanBm += ratingA * ratingAn += ratingB * ratingBl += ratingA * ratingB}}return l / (math.Sqrt(m) * math.Sqrt(n))
}

实质上,皮尔逊相关系数是对中心化(减去平均值)后数据的余弦相似度。这种中心化处理使得它能够消除用户评分偏好的影响,更准确地反映用户兴趣的相似性。

4. 相似度方法比较与应用场景

4.1 余弦相似度

  • 优点:计算简单高效,几何意义明确
  • 缺点:不考虑用户评分习惯差异(如有些用户总是给高分)
  • 适用场景:评分尺度一致的场景,如二元评分(喜欢/不喜欢)或文本向量化后的相似度计算

4.2 均方差相似度

  • 优点:直观反映用户评分差异,计算结果容易理解
  • 缺点:不考虑用户评分模式,只关注绝对差异
  • 适用场景:需要精确度量评分差异的场合,对评分值差异敏感的应用

4.3 皮尔逊相关系数

  • 优点:考虑用户评分习惯,消除评分尺度差异,能够捕捉线性关系
  • 缺点:要求有足够多的共同评分物品才能得到可靠结果
  • 适用场景:用户评分习惯差异较大的场景,如有些用户偏好给高分,有些用户偏好给低分

5. 数学特性分析

5.1 对评分尺度的敏感性

考虑两个场景:

  1. 用户A评分:(5,4,3,2)
  2. 用户B评分:(5,4,3,2)
  3. 用户C评分:(3,3,3,3)
  4. 用户D评分:(1,2,3,4)

余弦相似度:A和B的相似度为1,A和C的相似度小于1,A和D的相似度可能为负。
皮尔逊相关系数:A和B的相似度为1,A和D的相似度为-1(完全负相关),而A和C的相似度无法定义(因为C的评分没有方差)。

5.2 几何解释

  • 余弦相似度:测量向量间的夹角
  • 均方差相似度:测量向量间的欧氏距离的变形
  • 皮尔逊相关系数:测量中心化后向量的夹角

6. 总结

相似度度量是推荐系统中的基础组件,不同的相似度计算方法适用于不同的场景。在实际应用中,应根据数据特点和业务需求选择合适的相似度度量方法,或将多种方法结合使用以获得更好的推荐效果。深入理解各种相似度度量方法的数学原理,有助于设计更加精准的推荐算法。

http://www.dtcms.com/a/288154.html

相关文章:

  • 车载刷写框架 --- 关于私有节点刷写失败未报引起的反思
  • 暑期算法训练.4
  • 用虚拟机体验纯血鸿蒙所有机型!
  • 【成品设计】基于STM32的水资源监控系列项目
  • 几个好用的MCP分享
  • 使用 PlanetScope 卫星图像绘制水质参数:以莫干湖为例
  • 创建第二大脑--第五章 组织:以行动为导向
  • 使用Python进行文件拷贝的方法
  • NLP中情感分析如何结合知识图谱在跨文化领域提升观念分析和价值判断的准确性?
  • Dockerfile格式
  • windows wsl ubuntu 如何安装 open-jdk8
  • [硬件电路-39]:激光光路的光信号处理、模拟电路的电信号处理、数字电路的电信号处理、软件的信号处理,有哪些共通的操作、运算、变换?
  • BabyAGI 是一个用于自构建自主代理的实验框架
  • Java脚本API参数传递机制详解
  • 让Logo/文字“自己画自己”!✨
  • 一套完整的反向海淘代购系统是一项复杂的系统工程,需要整合电商、物流、支付、清关、仓储、用户服务等多个环节
  • Codeforces Round 1037(Div.3)
  • C++ 比较器(Comparator)超详细笔记
  • 轻松学习C++:基本语法解析
  • JAVA高级第六章 输入和输出处理(一)
  • Git仓库使用
  • MacOS:如何利用终端来操作用户
  • 品鉴笔记:智利美人鱼磨坊甜红与甜白的风味对比
  • Java 大视界 -- 基于 Java 的大数据实时流处理在智能制造生产过程质量实时监控与异常诊断中的应用(352)
  • Linux 密码生成利器:pwgen 命令详解
  • Nestjs框架: 理解 RxJS响应式编程的核心概念与实践
  • C++中的虚继承
  • 思维链(CoT)技术全景:原理、实现与前沿应用深度解析
  • Edge浏览器设置网页自动翻译
  • 从随机数值到特征检测器的学习与更新