常见的相似性度量方法
有如下几种计算相似性方法:
点积相似度
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} X⋅Y=∣X∣∣Y∣cosθ=i=1∑nxi∗yi
向量内积的结果是没有界限的,解决办法就是先归一化再相乘,就是下面的余弦相似度了。
余弦相似度
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}} X⋅Y=∑i=1n(xi)2∗∑i=1n(xi)2∑i=1nxi∗yi
余弦相似度衡量两个向量在方向上的相似性,并不关注两个向量的实际长度,即对绝对数据不敏感。
示例
用户对内容评分,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)=∑i∈I(RA,i−Riˉ)2∑i∈I(RB,i−Riˉ)2∑i∈I(RA,i−Riˉ)(RB,i−Riˉ)
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(xi−xˉ)2∑i(yi−yˉ)2∑i(xi−xˉ)(yi−yˉ)
如果把 x ′ = x − x ˉ , y ′ = y − y ˉ x'=x-\bar{x}, y'=y-\bar{y} x′=x−xˉ,y′=y−yˉ ,那么皮尔逊系数计算的就是 x ′ 和 y ′ x' 和 y' x′和y′ 的余弦相似度。
参考
- 点积相似度、余弦相似度、欧几里得相似度
- 常用的特征选择方法之 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∑nxi∗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.递归实现,输入一个数,输出这个数的每一位: #include<myhead.h>void print_digit(int num) {if(num<10){printf("%d",num);puts("");}else{print_digit(num/10); //递归打印除最后一位外的数printf("%…...
django实现部门表的增删改查界面
1、前期准备 部署好mysql数据库,创建好unicom数据库下载好bootstap的插件下载好jquery的插件下载好mysqlclient-1.4.6-cp36-cp36m-win_amd64.whl的安装包,根据python的版本下载 2、创建项目 在pycharm中创建项目 在pycharm的终端创建虚拟环境 py -m v…...
Tomcat的介绍和安装配置、eclipse中动态web项目的创建和运行、使用IDEA创建web项目并运行
一、Tomcat的介绍和安装配置 安装tomcat: 环境变量的配置: 配置之后重启cmd,执行startup命令,启动tomcat 在localhost:8080,能进入tomcat主界面,说明配置成功 二、eclipse中动态web项目的创建和运行 tomca…...
idea操作——已经push到远程的代码回滚(不保留本地更改)
1. git: 2. 找到相应分支--->找到要回滚的代码的位置----->右键,然后选择如图的选项: 3.下图的选项选择hard,然后选择reset 4.操作完成后等一会,待同步结束后push代码到远程,选择force push.…...
无涯教程-Lua - 垃圾回收
Lua使用自动内存管理,该管理使用基于Lua内置的某些算法的垃圾回收。 垃圾收集器暂停 垃圾收集器暂停用于控制垃圾收集器之前需要等待多长时间; Lua的自动内存管理再次调用它。值小于100意味着Lua将不等待下一个周期。同样,此值的较高值将导…...
DP(各种模型)
数字三角形模型 摘花生 Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就…...
开学在即,这个超好用的中小学新生录取查询系统制作方法值得借鉴
即将开学,中小学负责招生的老师面临着新学年的招生工作。这是一项紧迫且重要的任务,需要老师们迅速而有效地应对。在新生录取过程中,有几个关键任务需要尽快完成。 首先,老师们需要录入新生的成绩信息。这包括学生的考试成绩、综…...
使用Canvas裁剪图片
使用Canvas裁剪图片 概述 在Web开发中,我们经常需要对图片进行裁剪,以满足不同尺寸需求或者实现图片的局部展示。本篇博客将带您深入了解如何使用Canvas技术来实现图片的裁剪功能。我们将通过一个实例来演示如何利用Canvas绘制图片,并通过蒙…...
JavaScript |(三)内建对象 | 数组 | string对象 | 尚硅谷JavaScript基础实战
学习来源:尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 文章目录 📚数组🐇数组介绍⭐️数组(Array)⭐️基本操作⭐️数组的字面量 🐇数组中的常用方法⭐️push()⭐️pop()⭐️unshift()⭐️shif…...
势能线段树
目录 简单介绍 题目 1. 上帝造题的七分钟 2 2.SUM and REPLACE 3. And RMQ 总结 简单介绍 题目 1. 上帝造题的七分钟 2 链接:https://www.luogu.com.cn/problem/P4145 维护两种操作 1.区间开根号(下取整) 2.区间和询问 显然无法通过懒标记来计算区间开根号…...
【phaser微信抖音小游戏开发004】往画布上增加文本以及文本的操作
我们在states中创建st004.js的类,或者将states中的index.js直接重命名为st004.js,把里面的类名也修改为st004.如下图 在main.js中,引入st004,并设置启用的state为st004。如下图 接下来到states/st004里面,在create里面将文本修改一…...
【1.4】Java微服务:服务注册和调用(Eureka和Ribbon实现)
✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: 微服务 ✨特色专栏: 知识分享 &#x…...
QT中使用ffmpeg的api进行视频的播放
在了解ffmpeg使用api进行视频的播放之前,我们首先了解一下视频的播放流程。 一、视频的播放流程 首先是我们最常见的视频文件,在播放流程中首先是要打开视频文件,将视频文件中的数据进行解封装,之后再将解封装之后的视频进行解码…...
使用idea实现git操作大全(在项目开发中遇到的实际情况
使用idea实现git操作大全(在项目开发中遇到的实际情况) 1.安装git插件2.在开发中切记拉一个自己的分支 1.安装git插件 2.在开发中切记拉一个自己的分支 选中需要拉的分支,右键该分支,选中new breach from “分支”,点…...
SQL面试题:一个优化案例
问题描述 假如存在以下两个表: 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章:正则表达式
博主智算菩萨,专注于人工智能、Python编程、音视频处理及UI窗体程序设计等方向。致力于以通俗易懂的方式拆解前沿技术,从零基础入门到高阶实战,陪伴开发者共同成长。目前已开设五大技术专栏,累计发布多篇原创技术文章,…...
在 Xcode 中运行和调试单元测试:使用 Debug 和日志
单元测试是确保代码质量的重要手段,而运行和调试测试是开发者必备的技能。本文将介绍如何在 Xcode 中运行单元测试,并使用调试和日志工具来发现和解决问题。 运行单元测试 1. 设置测试目标 在 Xcode 中,为项目添加一个新的测试目标&#x…...
从梯度泄露到数据复原:DLG与iDLG算法实战解析
1. 梯度泄露风险:联邦学习的阿喀琉斯之踵 想象一下这样的场景:医院A有患者的CT影像数据,医院B有对应的诊断报告,两家机构想联合训练一个AI诊断模型,但谁也不愿意直接共享原始数据。这时候联邦学习(Federate…...
基于Node.js与TypeScript的快速项目生成工具potato-comp实战指南
1. 为什么你需要potato-comp? 每次启动新项目时,你是不是也受够了重复搭建基础框架?从配置TypeScript到安装ORM,从初始化路由到设置热更新,这些机械性工作至少会消耗半天时间。我去年统计过,在中小型项目中…...
超越AUC:DCA、NRI与IDI如何为临床预测模型提供更优的评估视角
1. 为什么AUC不够用?临床预测模型评估的痛点 我第一次做临床预测模型的时候,和大多数新手一样,盯着AUC值看了半天。0.75的AUC,看起来还不错?但当我拿着这个模型去找临床医生时,他们问的问题让我哑口无言&am…...
Arduino IDE安装避坑指南:从下载到中文设置一步到位
Arduino IDE安装实战手册:从零开始打造高效开发环境 第一次打开Arduino IDE时,那个简洁到近乎简陋的界面让我误以为安装过程会像它的UI一样简单。直到亲眼目睹同事因为驱动问题折腾了整个下午,才意识到这个看似友好的工具背后藏着不少"新…...
AI算法生成技术演进白皮书(SITS2026核心报告首次解禁):从符号主义到因果生成的范式跃迁
第一章:AI算法生成技术演进白皮书(SITS2026核心报告首次解禁):从符号主义到因果生成的范式跃迁 2026奇点智能技术大会(https://ml-summit.org) 人工智能生成技术正经历一场静默而深刻的范式革命——其驱动力已从显式规则与统计拟…...
保姆级教程:在ROS2 Humble上为TurtleBot4仿真环境手动编译Cartographer(含源码修改输出轨迹)
从零构建ROS2 Humble下的Cartographer:TurtleBot4仿真环境深度定制指南 在机器人领域,实时定位与地图构建(SLAM)一直是核心技术难题。对于使用TurtleBot4进行研究的开发者而言,官方提供的Cartographer二进制包往往无法满足特定需求࿰…...
DC综合实战:从约束设置到时序签核的完整指南
1. DC综合实战入门:从RTL到网表的关键路径 第一次接触DC综合时,我盯着满屏的时序报告完全懵了——就像拿到一张没有标注的地图。后来才发现,从RTL代码到合格网表的转化过程,其实是一场与时间赛跑的精密游戏。想象你是个交通调度员…...
FPGA开发实战:从Modelsim到Vivado的典型编译报错排查指南
1. FPGA开发中的编译报错:从入门到精通 刚接触FPGA开发的朋友们,相信你们一定被各种编译报错折磨过吧?我刚开始用Modelsim和Vivado的时候,经常被一堆莫名其妙的错误代码搞得一头雾水。今天我就来分享一些实战经验,帮你…...
