各种距离相似度量及计算

各类算法中,距离是一个经常使用的量,经常会与各种相似性计算联系在一起。下面我们来总结一下各种距离与相似的计算。

1.欧式距离

欧式距离是我们最常用的距离度量之一,指在空间中两个点的真实距离长度,或者向量自身长度。
对于欧式距离,无须太多解释,直接看代码就可以。

import math
import numpy as np
from scipy.spatial.distance import pdistdef euclidean_distance():x = np.array([1, 2, 3, 4])y = np.array([5, 6, 7, 8])distance = np.sqrt(sum(math.pow(a - b, 2) for a, b in zip(x, y)))print(f'distance is: {distance}')distance = np.sqrt(sum(np.square(x - y)))print(f'distance is: {distance}')xy = np.vstack([x, y])distance = pdist(xy)print(f'distance is: {distance[0]}')

输出结果为:

distance is: 8.0
distance is: 8.0
distance is: 8.0

2.标准化欧式距离

常规版的欧式距离没有考虑到向量各个维度的差异。如果向量各个维度的差异很大,会导致距离计算时候数值较大的分量占主导。比如两个向量a、b,a=(1,10), b=(2, 20),如果使用标准的欧式距离计算方式,第二维分量是第一维的十倍,此时整个距离计算第二维分量就占主要作用,第一维的影响很小。

为了解决上述问题,我们可以对每一维分量进行标准化处理。假设某一维分量为x, 均值为 μ \mu μ,标准差为s,则标准化公式为
x ∗ = x − μ s x^* = \frac{x - \mu}{s} x=sxμ

有两个n维向量a, b, a = ( x 1 , x 2 , ⋯ , x n ) , b = ( y 1 , y 2 , ⋯ , y n ) a = (x_1,x_2,\cdots,x_n), b = (y_1,y_2,\cdots,y_n) a=(x1,x2,,xn),b=(y1,y2,,yn), 则ab的标准化欧式距离为
d ( a , b ) = ∑ k = 1 n ( x k − y k s k ) 2 d(a, b) =\sqrt { \sum_{k=1}^n \left(\frac{x_k - y_k}{s_k}\right)^2 } d(a,b)=k=1n(skxkyk)2

def standard_euclidean_distance():x = np.array([1, 2, 3, 4])y = np.array([5, 6, 7, 8])xy = np.vstack([x, y])sk = np.var(xy, axis=0, ddof=1)print(f'sk is: {sk}')distance = np.sqrt(((x - y) ** 2 / sk).sum())print(f'distance is: {distance}')distance = pdist(xy, 'seuclidean')print(f'distance is: {distance[0]}')

代码输出为:

sk is: [8. 8. 8. 8.]
distance is: 2.8284271247461903
distance is: 2.8284271247461903

3.曼哈顿距离

出租车几何或曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。
在直角坐标系中,假设有两点 a = ( x 1 , y 1 ) a=(x_1, y_1) a=(x1,y1), b = ( x 2 , y 2 ) b = (x_2, y_2) b=(x2,y2),则两点的曼哈顿距离为
d ( a , b ) = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ d(a, b) = |x_1 - x_2| + |y_1 - y_2| d(a,b)=x1x2+y1y2

代码实现如下

def manhattan_distance():x = np.array([1, 2, 3, 4])y = np.array([5, 6, 7, 8])manhattan = np.sum(np.abs(x - y))print(f'base on self calculate, manhattan is: {manhattan}')xy = np.vstack([x, y])manhattan = pdist(xy, 'cityblock')print(f'base on pdist, cityblock is: {manhattan[0]}')
base on self calculate, manhattan is: 16
base on pdist, cityblock is: 16.0

4.切比雪夫(Chebyshev)距离

对于两个点,切比雪夫距离定义为各坐标值数值差绝对值中的最大值。如果从向量角度看,就是两个向量各维度差值绝对值的最大值。

对于两个n维向量a, b, a = ( x 1 , x 2 , ⋯ , x n ) , b = ( y 1 , y 2 , ⋯ , y n ) a = (x_1,x_2,\cdots,x_n), b = (y_1,y_2,\cdots,y_n) a=(x1,x2,,xn),b=(y1,y2,,yn),切比雪夫距离为
d ( a , b ) = max ⁡ ( ∣ x 1 − y 1 ∣ , ∣ x 2 − y 2 ∣ , ⋯ , ∣ x n − y n ∣ ) = max ⁡ i ( x i − y i ) d(a, b) = \max(|x_1 - y_1|, |x_2 - y_2|, \cdots, |x_n - y_n|) = \max_i (x_i - y_i) d(a,b)=max(x1y1,x2y2,,xnyn)=imax(xiyi)

