文章目录
曼哈顿距离(Manhattan Distance),又称为L1距离或城市街区距离,是一种常用的几何度量方法,尤其在路径规划、图像处理和机器学习中广泛应用。本文将深入探讨曼哈顿距离的定义、特点、与欧几里得距离的比较,并通过Python代码示例展示其计算方法。希望通过这篇文章,你能全面了解曼哈顿距离的概念及其在实际中的应用。
一、曼哈顿距离的定义与特点
1. 什么是曼哈顿距离?
曼哈顿距离是在一个直角坐标系中,从一个点到另一个点的绝对轴距之和。其得名来源于美国曼哈顿区的街道布局,因为在那里街道成网格状,人们行走时通常只能沿着水平或垂直方向行走。
2. 公式表达
对于在二维平面上的两个点
P
(
x
1
,
y
1
)
\mathbf{P}(x_1, y_1)
P(x1,y1) 和
Q
(
x
2
,
y
2
)
\mathbf{Q}(x_2, y_2)
Q(x2,y2),曼哈顿距离的计算公式为:
D
Manhattan
=
∣
x
1
−
x
2
∣
+
∣
y
1
−
y
2
∣
D_{\text{Manhattan}} = \left| x_1 - x_2 \right| + \left| y_1 - y_2 \right|
DManhattan=∣x1−x2∣+∣y1−y2∣
在三维空间中,如果点
P
\mathbf{P}
P 和
Q
\mathbf{Q}
Q 的坐标分别为
(
x
1
,
y
1
,
z
1
)
\mathbf{(x_1, y_1, z_1)}
(x1,y1,z1) 和
(
x
2
,
y
2
,
z
2
)
\mathbf{(x_2, y_2, z_2)}
(x2,y2,z2),则曼哈顿距离的公式扩展为:
D
Manhattan
=
∣
x
1
−
x
2
∣
+
∣
y
1
−
y
2
∣
+
∣
z
1
−
z
2
∣
D_{\text{Manhattan}} = \left| x_1 - x_2 \right| + \left| y_1 - y_2 \right| + \left| z_1 - z_2 \right|
DManhattan=∣x1−x2∣+∣y1−y2∣+∣z1−z2∣
3. 曼哈顿距离的特点
- 易计算:由于只需计算坐标差的绝对值之和,因此计算简单快速。
- 适用于网格环境:在城市交通规划、机器人路径规划等场景中表现出色,因为这些场景中通常只能沿着水平或垂直方向移动。
- 不同于欧几里得距离:曼哈顿距离与欧几里得距离(直线距离)不同,后者是两点之间的最短直线距离。
二、曼哈顿距离与欧几里得距离的比较
1. 欧几里得距离的定义与公式
欧几里得距离(Euclidean Distance)是最常用的距离度量之一,表示两个点之间的直线距离。其公式为:
D
Euclidean
=
(
x
1
−
x
2
)
2
+
(
y
1
−
y
2
)
2
D_{\text{Euclidean}} = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}
DEuclidean=(x1−x2)2+(y1−y2)2
在三维空间中,公式为:
D
Euclidean
=
(
x
1
−
x
2
)
2
+
(
y
1
−
y
2
)
2
+
(
z
1
−
z
2
)
2
D_{\text{Euclidean}} = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2 + (z_1 - z_2)^2}
DEuclidean=(x1−x2)2+(y1−y2)2+(z1−z2)2
2. 比较
- 计算复杂度:欧几里得距离涉及平方和开方运算,计算复杂度略高于曼哈顿距离。
- 适用场景:曼哈顿距离更适合网格环境,而欧几里得距离适用于连续空间。
- 距离值:对于相同的两个点,曼哈顿距离一般大于或等于欧几里得距离,且在坐标轴对齐时二者相等。
三、曼哈顿距离的实际应用
- 路径规划
在城市交通规划和机器人路径规划中,曼哈顿距离可以用来估计从起点到终点的最短路径长度,特别是在只能沿着水平或垂直方向移动的情况下。
- 图像处理
在图像处理中,曼哈顿距离用于测量像素之间的差异,例如在图像分割和模式识别中。
- 机器学习
在机器学习中,曼哈顿距离常用于最近邻算法(k-NN)和聚类算法(如k-means)中,用以衡量样本之间的相似性。
四、Python代码实现
下面是使用Python计算曼哈顿距离的代码示例。我们将分别实现二维和三维空间中的曼哈顿距离计算。
1. 二维空间中的曼哈顿距离
def manhattan_distance_2d(point1, point2):
"""
计算二维空间中两个点的曼哈顿距离
参数:
point1, point2 -- 分别是两个点的坐标,格式为 (x, y)
返回值:
曼哈顿距离
"""
x1, y1 = point1
x2, y2 = point2
return abs(x1 - x2) + abs(y1 - y2)
# 示例
point1 = (1, 2)
point2 = (4, 6)
distance = manhattan_distance_2d(point1, point2)
print(f"二维空间中点 {point1} 和点 {point2} 的曼哈顿距离是 {distance}")
2. 三维空间中的曼哈顿距离
def manhattan_distance_3d(point1, point2):
"""
计算三维空间中两个点的曼哈顿距离
参数:
point1, point2 -- 分别是两个点的坐标,格式为 (x, y, z)
返回值:
曼哈顿距离
"""
x1, y1, z1 = point1
x2, y2, z2 = point2
return abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2)
# 示例
point1 = (1, 2, 3)
point2 = (4, 6, 8)
distance = manhattan_distance_3d(point1, point2)
print(f"三维空间中点 {point1} 和点 {point2} 的曼哈顿距离是 {distance}")
五、总结
曼哈顿距离作为一种简单且有效的距离度量方法,广泛应用于路径规划、图像处理和机器学习等领域。通过本文的详细介绍,你应该对曼哈顿距离的定义、特点及其与欧几里得距离的比较有了深入的理解。同时,通过Python代码示例,你可以轻松实现曼哈顿距离的计算,进一步应用到实际项目中。希望本文能为你提供有价值的参考,助你在相关领域取得更大的进步。
推荐我的相关专栏: