常见的相似度计算方式

news2025/1/19 3:02:39

1.欧氏距离(Euclidean Distance)

欧氏距离(也称欧几里得度量)指在 m m m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。 在二维和三维空间中的欧氏距离就是两点之间的实际距离。

在这里插入图片描述

计算公式:
d i s t ( A , B ) = ∑ i = 1 n ( A i − B i ) 2 dist(A,B)=\sqrt{\sum\limits^n\limits_{i=1}(A_i-B_i)^2} dist(A,B)=i=1n(AiBi)2
理解欧氏距离的比较通俗的一种方式,是通过二维向量的距离来进行理解。直观上的感觉,某个点到另一个点的直线距离

使用场景:

  • 在数据完整(无维度数据缺失)的情况下, 维度间的衡量单位是一致的, 否则需要标准化处理

随着数据维度的增加,欧几里得距离的作用就越小 。

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])
# x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False)
# x: 表示矩阵(也可以是一维),ord:范数类型
d = np.linalg.norm(vec1-vec2, ord=2)
# 或者
d = np.sqrt(np.sum(np.square(vec1-vec2)))

2.曼哈顿距离(Manhattan Distance)

在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。

在这里插入图片描述

计算公式
d i s t ( A , B ) = ∑ i = 1 n ∣ A i − B i ∣ dist(A,B)=\sum\limits^n\limits_{i=1}|A_i-B_i| dist(A,B)=i=1nAiBi
使用场景

  • 在数据完整(无维度数据缺失)的情况下, 需要将空间划分成网格, 然后以网格为单位来进行度量, 允许4个方向
import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])
 
d = np.linalg.norm(vec1-vec2, ord=1)
# 或者
d = np.sum(np.abs(vec1-vec2))

3.切比雪夫距离(Chebyshev Distance)

切比雪夫距离(Chebyshev distance)是向量空间中的一种度量,二个点之间的距离定义为其各坐标数值差的最大值 。 此距离中,加入了优化的成分,通过最值来定义距离。

在这里插入图片描述

计算公式
d i s t ( A , B ) = max ⁡ i ∣ A i − B i ∣ dist(A,B)=\max\limits_i|A_i-B_i| dist(A,B)=imaxAiBi

d i s t ( A , B ) = lim ⁡ p → ∞ ( ∑ i = 1 n ∣ A i − B i ∣ p ) 1 p dist(A,B)=\lim\limits_{p \to \infty}\left(\sum\limits^n\limits_{i=1}|A_i-B_i|^p\right)^{\frac{1}{p}} dist(A,B)=plim(i=1nAiBip)p1

使用场景

  • 需要将空间划分成网格, 然后以网格为单位来进行度量, 允许8个方向
import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

d = np.linalg.norm(vec1-vec2, ord=np.inf)
# 或者
d = np.abs(vec1-vec2).max()

4.闵可夫斯基距离(Minkowski Distance)

闵氏距离不是一种距离,而是一组距离的定义
在这里插入图片描述

计算公式
d i s t ( A , B ) = p ∑ i = 1 n ∣ A i − B i ∣ p dist(A,B)=p\sqrt{\sum\limits^n\limits_{i=1}|A_i-B_i|^p} dist(A,B)=pi=1nAiBip
使用场景

  • p = 1 p=1 p=1 时,就是曼哈顿距离
  • p = 2 p=2 p=2 时,就是欧氏距离
  • p → ∞ p→∞ p 时,就是切比雪夫距离

闵氏距离的缺点主要有两个:

(1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。

(2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

"""
ord=1: 一范数
ord=2: 二范数
ord=np.inf: 无穷范数
"""
d = np.linalg.norm(vec1-vec2, ord=arg)

5.汉明距离(Hamming Distance)

在信息论中,两个等长字符串之间的汉明距离(Hamming distance)是两个字符串对应位置的不同字符的个。

在这里插入图片描述
)]

计算公式
d i s t ( A , B ) = ∑ i = 0 n A [ i ] ⊕ B [ i ] dist(A,B)=\sum\limits^n\limits_{i=0}A[i]\oplus B[i] dist(A,B)=i=0nA[i]B[i]
使用场景

  • 信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)

