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

1.曼哈顿距离

也叫城市街区距离,是两点差向量的L1范数,也就是各元素的绝对值之和。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的曼哈顿距离表示为

\[d=\sum_{i=1}^{n}{\left| x_i-y_i \right|}
\]

Python实现:

import numpy as np
from scipy.spatial import distance A = 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=\sqrt{\sum_{i=1}^{n}{\left( x_i-y_i \right)^{2}}}
\]

Python实现:

import numpy as np
from scipy.spatial import distance A = 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=max\left( \left| x_i-y_i \right| \right)
\]

Python实现:

import numpy as np
from scipy.spatial import distance A = 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=\sqrt[p]{\sum_{i=1}^{n}{\left| x_i-y_i \right|^{p}}}
\]

Python实现:

import numpy as np
from scipy.spatial import distance A = 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=\frac{1}{n}\sum_{i=1}^{n}{I\left( x_i\ne y_i \right)}
\]

其中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}
\]

Python实现:

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.余弦距离

也叫余弦相似度,是两点空间向量夹角的余弦值,是内积与模积的比值,用来衡量两向量间的差异程度。A(x1,x2,…,xn)和B(y1,y2,…,yn)之间的余弦距离表示为

\[\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}\]

Python实现:

import numpy as np
from scipy.spatial import distance A = 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.

常见距离计算的Python实现的更多相关文章

  1. [转] MachingLearning中的距离相似性计算以及python实现

    参考:https://blog.csdn.net/gamer_gyt/article/details/75165842#t16  https://blog.csdn.net/ymlgrss/artic ...

  2. 【Python学习】指定两点地理位置经纬度的距离计算

    指定两点地理位置经纬度的距离计算 #coding=utf-8 from math import * # input Lat_A 纬度A # input Lng_A 经度A # input Lat_B ...

  3. 相似度与距离计算python代码实现

    #定义几种距离计算函数 #更高效的方式为把得分向量化之后使用scipy中定义的distance方法 from math import sqrt def euclidean_dis(rating1, r ...

  4. Python地理位置信息库geopy的使用(二):根据中心点坐标,方向,距离计算坐标

    上一篇文章我们介绍了geopy的基本使用,这一篇文章我们根据中心点坐标,方向,距中心点距离计算出对应的坐标点,这种用法官网并没有给出详细的文档,我们这里做一下说明 生成坐标点的具体方法 import ...

  5. 概率分布之间的距离度量以及python实现(四)

    1.f 散度(f-divergence) KL-divergence 的坏处在于它是无界的.事实上KL-divergence 属于更广泛的 f-divergence 中的一种. 如果P和Q被定义成空间 ...

  6. Scipy教程 - 距离计算库scipy.spatial.distance

    http://blog.csdn.net/pipisorry/article/details/48814183 在scipy.spatial中最重要的模块应该就是距离计算模块distance了. fr ...

  7. 距离度量以及python实现(一)

    1. 欧氏距离(Euclidean Distance)        欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式. (1)二维平面上两点a(x1,y1)与b(x2,y2)间 ...

  8. 概率分布之间的距离度量以及python实现

    1. 欧氏距离(Euclidean Distance)       欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式.(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧 ...

  9. Anaconda 用于科学计算的 Python 发行版

    用于科学计算的 Python 发行版: 1.Anaconda  https://www.continuum.io/    公司continuum.  有商业版本. Anaconda is the le ...

  10. 多目标遗传算法 ------ NSGA-II (部分源码解析) 拥挤距离计算 crowddist.c

    /* Crowding distance computation routines */ # include <stdio.h> # include <stdlib.h> # ...

随机推荐

  1. opensips使用drouting进行路由

    操作系统 :CentOS 7.6_x64 opensips版本:2.4.9 drouting是Dynamic Routing(动态路由)的缩写,该模块可为特定呼叫选择(基于多个条件)最佳网关.今天整理 ...

  2. vue 插件(swiper)使用

    两种方法: 1... 打开https://www.swiper.com.cn/download/index.html 下载css,js... 把js,css引入public里面的index.html文 ...

  3. 力扣1112(MySQL)-每位学生的最高成绩(中等)

    题目: 表:Enrollments (student_id, course_id) 是该表的主键. 问题编写一个 SQL 查询,查询每位学生获得的最高成绩和它所对应的科目,若科目成绩并列,取 cour ...

  4. 力扣1069(MySQL)-产品分析Ⅱ(简单)

    题目: 编写一个 SQL 查询,按产品 id product_id 来统计每个产品的销售总量. 查询结果格式如下面例子所示:  解题思路: 没有用到product表,直接在sales表中使用聚合函数: ...

  5. 力扣605(java&python)-种花问题(简单)

    题目: 假设有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给你一个整数数组  flowerbed 表示花坛,由若干 0 和 1 ...

  6. Apache ShenYu 网关正式支持 Dubbo3 服务代理

    简介: 本文介绍了如何通过 Apache ShenYu 网关访问 Dubbo 服务,主要内容包括从简单示例到核心调用流程分析,并对设计原理进行了总结. 作者:刘良 Apache Dubbo 在去年发布 ...

  7. 涨姿势 | 一文读懂备受大厂青睐的ClickHouse高性能列存核心原理

    简介: 本文尝试解读ClickHouse存储层的设计与实现,剖析它的性能奥妙 作者:和君 引言 ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析(OLAP)领域.目前国内各个大厂 ...

  8. 2019-2-27-VisualStudio-插件-翻译注释

    title author date CreateTime categories VisualStudio 插件 翻译注释 lindexi 2019-02-27 15:50:33 +0800 2019- ...

  9. k8s七层代理Ingress-nginx-controller

    一.Ingress与Ingress Controller概述 1.1 回顾service四层代理 在 k8s 中为什么要做负载均衡? Pod 漂移问题,可以理解成 Pod IP 是变化的 Kubern ...

  10. C语言的指针不能与数组之前的内存进行比较

    标准允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,但是不允许与指向数组第一个元素之前的那个内存位置的指针进行比较. 案例一 #define DATAMAX 5 int ...