上面的表达式等价为
d ( a , b ) = lim ⁡ p → ∞ ( ∑ k = 1 n ∣ x k − y k ∣ p ) 1 / p d(a, b) =\lim_{p \to \infty} \left( { \sum_{k=1}^n |x_k - y_k|^p } \right) ^ {1/p} d(a,b)=plim(k=1nxkykp)1/p

def chebyshev_distance():x = np.array([1, 2, 3, 4])y = np.array([5, 6, 7, 10])distance = np.max(np.abs(x - y))print(f'base on self calculate, chebyshev is: {distance}')xy = np.vstack([x, y])distance = pdist(xy, 'chebyshev')print(f'base on pdist, chebyshev is: {distance[0]}')
base on self calculate, chebyshev is: 6
base on pdist, chebyshev is: 6.0

5.闵可夫斯基(Minkowski)距离

对于两个n维向量a, b, a = ( x 1 , x 2 , ⋯ , x n ) , b = ( y 1 , y 2 , ⋯ , y n ) a = (x_1,x_2,\cdots,x_n), b = (y_1,y_2,\cdots,y_n) a=(x1,x2,,xn),b=(y1,y2,,yn),p为一个变量,定义闵可夫斯基距离(闵氏距离)为:

d ( a , b ) = ∑ k = 1 n ∣ x k − y k ∣ p p = ( ∑ k = 1 n ∣ x k − y k ∣ p ) 1 / p d(a, b) =\sqrt [p]{ \sum_{k=1}^n |x_k - y_k|^p } = \left( { \sum_{k=1}^n |x_k - y_k|^p } \right) ^ {1/p} d(a,b)=pk=1nxkykp =(k=1nxkykp)1/p

需要注意的是,闵氏距离不是某一种具体的距离,而是一类距离的定义。
当p=1,此时就是曼哈顿距离。
当p=2,此时就是欧式距离。
p → ∞ p \to \infty p,此时是切比雪夫距离。

def minkowski_distance():x = np.array([1, 2, 3, 4])y = np.array([5, 6, 7, 8])xy = np.vstack([x, y])manhattan = pdist(xy, 'minkowski', p=1)print(f'when p=1, manhattan result is: {manhattan[0]}')euclidean = pdist(xy, 'minkowski', p=2)print(f'when p=2, euclidean result is: {euclidean[0]}')
when p=1, manhattan result is: 16.0
when p=2, euclidean result is: 8.0

6.杰卡德(Jaccard)距离

杰卡德相似系数(Jaccard similarity coefficient):是指两个集合A、B中,交集元素在A、B的并集中所占的比例,这个比例叫杰卡德相似系数,可以使用J(A,B)表示。
J ( A , B ) = A ∩ B A ∪ B J(A, B) = \frac{A \cap B}{A \cup B} J(A,B)=ABAB

杰卡德距离(Jaccard Distance)与杰卡德相似系数相反,用两个集合中不同元素的比例来表示两个集合的区分度。
J d ( A , B ) = 1 − J ( A , B ) = A ∪ B − A ∩ B A ∪ B J_d(A, B) = 1 - J(A, B) = \frac{A \cup B - A \cap B}{A \cup B} Jd(A,B)=1J(A,B)=ABABAB

def jaccard_distance():x = np.random.random(10) > 0.5y = np.random.random(10) > 0.5x = np.asarray(x, np.int32)y = np.asarray(y, np.int32)print("x = ", x)print("y = ", y)xy = np.vstack([x, y])# 根据公式求解up = np.double(np.bitwise_and((x != y), np.bitwise_or(x != 0, y != 0)).sum())down = np.double(np.bitwise_or(x != 0, y != 0).sum())dist1 = up / downprint(f'up is: {up}, down is: {down}')print(f"base on pdist, dist1 is: : {dist1}")dist2 = pdist(xy, 'jaccard')
x =  [0 0 0 1 0 1 0 1 1 1]
y =  [0 0 1 0 0 0 1 1 0 1]
up is: 5.0, down is: 7.0
base on pdist, dist1 is: : 0.7142857142857143
dist2 is: 0.7142857142857143

注意上面的计算,删除了(0,0)的数据对。

