模型评估:余弦距离的应用

其实在模型训练过程中,我们在不断地评估着样本间的距离,如何评估样本距离也是定义优化目标和训练方法的基础。

在机器学习问题中,通常将特征表示为向量的形式,所以在分析两个特征向量之间的相似性时,常使用余弦相似度来表示。余弦相似度的取值范围是[-1,1],相同的两个向量之间的相似度为1。如果希望得到类似于距离的表示,将1减去余弦相似度即为余弦距离。因此,余弦距离的取值范围为[0,2],相同的两个向量余弦距离为0.

1.为什么在一些场景中要使用余弦相似度而不是欧氏距离

对于两个向量A和B,其余弦相似度定义为\cos (A,B)=\frac{A\cdot B}{||A||_{2}||B||_2},即两个向量夹角的余弦,关注的是向量之间的角度关系,并不关心它们的绝对大小,其取值范围是[-1,1]。当一对文本相似度的长度差距很大,但内容十分相近时,如果使用词频或词向量作为特征,它们在特征空间中的欧氏距离通常很大;而如果使用余弦相似度的话,它们之间的夹角可能很小,因而相似度高。此外,在文本、图像、视频等领域,研究的对象的特征维度往往很高,余弦相似度在高维情况下依然保持“相同时为1,正交时为0,相反时为-1”的性质,而欧氏距离的数值则受维度的影响,范围不固定,并且含义也比较模糊。

在一些场景,例如Word2Vec中,其向量的模长是经过归一化的,此时欧氏距离与余弦距离有着单调的关系,即

||A-B||_2=\sqrt{2(1-\cos(A,B))}

其中||A-B||_2表示欧氏距离,\cos(A,B)表示余弦相似度,(1-\cos(A,B))表示余弦距离。在此场景下,如果选择距离最小(相似度最大)的近邻,那么使用余弦相似度和欧式距离的结果是相同的。

总体来说,欧氏距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异。例如,统计两部剧的用户观看行为,用户A的观看向量为(0,1),用户B为(1,0);此时二者的余弦距离很大,而欧氏距离很小;我们分析两个用户对于不同视频的偏好,更关注相对差异,显然应当使用余弦距离而当我们分析用户活跃度,以登录次数(单位:次)和平均观看时长(单位:分钟)作为特征时,余弦距离会认为(1,10)、(10,100)两个用户距离很近;但显然这两个用户活跃度是有着极大差异的,此时我们更关注数值绝对差异,应当使用欧氏距离

特定的度量方法适用于什么样的问题,需要在学习和研究中多总结和思考,这样在遇到新的问题时也可以活学活用。

2.余弦距离是否是一个严格定义的距离?

该题主要考察对距离的定义的理解,以及简单的反证和推导。首先看距离的定义:在一个集合中,如果每一对元素均可唯一确定一个实数,使得三条距离公理(正定型、对称性、三角不等式)成立,则该实数可称为这对元素之间的距离。

余弦距离满足正定型和对称性,但是不满足三角不等式,因此他并不是严格定义的距离。具体来说,对于向量A和B,三条距离公理的证明过程如下。

  • 正定性

根据余弦距离的定义,有

\text{dist}(A,B)=1-\cos(\theta)=\frac{||A||_2||B||_2-AB}{||A||_2||B||_2}

考虑到 ||A||_2||B||_2-AB\geq0,因此有\text{dist}(A,B)\geq0恒成立。特别地,有

\text{dist}(A,B)=0 \Leftrightarrow ||A||_2||B||_2=AB\Leftrightarrow A=B

  • 对称性

根据余弦距离的定义,有

 \text{dist}(A,B)=\frac{||A||_2||B||_2-AB}{||A||_2||B||_2}=\frac{||B||_2||A||_2-AB}{||B||_2||A||_2}=\text{dist}(B,A)

因此余弦距离满足对称性。

  • 三角不等式

该性质并不成立,下面给出一个反例。给定一个A=(1,0),B=(1,1),C=(0,1),则有

 \text{dist}(A,B)=1-\frac{\sqrt 2}{2}

\text{dist}(B,C)=1-\frac{\sqrt 2}{2}

\text{dist}(A,C)=1