当两个向量的长度不相等时,汉明距离很难使用。

import numpy as np

vec1 = np.array([1, 1, 0, 1, 0, 1, 0, 0, 1])
vec2 = np.array([0, 1, 1, 0, 0, 0, 1, 1, 1])

d = len(np.nonzero(vec1-vec2)[0])
# 或者
d = np.shape(np.nonzero(vec1-vec2)[0])[0]

6.余弦相似度(Cosine Similarity)

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度

计算公式
d i s t ( A , B ) = A ⋅ B ∣ A ∣ ∣ B ∣ dist(A,B)=\frac{A · B}{|A||B|} dist(A,B)=A∣∣BAB

d i s t ( A , B ) = ∑ i = 1 n A i B i ∑ i = 1 n A i 2 ∑ i = 1 n B i 2 dist(A,B)=\frac{\sum\limits^n\limits_{i=1}A_iB_i}{\sqrt{\sum\limits^n\limits_{i=1}A^2_i}\sqrt{\sum\limits^n\limits_{i=1}B^2_i}} dist(A,B)=i=1nAi2 i=1nBi2 i=1nAiBi

使用场景

  • 衡量两个向量方向的差异(不考虑大小) 以推荐系统为例,那么余弦相似性并没有考虑到不同用户之间的评分等级差异。
import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

d = np.dot(vec1,vec2)/(np.linalg.norm(vec1)*(np.linalg.norm(vec2)))

Q:余弦相似度有没有什么问题?

在推荐场景下,现有用户-物品评分矩阵,给用户推荐相似物品,没有考虑到不同用户对物品的平均打分的偏差情况。举个栗子:假如一个用户的品味很高,给每个推荐的物品打分均很低,则此用户很难与其他用户相似。

解决方法:引入偏置(皮尔逊相关系数)

7.皮尔森相关系数(Pearson Correlation Coefficient)

用于度量两个变量之间的相关程度
在这里插入图片描述

计算公式
P ( A , B ) = ∑ i = 1 n ( A i − A ‾ ) ( B i − B ‾ ) ∑ i = 1 n ( A i − A ‾ ) 2 ∑ i = 1 n ( B i − B ‾ ) 2 P(A,B)=\frac{\sum\limits^n\limits_{i=1}(A_i-\overline A)(B_i-\overline B)}{\sqrt{\sum\limits^n\limits_{i=1}(A_i-\overline A)^2}\sqrt{\sum\limits^n\limits_{i=1}(B_i-\overline B)^2}} P(A,B)=i=1n(AiA)2 i=1n(BiB)2 i=1n(AiA)(BiB)
使用场景

  • 反映两个变量是正相关还是负相关
import numpy as np

vec1 = np.array([1, 3, 4])
vec2 = np.array([4, 2, 4])

p = np.corrcoef(vec1, vec2)

P的取值在-1与1之间。取值为1时,表示两个随机变量之间呈完全正相关关系;取值为-1时,表示两个随机变量之间呈完全负相关关系;取值为0时,表示两个随机变量之间线性无关。

8.杰卡德相似系数(Jaccard Similarity Coefficient)

用于比较有限样本集之间的相似性与差异性,两个总结:数数

在这里插入图片描述

计算公式
J ( A , B ) = ∣ A ⋂ B ∣ ∣ A ⋃ B ∣ J(A,B)=\frac{|A\bigcap B|}{|A\bigcup B|} J(A,B)=ABAB
举个栗子: 假设样本 A A A 和样本 B B B 是两个 n n n 维向量,而且所有维度的取值都是 0 0 0 1 1 1。例如, A   ( 0 , 1 , 1 , 0 ) A\ (0,1,1,0) A (0,1,1,0) B   ( 1 , 0 , 1 , 1 ) B\ (1,0,1,1) B (1,0,1,1) 。我们将样本看成一个集合, 1 1 1表示集合包含该元素, 0 0 0表示集合不包含该元素。

p p p:样本 A A A B B B 都是 1 1 1 的维度的个数

q q q:样本 A A A 1 1 1 B B B 0 0 0 的维度的个数