7.汉明(Hamming)距离

在信息论中,两个等长字符串之间的汉明距离(Hamming distance)是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。
需要注意的是,汉明距离针对的是两个等长字符串。

def hamming_distance():x = np.random.random(10) > 0.5y = np.random.random(10) > 0.5x = np.asarray(x, np.int32)y = np.asarray(y, np.int32)print(f'x is: {x}')print(f'y is: {y}')hamming = np.mean(x != y)print(f'base on self calculate, hamming is: {hamming}')xy = np.vstack([x, y])hamming = pdist(xy, 'hamming')print(f'base on pdist, hamming is: {hamming[0]}')
x is: [0 0 0 1 0 0 0 1 0 1]
y is: [1 1 1 0 1 1 1 1 1 0]
base on self calculate, hamming is: 0.9
base on pdist, hamming is: 0.9

8.编辑距离(levenshtein distance)

编辑距离是针对二个字符串(例如英文字)的差异程度的量化量测,量测方式是看至少需要多少次的处理才能将一个字符串变成另一个字符串。编辑距离可以用在自然语言处理中,例如拼写检查可以根据一个拼错的字和其他正确的字的编辑距离,判断哪一个(或哪几个)是比较可能的字。DNA也可以视为用A、C、G和T组成的字符串,因此编辑距离也用在生物信息学中,判断二个DNA的类似程度。Unix 下的 diff 及 patch 即是利用编辑距离来进行文本编辑对比的例子。

def levenshtein_distance(s1, s2):n, m = len(s1), len(s2)distance = [[0 for _ in range(m + 1)] for _ in range(n + 1)]for i in range(n + 1):distance[i][0] = ifor j in range(m + 1):distance[0][j] = jfor i in range(1, n + 1):for j in range(1, m + 1):cost = 0 if s1[i-1] == s2[j-1] else 1distance[i][j] = min(distance[i - 1][j] + 1,distance[i][j - 1] + 1,distance[i - 1][j - 1] + cost)result = distance[n][m]print(f'result is: {result}')return results1, s2 = 'kitten', 'sitting'
levenshtein_distance(s1, s2)
result is: 3

9.余弦距离(cosine distance)

余弦是非常常用的概念。几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中使用这一概念来衡量样本向量之间的差异。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。

def cosine_distance():x = np.array([1, 2, 3, 4])y = np.array([5, 6, 7, 8])cosine = np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y))print(f'base on self calculate, cosine is: {cosine}')xy = np.vstack([x, y])cosine = pdist(xy, 'cosine')print(f'base on pdist, cosine is: {1 - cosine[0]}')
base on self calculate, cosine is: 0.9688639316269662
base on pdist, cosine is: 0.9688639316269662

10.皮尔逊相关系数(Pearson correlation coefficient)

皮尔逊相关系数是用来度量两个向量x,y之间的相关性,值位于[-1,1]之间。
两个变量之间的皮尔逊相关系数定义为两个变量的协方差除以它们标准差的乘积:

ρ X , Y = c o v ( X , Y ) σ X σ Y = E [ ( X − μ X ) ( Y − μ Y ) ] σ X σ Y {\displaystyle \rho _{X,Y}={\mathrm {cov} (X,Y) \over \sigma _{X}\sigma _{Y}}={E[(X-\mu _{X})(Y-\mu _{Y})] \over \sigma _{X}\sigma _{Y}}} ρX,Y=σXσYcov(X,Y)=σXσYE[(XμX)(YμY)]

上式定义了总体相关系数,常用希腊小写字母 ρ (rho) 作为代表符号。估算样本的协方差和标准差,可得到样本相关系数(样本皮尔逊系数),常用英文小写字母 r 表示:

r = ∑ i = 1 n ( X i − X ‾ ) ( Y i − Y ‾ ) ∑ i = 1 n ( X i − X ‾ ) 2 ∑ i = 1 n ( Y i − Y ‾ ) 2 r={\frac {\sum \limits _{i=1}^{n}(X_{i}-{\overline {X}})(Y_{i}-{\overline {Y}})}{{\sqrt {\sum \limits _{i=1}^{n}(X_{i}-{\overline {X}})^{2}}} {\sqrt {\sum \limits _{i=1}^{n}(Y_{i}-{\overline {Y}})^{2}}}}} r=i=1n(XiX)2 i=1n(YiY)2 i=1n(XiX)(YiY)

r也可以从样本点的标准分数均值估算,等价的表达式为:

