机器学习---常见的距离公式(欧氏距离、曼哈顿距离、标准化欧式距离、余弦距离、杰卡德距离、马氏距离、切比雪夫距离、闵可夫斯基距离、K-L散度)

1. 欧氏距离

       欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空

间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中

的欧氏距离就是两点之间的实际距离。

from scipy.spatial import distance
a = (1, 2, 3)
b = (4, 5, 6)

print(distance.euclidean(a, b))

2. 曼哈顿距离 

        图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的

曼哈顿距离。曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-

xj|+|yi-yj|。对于一个具有正南正北、正东正西方向规则布局的城镇街道,从一点到达另一点的距离

正是在南北方向上旅行的距离加上在东西方向上旅行的距离,因此,曼哈顿距离又称为出租车距

离。曼哈顿距离不是距离不变量,当坐标轴变动时,点间的距离就会不同。曼哈顿距示意图在早期

的计算机图形学中,屏幕是由像素构成,是整数,点的坐标也一般是整数,原因是浮点运算很昂

贵,很慢而且有误差,如果直接使用AB的欧氏距离(欧几里德距离:在二维和三维空间中的欧氏

距离的就是两点之间的距离),则必须要进行浮点运算,如果使用AC和CB,则只要计算加减法即

可,这就大大提高了运算速度,而且不管累计运算多少次,都不会有误差。

import numpy as np
from scipy.spatial import distance

A = np.array([7,8,9])
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)

3. 标准化欧氏距离 

标准化欧⽒距离是针对欧⽒距离的缺点⽽作的⼀种改进。

既然数据各维分量的分布不⼀样,那先将各个分量都“标准化”到均值、⽅差相等。

S 表示各个维度的标准差:

如果将⽅差的倒数看成⼀个权重,也可称之为加权欧⽒距离(Weighted Euclidean distance)。

from scipy.spatial.distance import pdist
dist2 = pdist(Vec,’seuclidean’)

4. 余弦距离 

       ⼏何中,夹⻆余弦可⽤来衡量两个向量⽅向的差异;机器学习中,借⽤这⼀概念来衡量样本向

量之间的差异。

⼆维空间中向量A(x1,y1)与向量B(x2,y2)的夹⻆余弦公式:

两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹⻆余弦为: 

        夹⻆余弦取值范围为[-1,1]。余弦越⼤表示两个向量的夹⻆越⼩,余弦越⼩表示两向量的夹⻆

越⼤。当两个向量的⽅向 重合时余弦取最⼤值1,当两个向量的⽅向完全相反余弦取最⼩值-1。 

import numpy as np
from scipy.spatial import distance

A = np.array([7,8,9])
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)

5.  汉明距离

 两个等⻓字符串s1与s2的汉明距离为:将其中⼀个变为另外⼀个所需要作的最⼩字符替换次数。

       汉明重量:是字符串相对于同样⻓度的零字符串的汉明距离,也就是说,它是字符串中⾮零的

元素个数,对于⼆进制字符串来说,就是 1 的个数,所以 11101 的汉明重量是 4。因此,向量空

间中的元素a和b之间的汉明距离等于它们汉明重量的差a-b。

应⽤:汉明重量分析在包括信息论、编码理论、密码学等领域都有应⽤。⽐如在信息编码过程中,

为了增强容错性,应使得编码间的最⼩汉明距离尽可能⼤。但是,如果要⽐较两个不同⻓度的字符

串,不仅要进⾏替换,⽽且要进⾏插⼊与删除的运算,在这种场合下,通常使⽤更加复杂的编辑距

离等算法。

import numpy as np
from scipy.spatial import distance

A = np.array([1,2,3])
B = np.array([4,5,6])

# scipy库计算
dist1 = distance.hamming(A,B)

6. 杰卡德距离 

       杰卡德相似系数(Jaccard similarity coefficient):两个集合A和B的交集元素在A,B的并集中所

占的⽐例,称为两个集合的杰卡德相似系数,⽤符号J(A,B)表示:

       杰卡德距离(Jaccard Distance):与杰卡德相似系数相反,⽤两个集合中不同元素占所有元素

的⽐例来衡量两个集合的区分度: 

# 方案一
# 根据公式求解
up = np.double(np.bitwise_and((vec1!=vec2),np.bitwise_or(vec1!=0,vec2!=0)).sum())
down = np.double(np.bitwise_or(vec1!=0,vec2!=0).sum())
dist1=(up/down)
print("杰卡德距离测试结果是:"+str(dist1))
# 方案二
# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'jaccard')
print("杰卡德距离测试结果是:"+str(dist2))

 7. 马氏距离

