欧氏距离、曼哈顿距离与切比雪夫距离详解

1. 前言

在数学、机器学习和数据科学中,距离度量是衡量两个向量之间差异程度的核心工具。不同的距离定义适用于不同的场景,合理选择距离度量能直接影响模型的性能与结果的准确性。

本文将详细介绍三种最基础也是最常用的距离度量——欧氏距离曼哈顿距离切比雪夫距离,涵盖定义、公式、二维示意图、代码实现及实际应用场景。

2. 通用定义:Lp 范数与闵可夫斯基距离

三种距离可以被统一在闵可夫斯基距离(Minkowski Distance)的框架下:

$$
D_p(x, y) = \left( \sum_{i=1}^{n} |x_i - y_i|^p \right)^{1/p}
$$

其中:

  • $n$ 为空间的维度;
  • $p$ 是一个参数,决定了距离的类型;
  • 当 $p = 1$ 时为曼哈顿距离;
  • 当 $p = 2$ 时为欧氏距离;
  • 当 $p \to \infty$ 时为切比雪夫距离。

理解这一统一关系后,下面分别展开讨论每种距离。

3. 欧氏距离(Euclidean Distance)

3.1 定义

欧氏距离是日常生活中最直观的”直线距离”——连接两点之间的最短线段长度。

3.2 公式

对于 $n$ 维空间中的两点 $x = (x_1, x_2, \dots, x_n)$ 和 $y = (y_1, y_2, \dots, y_n)$,欧氏距离定义为:

$$
d_{\text{euclidean}}(x, y) = \sqrt{(x_1 - y_1)^2 + (x_2 - y_2)^2 + \dots + (x_n - y_n)^2}
$$

即:

$$
d_{\text{euclidean}}(x, y) = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2}
$$

3.3 二维示例

二维平面上点 $A(1, 1)$ 和点 $B(4, 5)$:

$$
d = \sqrt{(4-1)^2 + (5-1)^2} = \sqrt{9 + 16} = \sqrt{25} = 5
$$

3.4 几何意义

欧氏距离对应直角三角形斜边的长度,本质是勾股定理在高维空间的推广。

3.5 Python 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import math

def euclidean_distance(x: list[float], y: list[float]) -> float:
"""计算两个向量之间的欧氏距离"""
if len(x) != len(y):
raise ValueError("向量维度必须一致")
return math.sqrt(sum((xi - yi) ** 2 for xi, yi in zip(x, y)))

# 示例
a = [1, 1]
b = [4, 5]
print(euclidean_distance(a, b)) # 输出: 5.0

# 使用 numpy
import numpy as np
print(np.linalg.norm(np.array(a) - np.array(b))) # 输出: 5.0

3.6 应用场景

  • K-Means 聚类:默认使用欧氏距离作为样本与聚类中心的相似度度量;
  • KNN 算法:最常用的距离度量方式;
  • 三维空间物理距离计算:地理坐标、计算机视觉中的点云配准。

4. 曼哈顿距离(Manhattan Distance)

4.1 定义

曼哈顿距离又称城市街区距离(City Block Distance)或 L1 距离,度量的是两点在各个坐标轴方向上的绝对差值之和。名称源于曼哈顿的棋盘式街道布局——车辆只能沿垂直或水平方向行驶,无法直接穿越大楼走直线。

4.2 公式

对于 $n$ 维空间中的两点 $x$ 和 $y$:

$$
d_{\text{manhattan}}(x, y) = |x_1 - y_1| + |x_2 - y_2| + \dots + |x_n - y_n|
$$

即:

$$
d_{\text{manhattan}}(x, y) = \sum_{i=1}^{n} |x_i - y_i|
$$

4.3 二维示例

二维平面上点 $A(1, 1)$ 和点 $B(4, 5)$:

$$
d = |4-1| + |5-1| = 3 + 4 = 7
$$

与欧氏距离(等于 5)相比,曼哈顿距离更大——因为曼哈顿距离走的是”直角折线”,而非直线。

4.4 几何意义

在二维网格中,曼哈顿距离等于从起点到终点所经过的最短网格路径长度(只能沿横轴或纵轴移动)。

4.5 Python 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def manhattan_distance(x: list[float], y: list[float]) -> float:
"""计算两个向量之间的曼哈顿距离"""
if len(x) != len(y):
raise ValueError("向量维度必须一致")
return sum(abs(xi - yi) for xi, yi in zip(x, y))

# 示例
a = [1, 1]
b = [4, 5]
print(manhattan_distance(a, b)) # 输出: 7

# 使用 numpy
import numpy as np
print(np.sum(np.abs(np.array(a) - np.array(b)))) # 输出: 7

4.6 应用场景

  • L1 正则化(Lasso 回归):L1 范数作为惩罚项,可产生稀疏权重向量;
  • 八数码问题/拼图游戏:使用曼哈顿距离作为启发式函数计算 A* 搜索的估算代价;
  • 图像处理:计算像素差异的绝对误差和(SAD)。

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

