1. 数学问题

这篇文章主要介绍三个数学中比较常见的距离问题

  • 曼哈顿距离
  • 欧几里得距离
  • 明氏距离

2.1 曼哈顿距离

出租车几何或曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。

即d(i,j)=|xi-xj|+|yi-yj|

2.2 欧几里得距离

在数学中,欧几里得距离欧几里得度量(Euclidean Distance)是欧几里得空间中两点间“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。较早的文献称之为毕达哥拉斯度量

其公式如下:

2.3 明氏距离

明氏距离又叫做明可夫斯基距离(Minkowski Distance),是欧氏空间中的一种测度,被看做是欧氏距离和曼哈顿距离的一种推广。明氏距离不是一种距离,而是一组距离的定义,是对多个距离度量公式的概括性的表述。

两点

Minkowski-Distance01

之间的明氏距离公式为:

Minkowski-Distance02

其中p是一个变参数:

  • 当p=1时,就是曼哈顿距离;
  • 当p=2时,就是欧氏距离;
  • 当p→∞时,就是切比雪夫距离。

3. 项目代码

# -*- coding: utf-8 -*-
"""
Created on Sat Jul 27 21:59:54 2019

@author:  jlblog.tech
"""

import math

print("-"*11)
a=1
b=2
c=10
d=20

#math.fabs(x) Return the absolute value of x.
manhattan=math.fabs(a-c)+math.fabs(b-d)
euclidean=pow(pow(math.fabs(a-c),2)+pow(math.fabs(b-d),2),1/2)

minkowski=pow(pow(math.fabs(a-c),3)+pow(math.fabs(b-d),3),1/3)

print("a =",a,"b =",b)
print("c =",c,"d =",d)
print("Manhattan Distance =",round(manhattan,2))
print("Euclidean Distance =",round(euclidean,2))
print("Minkowski Distance =",round(minkowski,2))

print("-"*11)

P=[1,2]
Q=[10,20]

manhattan=math.fabs(P[0]-Q[0])+math.fabs(P[1]-Q[1])
euclidean=pow(pow(math.fabs(P[0]-Q[0]),2)+pow(math.fabs(P[1]-Q[1]),2),1/2)
minkowski=pow(pow(math.fabs(P[0]-Q[0]),3)+pow(math.fabs(P[1]-Q[1]),3),1/3)

print ("P =",P)
print ("Q =",Q)
print("Manhattan Distance =",round(manhattan,2))
print("Euclidean Distance =",round(euclidean,2))
print("Minkowski Distance =",round(minkowski,2))
print("-"*11)

4. 运行结果

Math Distance Result

5. 知识点

math.fabs(x )返回x的绝对值。