马氏距离是基于样本分布的⼀种距离。

马氏距离是由印度统计学家⻢哈拉诺⽐斯提出的,表示数据的协⽅差距离。它是⼀种有效的计算两

个位置样本集的相似 度的⽅法。 与欧式距离不同的是,它考虑到各种特性之间的联系,即独⽴于

测量尺度。

       马氏距离也可以定义为两个服从同⼀分布并且其协⽅差矩阵为∑的随机变量的差异程度,如果

协⽅差矩阵为单位矩阵, 马氏距离就简化为欧式距离;如果协⽅差矩阵为对角矩阵,则其也可称

为正规化的欧式距离。 

计算马氏距离过程中,要求总体样本数⼤于样本的维数,否则得到的总体样本协⽅差矩阵逆矩阵不

存在,这种情况 下,⽤欧式距离计算即可。

import numpy as np
from scipy.spatial.distance import pdist
a=np.random.random(10)
b=np.random.random(10)
#马氏距离要求样本数要大于维数,否则无法求协方差矩阵
X=np.vstack([a,b])
XT=X.T  #此处进行转置,表示10个样本,每个样本2维

pdist(XT,'mahalanobis')

8. 切比雪夫距离 

        在数学中,切比雪夫距离或是L∞度量,是向量空间中的一种度量,二个点之间的距离定义是

其各坐标数值差绝对值的最大值。以数学的观点来看,切比雪夫距离是由一致范数(uniform

norm)(或称为上确界范数)所衍生的度量,也是超凸度量(injective metric space)的一种。

# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'chebyshev')
print('切比雪夫距离测试结果是:' + str(dist2))

9. 闵可夫斯基距离 

       闵可夫斯基距离 (Minkowski Distance),也被称为 闵氏距离。它不仅仅是一种距离,而是将多

个距离公式(曼哈顿距离、欧式距离、切比雪夫距离)总结成为的一个公式

两个n维变量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'cityblock',p=1)
print('当P=1时就是曼哈顿距离,测试结果是:' + str(dist2))

# 根据公式求解,p=1
from numpy import *
dist3 = sum(abs(vec1-vec2))# abs()绝对值
print('当p=1时就是曼哈顿距离,测试结果是:' + str(dist3))

10. K-L散度 

K-L散度(Kullback–Leibler divergence),又称K-L距离,相对熵。

当P(x)和Q(x)的相似度越高,K-L散度越小。

K-L散度主要有两个性质:

(1)不对称性

尽管KL散度从直观上是个度量或距离函数,但它并不是一个真正的度量或者距离,因为它不具有

对称性,即D(P||Q)!=D(Q||P)。

(2)非负性

相对熵的值是非负值,即D(P||Q)>0。

# 利用scipy API进行计算

KL = scipy.stats.entropy(x, y)
print(KL)

# 用公式编程就用px和py

KL = 0.0
for i in range(10):
    KL += px[i] * np.log(px[i] / py[i])
print(KL)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【雷达】接收和去噪L波段雷达接收到的信号研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

单链表的多语言表达:C++、Java、Python、Go、Rust

单链表 是一种链式数据结构,由一个头节点和一些指向下一个节点的指针组成。每个节点包含一个数据元素和指向下一个节点的指针。头节点没有数据,只用于表示链表的开始位置。 单链表的主要操作包括: 添加元素:在链表的头部添加新…

采用typescript编写,实现ofd前端预览、验章

前言 浏览器内核已支持pdf文件的渲染,这极大的方便了pdf文件的阅读和推广。ofd文件作为国产板式标准,急需一套在浏览器中渲染方案。 本人研究ofd多年,分别采用qt、c# 开发了ofd阅读器。本人非前端开发人员,对js、typescript并不熟…

工程管理与工作流

1 统一开发环境/ 协作工具 你知道开发环境指的是什么吗? 开发环境: 工程运行环境、开发工具/ 编辑器 、开发依赖环境、 配置文件 软件环境: “仿真预演”环境 Staging 生产环境前最终验证、 这一环境尽可能的仿真了真实的生产环境 、另一个…

自己实现 SpringMVC 底层机制 系列之-实现任务阶段 6-完成控制器方法获取参数-@RequestParam

😀前言 自己实现 SpringMVC 底层机制 系列之-实现任务阶段 6-完成控制器方法获取参数-RequestParam 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家&#xff0c…

网络编程——网络基础知识

目录 一、网络历史两个重要名词1.1 阿帕网1.2 TCP/IP协议 二、局域网和广域网三、IP地址3.1 基本概念3.2 划分(IPV4)3.3 特殊IP地址3.4 子网掩码3.5 重新组网 四、网络模型4.1 网络的体系结构:4.2 OSI与TCP/IP模型4.2.1 OSI模型4.2.2 TCP/IP模型4.2.3 OSI和TCP/IP模…

