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

向量点积衡量相似度_点积相似度、余弦相似度、欧几里得相似度

看starspace的时候发现它实现了dot和cos两种similarity的度量方式,这里总结一下:

余弦相似度衡量两个向量在方向上的相似性,而不care两个向量的实际长度,A和B的长度即使是一个超级短一个超级长的情况下,二者的余弦相似性也可能为1(即theta=0,此时两个向量重合);存在的问题[1]:

余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感。

比如用户对内容评分,5分制。A和B两个用户对两个商品的评分分别为A:(1,2)和B:(4,5)。我们分别用两种方法计算相似度。使用余弦相似度得出的结果是0.98,看起来两者极为相似,但从评分上看X似乎不喜欢这两个东西,而Y比较喜欢。造成这个现象的原因就在于,余弦相似度没法衡量每个维数值的差异,对数值的不敏感导致了结果的误差。

需要修正这种不合理性,就出现了调整余弦相似度,即所有维度上的数值都减去一个均值。

比如A和B对两部电影评分的均值分别是(1+4)/2=2.5,(2+5)/2=3.5。那么调整后为A和B的评分分别是:(-1.5,-1.5)和(1.5,2.5),再用余弦相似度计算,得到-0.98,相似度为负值,显然更加符合现实。

修正的余弦相似度可以说就是对余弦相似度进行归一化处理的算法,公式如下:

欧几里得相似度:

点积相似度:

点积相似度是一个比较有意思的概念,我们在word2vec和deepwalk等模型的构建过程中都有它的身影;以word2vec的常规的softmax的损失函数为例

我们希望点积之后的结果(即Uc*Vw)经过softmax之后能够和真实的分布情况一样(也就是能够尽量为[0,0,0,...1...,0,0,0],其中1是中心词对应的index),那么这样整个word2vec的训练的过程就跃然纸上了:

对于点积的公式:

可以看到,我们在优化点积的时候实际上是在优化a b的模长和二者的夹角(a和b分别是embedding空间的a向量和b向量),以word2vec为例,使用负采样的方式,a和b在同一个窗口内,其对应标签为1,则模型训练肯定是希望|a|*|b|*costheta 越接近1越好,那么在优化的过程中:

假设a和b的模长均为1且固定,则theta可能会越来越小(theta越小则costheta越接近于1,则整个a*b越接近于1),那么在embedding空间发生的事情就是,a和b向量越来越接近,这就和我们的目的达成一致,

当然这是理想的情况,一般来说|a|和|b|的模场也是会发生变化的,他们和cos theta共同决定最终的训练结果,所以一般来说,两个相近的词其最终的embedding向量比较不容易完全重合,而是相互之间相对于其它不相关的词更加靠近;

补充,一般我们进行点积相似性度量的时候,例如召回层用embedding点积进行相似度计算,会进行l2归一化处理,

归一化之后的embedding向量进行点积实际上就是计算夹角余弦值;

相关文章:

  • document.querySelector()与document.querySelectorAll()
  • html5静默打印_解答:如何实现在打印窗体内容是不弹出打印设置框从而实现静默打印的呢?...
  • Windows下vue-cli脚手架搭建入门一
  • cython 安装升级_20个小招数教你如果快速完成Python 性能优化升级
  • [NOI 2016]循环之美
  • finereport连接oracle_FineReport连接多维数据库示例及操作
  • linux 扩展挂载盘大小_Linux下使用fdisk扩展分区容量
  • JavaScript (function (){}()) 与(function(){})()
  • python assert 不退出_Pytest中断言的重要性,就不需要我重复了吧
  • IDEA中Lombok插件的安装与使用
  • python坦克大战_python资料领取:尚学堂201903期python全栈(0基础到就业)
  • 【leetcode】88. 合并两个有序数
  • aix么把占用的端口释放掉_UNIX系统如何释放被异常占用的端口 - 河北分行(秦永峰)...
  • redis 多维度排序_解决Redis Cluster模式下的排序问题
  • python基础学习01
  • Android Studio:GIT提交项目到远程仓库
  • Babel配置的不完全指南
  • docker容器内的网络抓包
  • Electron入门介绍
  • gf框架之分页模块(五) - 自定义分页
  • git 常用命令
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • java多线程
  • KMP算法及优化
  • redis学习笔记(三):列表、集合、有序集合
  • SpriteKit 技巧之添加背景图片
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 记录:CentOS7.2配置LNMP环境记录
  • 来,膜拜下android roadmap,强大的执行力
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 一个JAVA程序员成长之路分享
  • 用jquery写贪吃蛇
  • 追踪解析 FutureTask 源码
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​虚拟化系列介绍(十)
  • #stm32整理(一)flash读写
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计高校学生选课系统
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .dwp和.webpart的区别
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .Net IOC框架入门之一 Unity
  • .net wcf memory gates checking failed
  • .NET 的静态构造函数是否线程安全?答案是肯定的!