1.欧氏距离(Euclidean Distance)

欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式。

(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:

(2)三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:

(3)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:

(4)也可以用表示成向量运算的形式:

python中的实现:

方法一:

import numpy as np

x=np.random.random(10)

y=np.random.random(10)

#方法一:根据公式求解

d1=np.sqrt(np.sum(np.square(x-y)))

#方法二:根据scipy库求解

from scipy.spatial.distance import pdist

X=np.vstack([x,y])

d2=pdist(X)

2.曼哈顿距离(Manhattan Distance)

从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(City Block distance)。

(1)二维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离

(2)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的曼哈顿距离

python中的实现 :

import numpy as np

x=np.random.random(10)

y=np.random.random(10)

#方法一:根据公式求解

d1=np.sum(np.abs(x-y))

#方法二:根据scipy库求解

from scipy.spatial.distance import pdist

X=np.vstack([x,y])

d2=pdist(X,'cityblock')

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

国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是max( | x2-x1 | , | y2-y1 | ) 步 。有一种类似的一种距离度量方法叫切比雪夫距离。

(1)二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离

(2)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的切比雪夫距离

这个公式的另一种等价形式是

看不出两个公式是等价的?提示一下:试试用放缩法和夹逼法则来证明。

在python中的实现:

import numpy as np

x=np.random.random(10)

y=np.random.random(10)

#方法一:根据公式求解

d1=np.max(np.abs(x-y))

#方法二:根据scipy库求解

from scipy.spatial.distance import pdist

X=np.vstack([x,y])

d2=pdist(X,'chebyshev')

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

闵氏距离不是一种距离,而是一组距离的定义。

(1) 闵氏距离的定义

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

也可写成

其中p是一个变参数。

当p=1时,就是曼哈顿距离

当p=2时,就是欧氏距离

当p→∞时,就是切比雪夫距离

根据变参数的不同,闵氏距离可以表示一类的距离。

(2)闵氏距离的缺点

闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点。

举个例子:二维样本(身高,体重),其中身高范围是150~190,体重范围是50~60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。

简单说来,闵氏距离的缺点主要有两个:(1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。(2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

python中的实现:

import numpy as np

x=np.random.random(10)

y=np.random.random(10)

#方法一:根据公式求解,p=2

d1=np.sqrt(np.sum(np.square(x-y)))

#方法二:根据scipy库求解

from scipy.spatial.distance import pdist

X=np.vstack([x,y])

d2=pdist(X,'minkowski',p=2)

5.标准化欧氏距离(Standardized Euclidean distance )

(1)标准欧氏距离的定义

标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧。均值和方差标准化到多少呢?这里先复习点统计学知识吧,假设样本集X的均值(mean)为m,标准差(standard deviation)为s,那么X的“标准化变量”表示为:

标准化后的值 =  ( 标准化前的值  - 分量的均值 ) /分量的标准差

经过简单的推导就可以得到两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的标准化欧氏距离的公式:

如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(Weighted Euclidean distance)。

python中的实现:

import numpy as np

x=np.random.random(10)

y=np.random.random(10)

X=np.vstack([x,y])

#方法一:根据公式求解

sk=np.var(X,axis=0,ddof=1)

d1=np.sqrt(((x - y) ** 2 /sk).sum())

#方法二:根据scipy库求解

from scipy.spatial.distance import pdist

d2=pdist(X,'seuclidean')

6.马氏距离(Mahalanobis Distance)

(1)马氏距离定义

有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X到u的马氏距离表示为:

而其中向量Xi与Xj之间的马氏距离定义为:

若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了:

也就是欧氏距离了。

若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。

python 中的实现:

import numpy as np

x=np.random.random(10)

y=np.random.random(10)

#马氏距离要求样本数要大于维数,否则无法求协方差矩阵

#此处进行转置,表示10个样本,每个样本2维

X=np.vstack([x,y])

XT=X.T

#方法一:根据公式求解

S=np.cov(X) #两个维度之间协方差矩阵

SI = np.linalg.inv(S) #协方差矩阵的逆矩阵

#马氏距离计算两个样本之间的距离,此处共有10个样本,两两组合,共有45个距离。

n=XT.shape[0]

d1=[]

for i in range(0,n):

for j in range(i+1,n):

delta=XT[i]-XT[j]

d=np.sqrt(np.dot(np.dot(delta,SI),delta.T))

d1.append(d)

#方法二:根据scipy库求解

from scipy.spatial.distance import pdist

d2=pdist(XT,'mahalanobis')

马氏优缺点:

1)马氏距离的计算是建立在总体样本的基础上的,这一点可以从上述协方差矩阵的解释中可以得出,也就是说,如果拿同样的两个样本,放入两个不同的总体中,最后计算得出的两个样本间的马氏距离通常是不相同的,除非这两个总体的协方差矩阵碰巧相同;

2)在计算马氏距离过程中,要求总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧式距离计算即可。

3)还有一种情况,满足了条件总体样本数大于样本的维数,但是协方差矩阵的逆矩阵仍然不存在,比如三个样本点(3,4),(5,6)和(7,8),这种情况是因为这三个样本在其所处的二维空间平面内共线。这种情况下,也采用欧式距离计算。