r r r:样本 A A A 0 0 0 B B B 1 1 1 的维度的个数

s s s:样本 A A A B B B 都是 0 0 0 的维度的个数

那么样本A与B的杰卡德相似系数可以表示为:
J = p p + q + r J=\frac{p}{p+q+r} J=p+q+rp
此处分母之所以不加s的原因在于

对于杰卡德相似系数来说,它处理的都是非对称二元变量。非对称的意思是指状态的两个输出不是同等重要的,例如,疾病检查的阳性和阴性结果。

使用场景

  • 比较文本相似度,用于文本查重与去重;
  • 计算对象间距离,用于数据聚类或衡量两个集合的区分度等。
import numpy as np
import scipy.spatial.distance as dist

vec1 = np.array([1, 1, 0, 1, 0, 1, 0, 0, 1])
vec2 = np.array([0, 1, 1, 0, 0, 0, 1, 1, 1])

d = dist.pdist(np.array([vec1, vec2]), "jaccard")

Q:杰卡德相似度的缺点:

杰卡德相似度算法没有考虑向量中潜在数值的大小,而是简单的处理为0和1,会导致信息的损失。

本文仅作为学习记录所用,不用作商业用途,谢谢理解。

参考:https://segmentfault.com/a/1190000019307297

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

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

相关文章

DIN35电压电流转频率单位脉冲输出信号变换器集电极开路隔离变送器

主要特性 将直流电压或电流信号转换成单位脉冲信号。 精度等级:0.1 级、0.2 级。产品出厂前已检验校正,用户可以直接使用。 国际标准信号输入:0-5V/0-10V/1-5V 等电压信号,0-10mA/0-20mA/4-20mA 等电流信号。 输出标准信号:0-5KHz/0-…

MySQL 索引常见问题汇总,一次性梳理

hello,大家好,我是张张,「架构精进之路」公号作者。 提到MySQL查询分析,就会涉及到索引相关知识,要想学好MySQL,索引是重要且不得不啃下的一环,今天就把MySQL索引常见问题进行汇总,一…

vue.js实现带表情评论功能前后端实现 (滚动加载效果)

学习链接 vue.js实现带表情评论功能前后端实现(仿B站评论) 实现在vue项目中通过滚动条来滑动加载数据 IntersectionObserver与无限滚动加载 效果图 每次加载2条数据 思路 要实现滚动加载,就是当滚动条滚动到底部的时候,再去请…

零基础如何备考2023年系统集成项目管理工程师中级

系统集成项目管理工程师也是属于软考中级稍微好考一点的,管理类的知识多背多记多刷题。 中级集成是好考的,题目也不难,主要弄清楚47个过程的输入输出,还有工具的使用,几乎很多题都是按照这逻辑来的。 建议可以去网上…

ai写作软件免费-ai写作助手

ai写作 AI写作是一种利用人工智能技术和自然语言处理算法,从大量的数据中挖掘潜在信息、规律及信息流的写作方式。通过AI写作,可快速生成符合规范的文章、报告、文档、邮件等内容,为企业和个人提高效率、减少时间成本、实现更低的文字生产总成…

MySQL查询分组Group By原理分析

目录1. 使用group by的简单例子2. group by 原理分析2.1 explain 分析2.2 group by 的简单执行流程3. where 和 having的区别3.1 group by where 的执行流程3.2 group by having 的执行3.3 同时有where、group by 、having的执行顺序3.4 where having 区别总结4. 使用 group…

PR视频导出文件大

C 选择递刀工具 CtrlK 将视频分隔 pr导出的视频文件太大,通过这2个方法可以大大减小视频的大小,并且画质还能保持清晰! 方法一:修改PR导出视频设置 在导出格式中选择【H.264】,在下面预设的位置选择【匹配源-高比特率…

永久免费内网穿透不限制速度

市面上的免费内网穿透大都有格式各样的限制,什么限制流量啊,每个月要签到打卡啊,还有更改域名地址等,只有神卓互联内网穿透是永久免费没有限制的,白嫖也可以。 这篇文章分享了3个方案,按照性能和综合指标排…

金三银四没把握住,凉了...