因此有

 \text{dist}(A,B)+\text{dist}(B,C)=2-\sqrt 2<1=\text{dist}(A,C)

其实从问题1中,我们也能够得出:单位圆上欧氏距离和余弦距离满足

||A-B||=\sqrt{2\text{dist}(A,B)}

即有如下关系

 \text{dist}(A,B)=\frac{1}{2}||A-B||^2

显然在单位圆上,余弦距离和欧氏距离的范围都是[0,2]。我们已知欧氏距离是一个合法的距离,而余弦距离与欧氏距离有二次关系,自然不满足三角不等式。具体来说,可以假设A与B、B与C非常近,其欧氏距离为极小量u;此时A、B、C虽然在圆弧上,但近似在一条直线上,所以A与C的欧氏距离接近于2u。因此,A与B、B与C的余弦距离为u^2/2;A与C的余弦距离接近于2u^2,大于A与B、B与C的余弦距离之和。

在机器学习领域,被俗称为距离,却不满足三条距离公理的不仅仅有余弦距离,还有KL距离(Kullback-Leibler Divergence),也叫作相对熵,它用于计算两个分布之间的差异,但不满足对称性和三角不等式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/614057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Demo: 给图片添加自定义水印并下载

给图片添加自定义水印并下载 <template><div class"wrap"><div class"optea"><div class"file-upload"><p>选择图片</p><el-button type"text" style"color: #c00;"><label f…

微信小程序swiper实现层叠轮播图

在微信小程序中,需要实现展示5个&#xff0c;横向层叠的轮播图效果&#xff0c;轮播图由中间到2侧的依次缩小.如下图 使用原生小程序进行开发,没有使用Skyline模式&#xff0c;所以layout-type配置项也无效。所以基于swiper组件进行调整。 主要思路就是设置不同的样式&#xff…

sdbusplus:method同步调用通用函数

dbus的method操作的方式也比较类似,可以尝试封装成通用函数: //dbus_call.hpp #pragma once#include <utility> #include <boost/asio.hpp> #include <sdbusplus/asio/connection.hpp> #include <sdbusplus/bus.hpp> #include <sdbusplus/messag…

android启动流程

BootROM 这个固化在rom里 Bootloader 启动kernel前的准备工作&#xff0c;包括正常启动与recovery&#xff0c;烧写等不同做出判断 启动kernel会传些参数 重点是android启动流程 1. 驱动加载 比如usb, light, audio, camera, bt, wifi等 2. init 见system/core/init/init.c…

操作系统 进程相关

1 进程、线程、协程 定义 【Are u OKay&#xff1f;——协程、线程、进程】 https://www.bilibili.com/video/BV1Wr4y1A7DS/?share_sourcecopy_web&vd_source1e4d767755c593476743c8e4f64e18db 高并发&#xff1a;线程池&#xff0c;不要无休止的创建线程。--> task…

一起学习python类的属性装饰器@property

之前文章我们介绍了class的一些通用功能&#xff0c;比如类属性/类方法/实例属性/实例方法等&#xff0c;之前的属性可以直接修改和访问&#xff08;设置私有属性&#xff0c;不能直接访问,可通过对象名._[类名][属性名]的方式访问&#xff09;&#xff0c;没有一些权限的控制逻…

java--科星互联ID刷卡器TTS语音版,UDP协议实现语音播报