CNN之图像识别

什么是图像识别 • 图像识别技术是信息时代的一门重要的技术,其产生目的是为了让计算机代替人类去处理大量的物理信息。随着计算机技术的发展,人类对图像识别技术的认识越来越深刻 • 图像识别技术的定义为利用计算机对图像进行处理、分析和理解&…

Docker(二) Docker容器

在docker中的容器都是由镜像所创建的,一个镜像可以创建多个容器。 一、调试Docker 启动Docker systemctl start docker 查看Docker中有哪些镜像 docker images 下载镜像 docker pull hello-world 运行镜像 docker run hello-world 出现 Hello from Docker! 这…

构建系统自动化-autoreconf

autoreconf简介 autoreconf是一个GNU Autotools工具集中的一个命令,用于自动重新生成构建系统的配置脚本和相关文件。 Autotools是一组用于自动化构建系统的工具,包括Autoconf、Automake和Libtool。它们通常用于跨平台的软件项目,以便在不同…

[C语言]分支与循环

导言: 在人生中我们总会有选择,**如下一顿吃啥?**又或者每天都是在重复,吃饭!!!!,当然在C语言中也有选择和重复那就是分支语句与循环语句 文章目录 分支循环循环中的关键…

手写代码-前端面试

GitHub:手写代码集合

大数据-玩转数据-Flink营销对账

一、说明 在电商网站中,订单的支付作为直接与营销收入挂钩的一环,在业务流程中非常重要。对于订单而言,为了正确控制业务流程,也为了增加用户的支付意愿,网站一般会设置一个支付失效时间,超过一段时间不支…

一云多芯,智能化转型的下一个工程化挑战

进入2023年,产业数字化和智能化转型升级进入了大规模工程化落地阶段。根据中国信通院《中国数字经济发展研究报告(2023)》,数字经济已经占我国GDP比重达到41.5%,相当于第二产业占国民经济的比重。随着产业数字化和智能…

【数据结构】 LinkedList的模拟实现与使用

文章目录 🍀什么是LinkedList🌴LinkedList的模拟实现🚩创建双链表🚩头插法🚩尾插法🚩任意位置插入🚩查找关键字🚩链表长度🚩打印链表🚩删除第一次出现关键字为…

YOLOv5+deepsort实现目标追踪。(附有各种错误解决办法)

一、YOLOv5算法相关配置 🐸这里如果是自己只想跑一跑YOLOV5的话,可以参考本章节。只想跑通YOLOv5+deepsort的看官移步到下一章节。 1.1 yolov5下载 🐸yolov5源码在github下载地址上或者Gitee上面都有。需要注意的是由于yolov5的代码库作者一直在维护,所以下载的时候需…

【Unity小技巧】Unity探究自制对象池和官方内置对象池(ObjectPool)的使用

文章目录 前言不使用对象池使用官方内置对象池应用 自制对象池总结源码参考完结 前言 对象池(Object Pool)是一种软件设计模式,用于管理和重用已创建的对象。在对象池中,一组预先创建的对象被维护在一个池中,并在需要时…

OJ练习第152题——分割回文串 II

分割回文串 II 力扣链接:132. 分割回文串 II 题目描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 Java代码 class Solution {public int minCut(String s) {int n s.leng…

听说你还不知道什么是python?本文将带你发掘python的魅力并让你爱上他

文章目录 前言什么是pythonpython的由来我们为什么要学习python帮助python学习的网站总结 前言 各位朋友们,大家好。龙叔我后台经常收到私信问什么是Python?有必要学习这门语言么?今天,将通过本文告知大家Python是什么&#xff1…

浅谈日常使用的 Docker 底层原理-三大底座

适合的读者,对Docker有过简单了解的朋友,想要进一步了解Docker容器的朋友。 前言 回想我这两年,一直都是在使用 Docker,看过的视频、拜读过的博客,大都是在介绍 Docker 的由来、使用、优点和发展趋势,但对…

QT学习笔记-开发环境编译Qt MySql数据库驱动与交叉编译Qt MySql数据库驱动

QT学习笔记-开发环境编译Qt MySql数据库驱动与交叉编译Qt MySql数据库驱动 0、背景1、基本环境2、开发环境编译Qt MySql数据库驱动2.1 依赖说明2.2 MySQL驱动编译过程 3、交叉编译Qt MySql数据库驱动3.1 依赖说明3.3.1 如何在交叉编译服务器上找到mysql.h及相关头文件3.3.2 如果…