大家好,前两天跟朋友感慨,今年的铜三铁四、裁员、疫情导致好多人都没拿到offer!现在互联网大厂终于迎来了应届生集中求职季。 对于想跳槽的软件测试人来说,绝对是个找工作的好时机。这时候,很多高薪技术岗、管理岗的缺口和市场需…

提高stackoverflow方法速度方法

最近有些代码问题需要访问Stack Overflow - Where Developers Learn, Share, & Build Careers 但是刷新太慢,心都碎了 Stack Overflow - Where Developers Learn, Share, & Build CareersStack Overflow is the largest, most trusted online community …

在C上++!(上)

目录 一、传说中的C: 二、C发展史 三、应用领域 四、C怎么学? 五、命名空间namespace 1、命名空间的作用 2、如何定义命名空间 3、嵌套定义命名空间及其访问 ​编辑 4、命名空间的合并 六、简单输入输出 七、缺省参数 1、全缺省参数 2、半/部…

【从零开始学Skynet】基础篇(五):简易聊天室

在游戏中各玩家之间都可以进行聊天之类的交互,在这一篇中,我们就来实现一个简易的聊天室功能,这在上一篇代码的基础上很容易就能实现。1、功能需求 客户端发送一条消息,经由服务端转发,所有在线客户端都能收到&#xf…

【Jetpack】ActivityResult介绍及原理分析

​​ 前言 本文先介绍ActivityResult的基本使用,最后会通过源码来探讨背后的原理。 在Android中,我们如果想在Activity之间双向传递数据,需要使用startActivityForResult启动,然后在onActivityResult中处理返回,另外…

Vulnhub项目:Breakout

靶机地址:Empire: Breakout ~ VulnHub 渗透过程: 查询kali ip:192.168.56.104,靶机ip:192.168.56.131 探测靶机开放端口,利用nmap 靶机开放了80、139、445、10000、20000端口,先对80端口进行访…

【DevOps】GitOps多环境管理 - 别用多分支!

前言 在上一篇文章中【DevOps】GitOps多环境管理(上) - 别用多分支!,我们介绍了在探索GitOps实践过程中会遇到的一些痛点,其中之一就是难以做到跨环境的版本发布,或者说怎么处理多个集群的部署。 在上一篇文章中,我们…

记一次内存泄漏排查

记一次内存泄漏排查 文章目录记一次内存泄漏排查背景问题排查问题处理背景 最近某项目的服务突然告警,cpu超85%,随后就是服务宕机。交付重启服务后恢复正常但是随后不久又开始告警,特别是白天,严重影响客户业务进行。 问题排查 …

【分享贴】如何衡量和提高项目成功?

“如何衡量项目成功?” 无论是对于项目经理还是组织来说都希望项目能够成功,但是怎样才算是项目成功了呢? 世界项目管理大师哈罗德科兹纳认为:“传统项目或运营项目成功的衡量标准是时间、成本和范围;创新项目成功的衡…

函数调用、

1、函数调用 重载了函数调用运算符&#xff08;&#xff09;的类 实例化的对象 就叫做函数对象 函数对象 &#xff08;&#xff09;触发 重载函数调用运算符 执行 》类似函数调用 &#xff08;仿函数&#xff09; #include <iostream> using namespace std; class Pr…

【hello Linux】Linux第一个小程序 - 进度条

目录 先来区分两个标识符&#xff1a;回车和换行 1. 倒计时 2. 进度条 Linux&#x1f337; 下面来编写Linux系统下的第一个小程序 - 进度条 先来区分两个标识符&#xff1a;回车和换行 \r 和 \n \r 回车 &#xff1a;代表回到本行的开头&#xff1b; \n 换行 &#xff1a;代表…

【Linux】vscode的使用 | 进程间通信(简单概括)

文章目录1.vscode的下载2. vscode的使用1. 连接远端2. 在vscode创建文件并运行程序切换到命令行3. 安装常见插件3. 进程间通信1. 简单举例2.管道原理为什么把读写都打开&#xff0c;只打开读或者写不可以吗&#xff1f;3. 通过父子进程理解管道1. 创建匿名管道系统调用为什么可…