import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpVoiceSender { private static final String IP_ADDRESS "192.168.1.100"; // 刷卡器IP地址 private stati…

计算机速成课Crash Course - 18. 操作系统

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 17. 集成电路&摩尔定律 18. 操作系统 1940,1950 年代的电脑&#…

常用机床类型的用途和介绍

随着市场对机加工需求的提升&#xff0c;机械加工的技术精度也随之提高&#xff0c;机床的种类也就越来越多。 根据加工方法和使用的工具进行分类&#xff0c;国家将机床编制为11类&#xff1a;车床、钻床、镗床、磨床、齿轮加工机床、螺纹加工机床、铣床、刨床、拔床、锯床等…

pyspark 使用udf 进行预测,发现只起了一个计算节点

PySpark UDF 只使用一个计算节点的问题 原因分析 默认的并行度设置 PySpark在执行UDF&#xff08;用户定义函数&#xff09;时&#xff0c;默认可能不会利用所有可用的计算节点。这是因为UDF通常在单个节点上执行&#xff0c;并且如果没有正确设置分区&#xff0c;可能会导致数…

Windows下Python+PyCharm+miniconda+Cuda/GPU 安装步骤

1. 官网安装Python 3.9 Python Release Python 3.9.0 | Python.org 2. 安装pycharm https://download.jetbrains.com/python/pycharm-professional-2023.3.2.exe 3. 安装miniconda Miniconda — miniconda documentation 4. 安装完miniconda 创建虚拟环境 conda create …

Transformer学习(一)

文章目录 transformer介绍为什么处理长序列时会出现梯度消失和梯度爆炸的问题transformer为什么可以用在图像处理上&#xff1f; transformer介绍 Transformer 是一种在深度学习中广泛使用的模型结构&#xff0c;最初由 Vaswani 等人在 “Attention is All You Need” 一文中提…

Java 关于 Object 类中的 finalize() 和 hashCode() 方法

关于 Object 类中的 finalize() 方法。 1、在 Object 类中的源代码&#xff1a; protected void finalize() throws Throwable{} GC&#xff1a;负责调用 finalize() 方法。 2、finalize() 方法只有一个方法体&#xff0c;里面没有代码&#xff0c;而且这个方法是 protected 修…

2023-12-29 贪心算法 分发饼干和摆动序列以及最大子数组和

贪心算法 什么是贪心算法&#xff1f; 就是每一阶段的最优解&#xff0c;从局部的最优解达到全局的最优解&#xff01; 最好用的策略就是举反例&#xff0c;如果想不到反例&#xff0c;那么就试一试贪心吧。 贪心算法一般分为如下四步&#xff1a; 将问题分解为若干个子问…

【Python】win10 版Anaconda下载安装与认识 (2024版)

下载 Anaconda下载地址 还是蛮大的1GB: 安装 安装的话一般都是傻瓜式安装&#xff0c;选定好自己的安装目录就是下一步下一步就OK了&#xff0c;这里保存了一些安装过程中的记录&#xff1a; 安装成功&#xff1a; 安装过程时间还是有点长的&#xff0c;不知道是我电脑弱…

归并排序例题——逆序对的数量

做道简单一点的题巩固一下 归并排序实现步骤 将整个区间 [l, r] 划分为 [l, mid] 和 [mid1, r]。 递归排序 [l, mid] 和 [mid1, r]。 将左右两个有序序列合并为一个有序序列。 题目描述 给定一个长度为 n 的整数数列&#xff0c;请计算数列中的逆序对的数量。 逆序对的定义…

golang 生成一年的周数

// GetWeekTimeCycleForGBT74082005 获取星期周期 中华人民共和国国家标准 GB/T 7408-2005 // 参数 year 年份 GB/T 7408-2005 func GetWeekTimeCycleForGBT74082005(year int) (*[]TimeCycle, error) {var yearstart time.Time //当年最开始一天var yearend time.Time //当年…

系列三、Spring Security中自定义用户名/密码

一、Spring Security中自定义用户名/密码 1.1、自定义用户名/密码 1.1.1、配置文件中配置 spring.security.user.nameroot spring.security.user.password123456 1.1.2、定义基于内存的用户 /*** Author : 一叶浮萍归大海* Date: 2024/1/11 21:50* Description:*/ Configu…

Java 日期接收报错:could not be parsed, unparsed text found at index 10(已解决)

文章目录 问题背景代码解决方法问题背景 使用 Element-UI 的 el-date-picker 组件 将日期转给Java,Java报错 java.time.format.DateTimeParseException: Text ‘2024-01-03T16:00:00.000Z’ could not be parsed, unparsed text found at index 10 代码 Vue<el-date-picke…

关于SpringMVC前后端传值总结

一、传递方式 1、查询参数&路径参数 查询参数&#xff1a; URI:/teachers?typeweb GetMapping("/klasses/teachers") public List<Teacher> getKlassRelatedTeachers(String type ) { ... }如果查询参数type与方法的名称相同&#xff0c;则直接将web传入…