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

常见的相似性度量方法

有如下几种计算相似性方法:

点积相似度

X ⋅ Y = ∣ X ∣ ∣ Y ∣ c o s θ = ∑ i = 1 n x i ∗ y i \begin{aligned} X \cdot Y &= |X||Y|cos\theta \\ &= \sum_{i=1}^n x_i * y_i \end{aligned} XY=X∣∣Ycosθ=i=1nxiyi

向量内积的结果是没有界限的,解决办法就是先归一化再相乘,就是下面的余弦相似度了。

余弦相似度

X ⋅ Y = ∑ i = 1 n x i ∗ y i ∑ i = 1 n ( x i ) 2 ∗ ∑ i = 1 n ( x i ) 2 X \cdot Y = \frac{\sum_{i=1}^n x_i * y_i}{\sqrt{\sum_{i=1}^n (x_i)^2} * {\sum_{i=1}^n (x_i)^2}} XY=i=1n(xi)2 i=1n(xi)2i=1nxiyi

余弦相似度衡量两个向量在方向上的相似性,并不关注两个向量的实际长度,即对绝对数据不敏感。

示例

用户对内容评分,5分制。A和B两个用户对两个商品的评分分别为A:(1,2)和B:(4,5)。使用余弦相似度得出的结果是0.98,看起来两者极为相似,但从评分上看A不喜欢这两个东西,而B比较喜欢。造成这个现象的原因就在于,余弦相似度没法衡量每个维数值的差异,对数值的不敏感导致了结果的误差。
需要修正这种不合理性,就出现了调整余弦相似度,即所有维度上的数值都减去一个均值。
比如A和B对两部电影评分的均值分别是(1+4)/2=2.5,(2+5)/2=3.5。那么调整后为A和B的评分分别是:(-1.5,-1.5)和(1.5,2.5),再用余弦相似度计算,得到-0.98,相似度为负值,显然更加符合现实。

注:为什么是在所有用户对同一物品的打分上求均值,每个人打分标准不一,对所有用户求均值,等于是所有用户的打分映射到了同一空间内。上述是在计算两个用户的相似度,以此类推计算两个物品的相似度,就要计算所有物品的均值了。

修正的余弦相似度可以说就是对余弦相似度进行归一化处理的算法,公式如下:
s ( A , B ) = ∑ i ∈ I ( R A , i − R i ˉ ) ( R B , i − R i ˉ ) ∑ i ∈ I ( R A , i − R i ˉ ) 2 ∑ i ∈ I ( R B , i − R i ˉ ) 2 s(A, B)=\frac{\sum_{i \in I}\left(R_{A, i}-\bar{R_i}\right)\left(R_{B, i}-\bar{R_i}\right)}{\sqrt{\sum_{i \in I}\left(R_{A, i}-\bar{R_i}\right)^2} \sqrt{\sum_{i \in I}\left(R_{B, i}-\bar{R_i}\right)^2}} s(A,B)=iI(RA,iRiˉ)2 iI(RB,iRiˉ)2 iI(RA,iRiˉ)(RB,iRiˉ)
R A , i R_{A,i} RA,i 表示用户A在商品i上的打分, R i ˉ \bar{R_i} Riˉ表示商品i在所有用户上的打分均值。

皮尔逊相关系数

Pearson 相关系数是用来检测两个连续型变量之间线性相关的程度,它解决了余弦相似度会收到向量平移影响的问题。取值范围为 [−1,1],正值表示正相关,负值表示负相关,绝对值越大表示线性相关程度越高:
ρ x , y = cov ⁡ ( x , y ) σ x σ y = E [ ( x − μ x , y − μ y ) ] σ x σ y = ∑ i ( x i − x ˉ ) ( y i − y ˉ ) ∑ i ( x i − x ˉ ) 2 ∑ i ( y i − y ˉ ) 2 \begin{aligned} \rho_{\boldsymbol{x}, \boldsymbol{y}} &= \frac{\operatorname{cov}(\boldsymbol{x}, \boldsymbol{y})}{\sigma_{\boldsymbol{x}} \sigma_{\boldsymbol{y}}} \\ &= \frac{E\left[\left(\boldsymbol{x}-\mu_{\boldsymbol{x}}, \boldsymbol{y}-\mu_{\boldsymbol{y}}\right)\right]}{\sigma_{\boldsymbol{x}} \sigma_{\boldsymbol{y}}} \\ &= \frac{\sum_i\left(x_i-\bar{x}\right)\left(y_i-\bar{y}\right)}{\sqrt{\sum_i\left(x_i-\bar{x}\right)^2} \sqrt{\sum_i\left(y_i-\bar{y}\right)^2}} \end{aligned} ρx,y=σxσycov(x,y)=σxσyE[(xμx,yμy)]=i(xixˉ)2 i(yiyˉ)2 i(xixˉ)(yiyˉ)
如果把 x ′ = x − x ˉ , y ′ = y − y ˉ x'=x-\bar{x}, y'=y-\bar{y} x=xxˉ,y=yyˉ ,那么皮尔逊系数计算的就是 x ′ 和 y ′ x' 和 y' xy 的余弦相似度。