r = 1 n − 1 ∑ i = 1 n ( X i − X ‾ σ X ) ( Y i − Y ‾ σ Y ) r={\frac {1}{n-1}}\sum \limits _{i=1}^{n}\left({\frac {X_{i}-{\overline {X}}}{\sigma _{X}}}\right)\left({\frac {Y_{i}-{\overline {Y}}}{\sigma _{Y}}}\right) r=n11i=1n(σXXiX)(σYYiY)

def pearson_correlation_coefficient():x = np.array([1, 2, 3, 4])y = np.array([5, 6, 7, 8])x_ = x - np.mean(x)y_ = y - np.mean(y)pearson = np.dot(x_, y_) / (np.linalg.norm(x_) * (np.linalg.norm(y_)))print(f'pearson is: {pearson}')xy = np.vstack([x, y])pearson = np.corrcoef(xy)print(f'pearson is: {pearson}')

输出结果为

pearson is: 0.9999999999999998
pearson is: [[1. 1.][1. 1.]]

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

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

相关文章

接口文档编写注意事项

接口文档编写注意事项 字段方面 ①不需要的字段、逻辑中固定值的字段(可写死的字段)不提供 ②逻辑上可以合并的字段合并 例如:当一个互斥条件下,分别返回了两个字段,这个时候就可以在这个基础上将两个字段合并成一个…

Linux连接文件那点事

什么是连接文件 将一个文件和另一个文件建立联系,分为硬链接和软连接(符号连接)。 硬链接 Linux中,所有的文件都有一个inode,这个东西就是文件的ID号,硬链接的方式就是通过这个inode来产生新的文件名来建…

Stable Diffusion入门使用技巧及个人试用实例分享--生成稳定人物及姿势篇

上节我们主要讲解了SD提示词的实践篇及ControlNet常用模型篇,本节主要想给大家分享一下如何在不自己单独训练lora的情况下尽量稳定的控制生成的人物的脸及姿势。欢迎阅读。 一、如何稳定生成相同的人物(脸部) 1、瞎编名字法: d…

ICode国际青少年编程竞赛- Python-6级训练场-多重递归

ICode国际青少年编程竞赛- Python-6级训练场-多重递归 1、 def move(a, b):if a > 12:returnDev.step(a)Dev.turnRight()if b < 4:move(a, b1)else:move(a2, 1) move(2, 1)2、 def move(a, b):if a < 2:returnif b 1: Spaceship.step(2)Dev.step(a)Dev.turnRight()De…

智能AI数字人直播带货软件系统,支持所有平台直播可带货,引流私域,同城团购 带源代码包

系统概述 智能AI数字人直播带货软件系统是一款基于人工智能技术的创新产品&#xff0c;该系统集成了深度学习、自然语言处理、图像识别等多项前沿技术&#xff0c;能够模拟真实主播的行为和表情&#xff0c;实现高度智能化的直播带货体验。该系统支持所有主流直播平台&#xf…

IDEA的妙用

IDEA 安装破解 复制JetbrainsIdesCrack-4.2.jar到安装目录下 修改安装目录下的bin目录的idea64.exe.vmoptions&#xff1a; 最后一行添加&#xff1a;-javaagent:E:\develop\JetBrains\IntelliJ IDEA 2018.3.5\bin\JetbrainsIdesCrack-4.2.jar(注意&#xff1a;使用自己的路…

Vue.js 详细介绍

文章目录 一、Vue.js 简介1.1 什么是 Vue.js&#xff1f;1.2 Vue.js 的特点 二、快速上手 Vue.js2.1 安装 Vue.js使用 CDN使用 npm 或 yarn 2.2 创建一个 Vue 实例2.3 Vue.js 项目结构 三、Vue.js 核心概念3.1 数据绑定3.2 指令&#xff08;Directives&#xff09;3.3 组件&…

MATLAB车辆动力学建模 ——《控制系统现代开发技术》

引言 在上这门课之前&#xff0c;我已经用过CasADi 去做过最优化的相关实践&#xff0c;其中每一步迭代主要就是由&#xff1a;对象系统优化求解两部分组成的。这里我们重点介绍 “对象系统”如何去描述 &#xff0c;因为它是每一步迭代中重要的一环——“优化求解”会获得控制…

Linux系统中pts和tty会话删除