5.1 定义

切比雪夫距离又称棋盘距离,定义为两点在各坐标轴上坐标差绝对值的最大值。在国际象棋中,国王每次可以向任意方向(横、竖、斜)移动一格,从一格走到另一格所需的最少步数即为切比雪夫距离。

5.2 公式

对于 $n$ 维空间中的两点 $x$ 和 $y$:

$$
d_{\text{chebyshev}}(x, y) = \max_{i} , |x_i - y_i|
$$

展开为:

$$
d_{\text{chebyshev}}(x, y) = \max(|x_1 - y_1|, |x_2 - y_2|, \dots, |x_n - y_n|)
$$

5.3 二维示例

二维平面上点 $A(1, 1)$ 和点 $B(4, 5)$:

$$
d = \max(|4-1|, |5-1|) = \max(3, 4) = 4
$$

5.4 几何意义

在二维棋盘格上,切比雪夫距离代表国王从一格走到另一格所需的最少步数——因为国王可以沿对角线移动,所以步数取决于两个坐标差中较大的那个。

5.5 Python 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def chebyshev_distance(x: list[float], y: list[float]) -> float:
"""计算两个向量之间的切比雪夫距离"""
if len(x) != len(y):
raise ValueError("向量维度必须一致")
return max(abs(xi - yi) for xi, yi in zip(x, y))

# 示例
a = [1, 1]
b = [4, 5]
print(chebyshev_distance(a, b)) # 输出: 4

# 使用 numpy
import numpy as np
print(np.max(np.abs(np.array(a) - np.array(b)))) # 输出: 4

5.6 应用场景

  • 棋盘游戏 AI:评估棋盘上两棋子间所需最少步数;
  • 仓库机器人路径规划:在允许斜向移动的网格环境中计算最短步数;
  • 极大值优化问题:Tchebycheff 标量化方法在多目标优化中用于近似 Pareto 前沿。

6. 三种距离对比

6.1 同一示例对比

设 $A(1, 1)$,$B(4, 5)$:

距离类型 计算结果 含义
欧氏距离 $5$ 直线最短路径
曼哈顿距离 $7$ 仅横/纵移动的路径
切比雪夫距离 $4$ 允许斜向移动的最短步数

三者大小关系:切比雪夫距离 ≤ 欧氏距离 ≤ 曼哈顿距离(当 $p$ 增大时,Lp 距离单调递减或不变)。

6.2 等高线(等距线)对比

以原点为中心的单位等距线(二维空间):

  • 欧氏距离:圆形($x_1^2 + x_2^2 = 1$)
  • 曼哈顿距离:菱形($|x_1| + |x_2| = 1$)
  • 切比雪夫距离:正方形($\max(|x_1|, |x_2|) = 1$)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import numpy as np
import matplotlib.pyplot as plt

def plot_distance_contours():
"""绘制三种距离的等距线"""
# 生成网格点
pts = np.linspace(-1.5, 1.5, 300)
x1, x2 = np.meshgrid(pts, pts)

# 计算三种距离
euc = np.sqrt(x1**2 + x2**2)
man = np.abs(x1) + np.abs(x2)
che = np.maximum(np.abs(x1), np.abs(x2))

fig, axes = plt.subplots(1, 3, figsize=(14, 4.5))

titles = ['欧氏距离 (p=2)', '曼哈顿距离 (p=1)', '切比雪夫距离 (p=∞)']
data = [euc, man, che]

for ax, dist, title in zip(axes, data, titles):
ax.contourf(x1, x2, dist, levels=20, cmap='Blues', alpha=0.6)
ax.contour(x1, x2, dist, levels=[1], colors='red', linewidths=2)
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)
ax.set_aspect('equal')
ax.set_title(title)
ax.set_xlabel('x1')
ax.set_ylabel('x2')

plt.tight_layout()
plt.savefig('distance_contours.png', dpi=150)
plt.show()

# plot_distance_contours() # 取消注释以运行

图中红色粗线代表距离等于 1 的等距线,可以直观看到欧氏距离为圆形、曼哈顿距离为菱形、切比雪夫距离为正方形。

6.3 选择指南

场景 推荐距离 原因
连续特征、无异常值 欧氏距离 符合几何直觉
高维稀疏数据 曼哈顿距离 对高维空间中的”距离集中”现象更鲁棒
各维度尺度一致、网格路径 切比雪夫距离 仅关心最大差值
异常值敏感场景 曼哈顿距离 L1 对大偏差的惩罚比 L2 小

7. 小结

  • 欧氏距离、曼哈顿距离和切比雪夫距离是闵可夫斯基距离在 $p = 2$、$p = 1$ 和 $p \to \infty$ 时的特例;
  • 欧氏距离是最常用的直线距离,适合低维连续特征;
  • 曼哈顿距离对异常值更鲁棒,适合高维稀疏数据;
  • 切比雪夫距离仅关心各维度差异的最大值,适合棋盘类问题;
  • 实际应用中应根据数据特征和业务需求选择合适的距离度量。