参考

  • 点积相似度、余弦相似度、欧几里得相似度
  • 常用的特征选择方法之 Pearson 相关系数
  • 图片向量相似检索服务(2)——四种基本距离计算原理
    • 这篇博客倒是很简洁,适合速读
  • 点积相似度、余弦相似度、欧几里得相似度
  • 相似性和距离度量 (Similarity & Distance Measurement)

相关文章:

常见的相似性度量方法

有如下几种计算相似性方法: 点积相似度 X ⋅ Y ∣ X ∣ ∣ Y ∣ c o s θ ∑ i 1 n x i ∗ y i \begin{aligned} X \cdot Y & |X||Y|cos\theta \\ & \sum_{i1}^n x_i * y_i \end{aligned} X⋅Y​∣X∣∣Y∣cosθi1∑n​xi​∗yi​​ 向量内积的结果是没…...

Day06-JS高级编程

Day01-JS高级编程 一 变量和常量 1 概念 在程序中,变量是值可以改变的量,常量是值不可以改变的量 在ES6以前变量的创建使用var关键字 (可以创建多个同名变量) 从ES6开始变量的创建推荐使用let关键字 (不可以创建多个同名变量) 从ES6开始常量的创建使用const关键 (不可以创建…...

针对高可靠性和高性能优化的1200V硅碳化物沟道MOSFET

目录 标题:1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance摘要信息解释研究了什么文章创新点文章的研究方法文章的结论 标题:1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance 摘要 本文详…...

开发框架软件公司:与之携手,共同开启办公流程化之路!

在快节奏的社会里,如何提高企业的办公效率?如何让各部门之间的协作关系更为顺畅?如何把企业内部的数据真正利用起来,成为高层做出经营决策的重要依据?其实,要做到这些,与开发框架软件公司联手合…...

openCV C++环境配置

文章目录 一、openCV 安装二、新建项目三、配置环境变量四、测试使用 编译器:vs2017 OpenCV:4.5.4 一、openCV 安装 将openCV安装到一个路径下,我安装到了D盘根目录下 二、新建项目 在vs2017新建控制台空项目,打开项目属性 在VC目录 -> 包含目录下…...

8.3 作业 c高级

1.递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位&#xff1a; #include<myhead.h>void print_digit(int num) {if(num<10){printf("%d",num);puts("");}else{print_digit(num/10); //递归打印除最后一位外的数printf("%…...

django实现部门表的增删改查界面

1、前期准备 部署好mysql数据库&#xff0c;创建好unicom数据库下载好bootstap的插件下载好jquery的插件下载好mysqlclient-1.4.6-cp36-cp36m-win_amd64.whl的安装包&#xff0c;根据python的版本下载 2、创建项目 在pycharm中创建项目 在pycharm的终端创建虚拟环境 py -m v…...

Tomcat的介绍和安装配置、eclipse中动态web项目的创建和运行、使用IDEA创建web项目并运行

一、Tomcat的介绍和安装配置 安装tomcat&#xff1a; 环境变量的配置&#xff1a; 配置之后重启cmd&#xff0c;执行startup命令&#xff0c;启动tomcat 在localhost:8080&#xff0c;能进入tomcat主界面&#xff0c;说明配置成功 二、eclipse中动态web项目的创建和运行 tomca…...

idea操作——已经push到远程的代码回滚(不保留本地更改)

1. git&#xff1a; 2. 找到相应分支--->找到要回滚的代码的位置----->右键&#xff0c;然后选择如图的选项&#xff1a; 3.下图的选项选择hard&#xff0c;然后选择reset 4.操作完成后等一会&#xff0c;待同步结束后push代码到远程&#xff0c;选择force push.&#xf…...

无涯教程-Lua - 垃圾回收

Lua使用自动内存管理&#xff0c;该管理使用基于Lua内置的某些算法的垃圾回收。 垃圾收集器暂停 垃圾收集器暂停用于控制垃圾收集器之前需要等待多长时间&#xff1b; Lua的自动内存管理再次调用它。值小于100意味着Lua将不等待下一个周期。同样&#xff0c;此值的较高值将导…...

DP(各种模型)

数字三角形模型 摘花生 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。 地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花生&#xff0c;经过一株花生苗就…...

开学在即,这个超好用的中小学新生录取查询系统制作方法值得借鉴

即将开学&#xff0c;中小学负责招生的老师面临着新学年的招生工作。这是一项紧迫且重要的任务&#xff0c;需要老师们迅速而有效地应对。在新生录取过程中&#xff0c;有几个关键任务需要尽快完成。 首先&#xff0c;老师们需要录入新生的成绩信息。这包括学生的考试成绩、综…...

使用Canvas裁剪图片

使用Canvas裁剪图片 概述 在Web开发中&#xff0c;我们经常需要对图片进行裁剪&#xff0c;以满足不同尺寸需求或者实现图片的局部展示。本篇博客将带您深入了解如何使用Canvas技术来实现图片的裁剪功能。我们将通过一个实例来演示如何利用Canvas绘制图片&#xff0c;并通过蒙…...

JavaScript |(三)内建对象 | 数组 | string对象 | 尚硅谷JavaScript基础实战

学习来源&#xff1a;尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 文章目录 &#x1f4da;数组&#x1f407;数组介绍⭐️数组&#xff08;Array&#xff09;⭐️基本操作⭐️数组的字面量 &#x1f407;数组中的常用方法⭐️push()⭐️pop()⭐️unshift()⭐️shif…...

势能线段树

目录 简单介绍 题目 1. 上帝造题的七分钟 2 2.SUM and REPLACE 3. And RMQ 总结 简单介绍 题目 1. 上帝造题的七分钟 2 链接&#xff1a;https://www.luogu.com.cn/problem/P4145 维护两种操作 1.区间开根号(下取整) 2.区间和询问 显然无法通过懒标记来计算区间开根号…...

【phaser微信抖音小游戏开发004】往画布上增加文本以及文本的操作

我们在states中创建st004.js的类&#xff0c;或者将states中的index.js直接重命名为st004.js&#xff0c;把里面的类名也修改为st004.如下图 在main.js中&#xff0c;引入st004,并设置启用的state为st004。如下图 接下来到states/st004里面&#xff0c;在create里面将文本修改一…...

【1.4】Java微服务:服务注册和调用(Eureka和Ribbon实现)

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 微服务 ✨特色专栏&#xff1a; 知识分享 &#x…...

QT中使用ffmpeg的api进行视频的播放

在了解ffmpeg使用api进行视频的播放之前&#xff0c;我们首先了解一下视频的播放流程。 一、视频的播放流程 首先是我们最常见的视频文件&#xff0c;在播放流程中首先是要打开视频文件&#xff0c;将视频文件中的数据进行解封装&#xff0c;之后再将解封装之后的视频进行解码…...

使用idea实现git操作大全(在项目开发中遇到的实际情况

使用idea实现git操作大全&#xff08;在项目开发中遇到的实际情况&#xff09; 1.安装git插件2.在开发中切记拉一个自己的分支 1.安装git插件 2.在开发中切记拉一个自己的分支 选中需要拉的分支&#xff0c;右键该分支&#xff0c;选中new breach from “分支”&#xff0c;点…...

SQL面试题:一个优化案例

问题描述 假如存在以下两个表&#xff1a; CREATE TABLE customer ( C_CUSTKEY int NOT NULL, C_NAME varchar(25) NOT NULL, C_ADDRESS varchar(40) NOT NULL, C_NATIONKEY int NOT NULL, C_PHONE char(15) NOT NULL, C_ACCTBAL decimal(15,2) NOT NULL, C_MKTSEGMENT char(…...

【Python基础20讲】第17章:正则表达式

博主智算菩萨&#xff0c;专注于人工智能、Python编程、音视频处理及UI窗体程序设计等方向。致力于以通俗易懂的方式拆解前沿技术&#xff0c;从零基础入门到高阶实战&#xff0c;陪伴开发者共同成长。目前已开设五大技术专栏&#xff0c;累计发布多篇原创技术文章&#xff0c;…...

在 Xcode 中运行和调试单元测试:使用 Debug 和日志

单元测试是确保代码质量的重要手段&#xff0c;而运行和调试测试是开发者必备的技能。本文将介绍如何在 Xcode 中运行单元测试&#xff0c;并使用调试和日志工具来发现和解决问题。 运行单元测试 1. 设置测试目标 在 Xcode 中&#xff0c;为项目添加一个新的测试目标&#x…...

从梯度泄露到数据复原:DLG与iDLG算法实战解析

1. 梯度泄露风险&#xff1a;联邦学习的阿喀琉斯之踵 想象一下这样的场景&#xff1a;医院A有患者的CT影像数据&#xff0c;医院B有对应的诊断报告&#xff0c;两家机构想联合训练一个AI诊断模型&#xff0c;但谁也不愿意直接共享原始数据。这时候联邦学习&#xff08;Federate…...

基于Node.js与TypeScript的快速项目生成工具potato-comp实战指南

1. 为什么你需要potato-comp&#xff1f; 每次启动新项目时&#xff0c;你是不是也受够了重复搭建基础框架&#xff1f;从配置TypeScript到安装ORM&#xff0c;从初始化路由到设置热更新&#xff0c;这些机械性工作至少会消耗半天时间。我去年统计过&#xff0c;在中小型项目中…...

超越AUC:DCA、NRI与IDI如何为临床预测模型提供更优的评估视角

1. 为什么AUC不够用&#xff1f;临床预测模型评估的痛点 我第一次做临床预测模型的时候&#xff0c;和大多数新手一样&#xff0c;盯着AUC值看了半天。0.75的AUC&#xff0c;看起来还不错&#xff1f;但当我拿着这个模型去找临床医生时&#xff0c;他们问的问题让我哑口无言&am…...

Arduino IDE安装避坑指南:从下载到中文设置一步到位

Arduino IDE安装实战手册&#xff1a;从零开始打造高效开发环境 第一次打开Arduino IDE时&#xff0c;那个简洁到近乎简陋的界面让我误以为安装过程会像它的UI一样简单。直到亲眼目睹同事因为驱动问题折腾了整个下午&#xff0c;才意识到这个看似友好的工具背后藏着不少"新…...

AI算法生成技术演进白皮书(SITS2026核心报告首次解禁):从符号主义到因果生成的范式跃迁

第一章&#xff1a;AI算法生成技术演进白皮书&#xff08;SITS2026核心报告首次解禁&#xff09;&#xff1a;从符号主义到因果生成的范式跃迁 2026奇点智能技术大会(https://ml-summit.org) 人工智能生成技术正经历一场静默而深刻的范式革命——其驱动力已从显式规则与统计拟…...

保姆级教程:在ROS2 Humble上为TurtleBot4仿真环境手动编译Cartographer(含源码修改输出轨迹)

从零构建ROS2 Humble下的Cartographer&#xff1a;TurtleBot4仿真环境深度定制指南 在机器人领域&#xff0c;实时定位与地图构建(SLAM)一直是核心技术难题。对于使用TurtleBot4进行研究的开发者而言&#xff0c;官方提供的Cartographer二进制包往往无法满足特定需求&#xff0…...

DC综合实战:从约束设置到时序签核的完整指南

1. DC综合实战入门&#xff1a;从RTL到网表的关键路径 第一次接触DC综合时&#xff0c;我盯着满屏的时序报告完全懵了——就像拿到一张没有标注的地图。后来才发现&#xff0c;从RTL代码到合格网表的转化过程&#xff0c;其实是一场与时间赛跑的精密游戏。想象你是个交通调度员…...

FPGA开发实战:从Modelsim到Vivado的典型编译报错排查指南

1. FPGA开发中的编译报错&#xff1a;从入门到精通 刚接触FPGA开发的朋友们&#xff0c;相信你们一定被各种编译报错折磨过吧&#xff1f;我刚开始用Modelsim和Vivado的时候&#xff0c;经常被一堆莫名其妙的错误代码搞得一头雾水。今天我就来分享一些实战经验&#xff0c;帮你…...