4)在实际应用中“总体样本数大于样本的维数”这个条件是很容易满足的,而所有样本点出现3)中所描述的情况是很少出现的,所以在绝大多数情况下,马氏距离是可以顺利计算的,但是马氏距离的计算是不稳定的,不稳定的来源是协方差矩阵,这也是马氏距离与欧式距离的最大差异之处。

优点:它不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关;由标准化数据和中心化数据(即原始数据与均值之差)计算出的二点之间的马氏距离相同。马氏距离还可以排除变量之间的相关性的干扰。缺点:它的缺点是夸大了变化微小的变量的作用。

参考:

python定义距离_距离度量以及python实现(一)相关推荐

  1. python定义类_提升你的Python编程能力,细说类的继承,拿走不谢

    今天咱们聊点啥呢?要不还是聊点Python基础的东东吧,大家已经都知道啦,Python呢是一种面向对象的脚本编程语言,那面向对象的编程语言呢,都会支持面向对象的三大特性,你知道是哪三大特性吗?当然是咱 ...

  2. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  3. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

  4. python 定义变量_第三章(第2节):变量和常量

    变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型,比如我们上节课刚刚学过的基本数据类型或者我们后面要学的自定义数据类型. 所谓常量就是不能改变 ...

  5. python内存泄漏_诊断和修复Python中的内存泄漏

    python内存泄漏 Fugue uses Python extensively throughout the Conductor and in our support tools, due to i ...

  6. 数据结构python课后答案_数据结构与算法:Python语言描述 1~5章课后习题

    数据结构与算法:Python语言描述 1~5章课后习题 发布时间:2018-07-19 20:42, 浏览次数:1885 , 标签: Python MarkDown语法写的,不知道为啥上传到CSDN不 ...

  7. google python代码规范_如何用好python编码规范,写一手漂亮的代码

    前一段时间在编写python 代码的时候编辑器中一直在提示规范问题,因为强迫症的原因,我决定遵循python 的编码规范去编码,然后把需要注意的点记录下来, 帮助自己和大家一起成长. 这是我的main ...

  8. python opencv手册_教你用Python实现5毛钱特效(给你的视频来点料)

    一.前言 请务必看到最后.Python牛已经不是一天两天的事了,但是我开始也没想到,Python能这么牛.前段时间接触了一个批量抠图的模型库,而后在一些视频中找到灵感,觉得应该可以通过抠图的方式,给视 ...

  9. pep8 python 编码规范_如何用好python编码规范,写一手漂亮的代码

    前一段时间在编写python 代码的时候编辑器中一直在提示规范问题,因为强迫症的原因,我决定遵循python 的编码规范去编码,然后把需要注意的点记录下来, 帮助自己和大家一起成长. 这是我的main ...

  10. python了解一下_想要精通python?19个语法了解一下!

    原标题:想要精通python?19个语法了解一下! Python简单易学,但又博大精深.许多人号称精通Python,却不会写Pythonic的代码,对很多常用包的使用也并不熟悉.学海无涯,我们先来了解 ...

最新文章

  1. java登陆界面连接数据库_java 登陆界面怎么写,连接数据库后
  2. android中textcolor属性,android – EditText和TextView textColorPrimary不遵循API lt;21的主题颜色...
  3. 2.2.2 定点数的运算(移位、原码和补码的加减乘除、溢出概念和判别方法)
  4. 单例(Singleton)模式
  5. matplotlib柱状图_Python可视化很简单,一文学会绘制柱状图、条形图和直方图
  6. 开发人员最佳配色主题
  7. python数据建模工具_python数据分析工具——Pandas、StatsModels、Scikit-Learn
  8. 随机向量x的协方差阵_【科普】如何正确理解特征值与特征向量
  9. c语言统计字符个数回车字符,C语言统计一串字符中空格键、Tab键、回车键、字母、数字及其他字符的个数(Ctrl+Z终止输入)...
  10. link.exe 的参数
  11. Bex5登陆端口异常
  12. java ppt转图片 失真_java转换ppt,ppt转成图片,获取备注,获取文本
  13. casquette swagg:泉州故事
  14. 深度学习:乳腺检测abnormality detection in mammography +CAM
  15. 姓氏头像框一键制作小程序源码
  16. uniapp 引入阿里矢量图标库的详细步骤及踩坑经历
  17. 爬虫爬取音乐url大全
  18. 下列符号中 表示python中单行注释的是_下列符号中,表示Python中单行注释的是...
  19. 神奇的Redis延迟
  20. 移动浏览器内核及连接数

热门文章

  1. OpenCASCADE:环境变量
  2. boost::spirit::karma::real_generator相关的测试程序
  3. boost::spirit模块实现将由某个分隔符分隔的任意键/值对解析为 std::map的测试程序
  4. boost::safe_numerics::checked_result相关的测试程序
  5. boost::safe_numerics模块实现隐式转换更改数据值的测试程序
  6. boost::mp11::mp_none_of_q相关用法的测试程序
  7. boost::hana::any_of用法的测试程序
  8. boost::gil::channel_view用法的测试程序
  9. boost::geometry::index:containst用法的测试程序
  10. 基于Boost::beast模块的异步WebSocket服务器