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

常见距离计算的Python实现

常见的距离有曼哈顿距离、欧式距离、切比雪夫距离、闵可夫斯基距离、汉明距离、余弦距离等,用Python实现计算的方式有多种,可以直接构造公式计算,也可以利用内置线性代数函数计算,还可以利用scipy库计算。

1.曼哈顿距离

也叫城市街区距离,是两点差向量的L1范数,也就是各元素的绝对值之和。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的曼哈顿距离表示为
d = ∑ i = 1 n ∣ x i − y i ∣ d=\sum_{i=1}^{n}{\left| x_i-y_i \right|} d=i=1nxiyi

Python实现:

import numpy as np
from scipy.spatial import distanceA = np.array([1,2,3])
B = np.array([4,5,6])# 方式一:直接构造公式计算
dist1 = np.sum(np.abs(A-B))# 方式二:内置线性代数函数计算
dist2 = np.linalg.norm(A-B,ord=1)  #ord为范数类型,取值1(一范数),2(二范数),np.inf(无穷范数),默认2。# 方式三:scipy库计算
dist3 = distance.cityblock(A,B)

2.欧式距离

是一种最常见的距离,也就是两点差向量的L2范数。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的欧式距离表示为
d = ∑ i = 1 n ( x i − y i ) 2 d=\sqrt{\sum_{i=1}^{n}{\left( x_i-y_i \right)^{2}}} d=i=1n(xiyi)2

Python实现:

import numpy as np
from scipy.spatial import distanceA = np.array([1,2,3])
B = np.array([4,5,6])# 方式一:直接构造公式计算
dist1 = np.sqrt(np.sum((A-B)**2))# 方式二:内置线性代数函数计算
dist2 = np.linalg.norm(A-B,ord=2)# 方式三:scipy库计算
dist3 = distance.euclidean(A,B)

3.切比雪夫距离

最大的维度内距离,是两点差向量的无穷范数。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的切比雪夫距离表示为
d = m a x ( ∣ x i − y i ∣ ) d=max\left( \left| x_i-y_i \right| \right) d=max(xiyi)
Python实现:

import numpy as np
from scipy.spatial import distanceA = np.array([1,2,3])
B = np.array([4,5,6])# 方式一:直接构造公式计算
dist1 = np.max(np.abs(A-B))# 方式二:内置线性代数函数计算
dist2 = np.linalg.norm(A-B,ord=np.inf)# 方式三:scipy库计算
dist3 = distance.chebyshev(A,B)

4. 闵可夫斯基距离

是一种范式距离的统称,可表示为两点差向量的Lp范数。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的闵可夫斯基距离表示为
d = ∑ i = 1 n ∣ x i − y i ∣ p p d=\sqrt[p]{\sum_{i=1}^{n}{\left| x_i-y_i \right|^{p}}} d=pi=1nxiyip
Python实现:

import numpy as np
from scipy.spatial import distanceA = np.array([1,2,3])
B = np.array([4,5,6])# 方式一:内置线性代数函数计算
dist1 = np.linalg.norm(A-B,ord=3)  # np.linalg.norm(A-B,ord=p)# 方式二:scipy库计算
dist2 = distance.minkowski(A,B,3)  # distance.minkowski(A,B,p)

5.汉明距离

衡量两个字符串之间的差异程度,对两个对象的向量元素逐个比较,差异的个数占总个数的比例。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的汉明距离表示为
d = 1 n ∑ i = 1 n I ( x i ≠ y i ) d=\frac{1}{n}\sum_{i=1}^{n}{I\left( x_i\ne y_i \right)} d=n1i=1nI(xi=yi)
其中I为指示函数,
I = { 1 i f ( x i ≠ y i ) 0 i f ( x i = y i ) \begin{equation} I= \left\{ \begin{array}{lr} 1 \quad if\left( x_i\ne y_i \right)&\\ 0 \quad if\left( x_i = y_i\right) \end{array} \right. \end{equation} I={1if(xi=yi)0if(xi=yi)
Python实现:

import numpy as np
from scipy.spatial import distanceA = np.array([1,2,3])
B = np.array([4,5,6])# 方式一:scipy库计算
dist1 = distance.hamming(A,B)

6.余弦距离

也叫余弦相似度,是两点空间向量夹角的余弦值,是内积与模积的比值,用来衡量两向量间的差异程度。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的余弦距离表示为
d = c o s θ = < A , B > ∣ A ∣ ⋅ ∣ B ∣ = ∑ i = 1 n x i y i ∑ i = 1 n x i 2 ⋅ ∑ i = 1 n y i 2 \begin{align} d&=cos\theta=\frac{<A,B>}{\left| A \right|\cdot\left| B \right|} \\ &=\frac{\sum_{i=1}^{n}{x_iy_i}}{\sqrt{\sum_{i=1}^{n}{x_i^{2}}}\cdot\sqrt{\sum_{i=1}^{n}{y_i^{2}}}} \end{align} d=cosθ=AB<A,B>=i=1nxi2 i=1nyi2 i=1nxiyi
Python实现:

import numpy as np
from scipy.spatial import distanceA = np.array([1,2,3])
B = np.array([4,5,6])# 方式一:直接构造公式计算
dist1 = np.sum(A*B)/(np.sqrt(np.sum(A**2))*np.sqrt(np.sum(B**2)))# 方式二:scipy库计算
dist2 = 1-distance.cosine(A,B)

End.


参考:
https://blog.csdn.net/lemonbit/article/details/129053257

http://www.lryc.cn/news/112111.html

相关文章:

  • 开发运营监控
  • 食品小程序的制作教程
  • Kubernetes(K8s)从入门到精通系列之十三:软件负载平衡选项
  • 数据特征选择 | Matlab实现具有深度度量学习的时频特征嵌入
  • 浅谈webpack
  • 【 stable diffusion LORA模型训练最全最详细教程】
  • 蓝桥杯上岸每日N题 第八期 (全球变暖)!!!
  • CSS基础介绍笔记1
  • https请求异常引发(Received fatal alert: unrecognized_name):如何快速解决项目中问题?
  • 小程序 view下拉滑动导致scrollview滑动事件失效
  • 《ROS2》教程
  • 抖音seo源码开发源代码搭建分享
  • MATLAB——使用建立好的神经网络进行分类程序
  • Spring5.2.x 源码使用Gradle成功构建
  • iOS永久签名工具 - 轻松签使用教程
  • 如何申请中国境内提供金融信息服务业务许可
  • Java多线程(六)
  • ceil(),floor(),round()函数C++详解
  • 自动化处理,web自动化测试处理多窗口+切换iframe框架页总结(超细整理)
  • 企业服务器数据库中了devos勒索病毒怎么办如何解决预防勒索病毒攻击
  • three.js学习
  • Vue3 第一节 Vue3简介以及创建Vue3工程
  • 用docker 部署springboot项目
  • maven 模块打包时包含依赖和打包可执行的jar
  • perl脚本调用openssh不能正确执行(ctl_dir /root/.libnet-openssh-perl/ is not secure)的原因排查
  • Apache+Tomcat 整合
  • CSS中page-break-after属性
  • mvn build jar依赖和源码本身分开。减轻编译后的jar大小
  • Java是值传递还是引用传递?
  • 16 - 初探Linux进程调度