一、背景 一台CentOS6.7主机存在iscsi盘&#xff0c;为了正常卸载此iscsi盘&#xff0c;需要先将所有相关会话退出使用该iscsi盘。 检查发现存在多个系统用户登录的情况。 二、问题 无法使用kill -9删除linux会话&#xff0c;提示信息为“-bash: kill: (16680) - Operation not…

java项目之企业资产管理系统(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的企业资产管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员功能有个人中心&…

【全开源】JAVA红娘婚恋相亲交友系统源码支持微信小程序+微信公众号+H5+APP

红娘婚恋相亲交友系统&#xff1a;遇见你的命中注定 在快节奏的现代生活中&#xff0c;许多单身男女都在寻找一个平台&#xff0c;希望能遇见那个能与自己携手共度一生的伴侣。红娘婚恋相亲交友系统正是为了满足这一需求而诞生的&#xff0c;它旨在为广大单身男女提供一个安全…

咒语和药水的成功对数

题目链接 咒语和药水的成功对数 题目描述 注意点 一个咒语和药水的能量强度相乘如果大于等于 success &#xff0c;那么它们视为一对成功的组合 解答思路 先将药水进行排序&#xff0c;然后二分查找找到某个咒语i和药水的能量强度相乘大于等于success的左边界left&#xf…

A股股息率最高的十个行业,哪些高股息可持续?

2023年以来&#xff0c;银行不断调低存款利率。目前&#xff0c;六大行5年定期存款&#xff08;整存整取&#xff09;挂牌利率约为2%。随着存款收益下降&#xff0c;那些股息率较高的上市公司和行业受到了关注。 数据分析显示&#xff0c;一部分行业的高股息可以持续&#xff…

JAVA云HIS医院管理系统源码 云HIS系统源码 SaaS模式 采用Java+Spring,SpringBoot开发的云HIS医院管理系统

云HIS采用JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&#xff0c;MyBatisPlus技术开发。可满足诊所业务中预约、看诊、收费、发药、药库管理、经营分析等多环节的工作需要。和传统医院系统相比&#xff0c;云HIS的操作简单&#xff0c;…

【Python】使用requests采集数据存入mysql或文件

一、什么是requests requests包是一个使用Python编写的HTTP请求库&#xff0c;使得发送HTTP请求和处理HTTP响应变得更加简单。以下是对requests包的详细介绍&#xff1a; 用途&#xff1a; requests包主要用于与HTTP交互&#xff0c;能够发送HTTP请求和处理HTTP响应。它支持处…

uni-app:音频播放 uni.createInnerAudioContext()

uni.createInnerAudioContext() 创建并返回内部 audio 上下文 innerAudioContext 对象 简单实现音频播放&#xff1a; let innerAudioContext uni.createInnerAudioContext(); innerAudioContext.src ../../../../static/ok.MP3;//音频地址 innerAudioContext.play(); inn…

SL3038 48V/60V电动车里程增程器电源驱动芯片 大电流3A

在电动车领域中&#xff0c;电池续航能力一直是制约其广泛应用的关键因素之一。为了提高电动车的续航能力和使用效率&#xff0c;各大厂商纷纷投入研发&#xff0c;寻求更为先进的电源驱动芯片解决方案。其中&#xff0c;SL3038 48V/60V电动车里程增程器电源驱动芯片以其卓越的…

我是如何利用AI提高内容生产效率的

文章目录 如何利用AI提高内容生产效率?自动化内容生成内容推荐与个性化数据分析与内容优化自动化编辑与翻译虚拟助手与自动化排版智能内容管理与版本控制情感分析与内容优化实时反馈与即时调整跨平台内容适配智能内容生成工具总结 如何利用AI提高内容生产效率? 简介&#xff…

JAVA二手车交易二手车市场系统源码支持微信小程序+微信公众号+H5+APP

二手车交易二手车市场系统&#xff1a;重塑购车新体验 随着汽车消费市场的日益成熟&#xff0c;二手车交易逐渐成为消费者购车的新选择。为了提供更加便捷、透明、安全的二手车交易环境&#xff0c;我们推出了“二手车交易二手车市场系统”&#xff0c;旨在为买卖双方搭建一个…

Stable Diffusion基础界面介绍

SD是stable diffusion的简称&#xff0c;AI绘画的一个开源应用,&#xff08;不需要科学上网&#xff09;&#xff0c;目前使用的版本是B站UP秋葉aaaki整理的最终版。 安装教程详见 B站up主 秋葉aaaki&#xff0c;教程下有提供stable diffusion的下载链接。 安装必要的三个基础…