跳至主要内容

什么是曼哈顿距离?

学习如何用 Python 和 R 计算并应用曼哈顿距离,并探索其在机器学习和路径规划中的用法。
· 8分钟 阅读

使用 AI 探索

距离度量是衡量空间中对象或点之间相隔多远的基本工具。这些度量在诸多领域发挥着重要作用,包括机器学习、机器人技术和地理信息系统。通过量化距离,我们可以完成诸如模式识别、数据聚类和空间分析等任务,这些任务对商业机构和研究人员都同样重要。 

曼哈顿距离(Manhattan distance),也称为 L1 距离或出租车距离(taxicab distance),在网格路径或多维空间中计算点与点之间的距离时尤为实用。本文将同时介绍其数学基础,并展示如何在 Python 与 R 中实现曼哈顿距离。 

Manhattan distance image by Dall-E."曼哈顿距离。" 图片由 Dall-E 提供。

请记住,曼哈顿距离只是更广泛“距离度量”主题的一部分,这一主题在各个领域中反复出现。若您希望精通基于距离的学习,可根据偏好的语言选择我们的 Designing Machine Learning Workflows in Python 课程或 Cluster Analysis in R 课程。 

曼哈顿距离的定义

曼哈顿距离是一种用于确定网格路径中两点距离的度量。不同于欧几里得距离(两点之间的最短直线),曼哈顿距离是各坐标之间绝对差的和。之所以称为“曼哈顿距离”,是因为它像出租车在曼哈顿的网格街道中行驶一样,只能沿着网格线移动。 

从数学上讲,n 维空间中两点的曼哈顿距离等于它们笛卡尔坐标的绝对差之和。 

Manhattan distance formulas for 2-dimensional and three-dimensional vectors

曼哈顿距离公式包含绝对值函数,它将任何负的差值转换为正值。这一点对距离计算至关重要,因为它确保所有距离均为非负,真实反映与行进方向无关的标量距离。

曼哈顿距离的计算与可视化

如前所述,曼哈顿距离通过对两点对应坐标的绝对差求和得到。下面以 2D 与 3D 空间为例进行说明。

二维示例

考虑两点:A(1, 1) 和 B(4, 5):

  1. 计算 |x₁ - x₂| = |1 - 4| = 3
  2. 计算 |y₁ - y₂| = |1 - 5| = 4
  3. 求和:3 + 4 = 7

因此,A 和 B 之间的曼哈顿距离为 7 个单位。 

Manhattan distance of two vectors两个向量的曼哈顿距离。图片作者自制。

在这个二维网格中,您可以看到曼哈顿距离遵循出租车行驶的路径,只通过水平与垂直移动从点 A 到达点 B。

三维示例

现在考虑三维空间中的两点:A(1, 2, 3) 和 B(4, 5, 6):

  1. 计算 |x₁ - x₂| = |1 - 4| = 3
  2. 计算 |y₁ - y₂| = |2 - 5| = 3
  3. 计算 |z₁ - z₂| = |3 - 6| = 3
  4. 求和:3 + 3 + 3 = 9

这两个三维点之间的曼哈顿距离为 9 个单位。

与欧几里得距离的比较

曼哈顿距离沿网格线度量路径;而欧几里得距离度量两点之间的直线距离,也就是常说的“鸟飞直线距离”。 

针对我们的二维示例:

  • 曼哈顿距离:7 个单位
  • 欧几里得距离:√((1-4)² + (1-5)²) = 5 个单位

下面是曼哈顿距离与欧几里得距离的可视化对比: 

Comparing Manhattan distance and Euclidian distance of two vectors on a Cartesian coordinate plane曼哈顿距离 vs. 欧几里得距离。图片作者自制。

在欧几里得空间中,欧几里得距离总是小于或等于曼哈顿距离。 

在曼哈顿与欧几里得距离之间进行选择

在以下情境中,曼哈顿距离尤其有用:

  1. 移动受限于网格路径(如城市街区、电路板布局)。
  2. 不允许对角线移动,或对角线移动代价更高。
  3. 在机器学习中处理高维数据时,相比欧几里得距离可能在计算上更高效。
  4. 分析离散或有序数据的差异。

相反,在以下情境中欧几里得距离更合适:

  1. 在开阔空间中测量物理距离。
  2. 处理连续数据且对角线移动同样有效。

曼哈顿距离的应用

曼哈顿距离在计算机科学、数据分析与地理空间技术等多个领域都有应用。以下是其尤为有用的一些关键方向。

路径搜索算法(如 A* 算法) 

在基于网格的环境中,曼哈顿距离可作为快速有效的启发式,用于估计两点之间的距离。它在 A* 算法中尤为实用,当移动仅限于水平和垂直方向时,可更高效地引导搜索朝向目标。典型场景包括城市道路路径规划、迷宫求解算法以及某些类型的电子游戏 AI 路径规划。 

聚类技术(如 K-Means 聚类) 

曼哈顿距离可作为聚类算法的距离度量,尤其在处理高维数据时。在 K-Means 聚类中,用曼哈顿距离替代欧几里得距离有时能得到更好的结果,尤其在处理稀疏的高维数据或存在离群点时。此外,由于其在稀疏向量空间中的有效性,它常用于文本分类和文档聚类。曼哈顿距离对单个维度极端值的较低敏感性,在某些数据集上可带来更为均衡的聚类结果。

图像识别 

曼哈顿距离可用于比较像素值或特征向量。在模板匹配中(即在大图中查找小图的出现位置)尤为有用。它也适用于人脸识别系统、视频流中的目标检测或大型图像数据库中的模式匹配等场景,此时速度至关重要,相较欧几里得距离略有的精度损失通常可以忽略。

离群点检测 

与欧几里得距离相比,曼哈顿距离对单个维度极端值的敏感性更低,因此可用于识别数据集中与其他点显著不同的数据点。这一特性使其适用于异常检测系统,如欺诈检测或网络安全。在金融系统中,例如,曼哈顿距离可以帮助识别异常交易模式,而不会过度受某一单一属性极端值的影响,从而有望减少误判。

地理信息系统(GIS) 

在 GIS 应用中,曼哈顿距离可对沿网格化街道网络的移动进行建模,因此在城市规划与物流中颇为实用。它用于选址-分配问题,例如在城市中基于最小化总出行距离来确定设施的最优位置。曼哈顿距离也可应用于空间分析任务,如围绕道路或河流等线性要素创建缓冲区。城市规划人员可以用它分析公共服务的可达性,而物流公司则可借助它优化城市配送路线。

曼哈顿距离的数学性质

曼哈顿距离具备若干重要的数学性质,使其尤为实用。下面我们探讨两个关键方面:其度量空间性质以及对离群点的鲁棒性。

度量空间性质

曼哈顿距离是一个真正的度量,这意味着它满足度量空间中距离函数所需的四个条件:

  1. 非负性: 任意两点之间的距离总是非负。对所有 x 与 y,d(x, y) ≥ 0。
  2. 同一性: 一点与其自身的距离为零;若两点之间的距离为零,则两点相同。d(x, y) = 0 当且仅当 x = y。
  3. 对称性: 从点 A 到点 B 的距离与从 B 到 A 的距离相同。对所有 x 与 y,d(x, y) = d(y, x)。
  4. 三角不等式: 任意两点之间的距离不大于它们分别与第三点的距离之和。对所有 x、y、z,d(x, z) ≤ d(x, y) + d(y, z)。

不同于不满足三角不等式的余弦距离,曼哈顿距离满足上述所有性质,因此在多种数学与计算应用中都很有用。例如:

  • 在优化算法中,三角不等式可用于高效裁剪搜索空间。
  • 在如度量树等数据结构中,这些性质可加速最近邻搜索。
  • 在机器学习中,依赖距离度量的算法(如 k 近邻)可借助这些性质获得理论保证与高效实现。

增强的离群点区分能力 

相比将差值平方的欧几里得距离,采用线性求和的曼哈顿距离在区分离群点方面往往更具优势。原因在于曼哈顿距离对各维度的绝对差分别累加,从而降低了某一单一维度上巨大差异的压倒性影响。

考虑二维空间中的两点:A(0, 0) 与 B(10, 0)。现在引入一个离群点 C,其坐标为 (0, 100):

  • A 与 C 的曼哈顿距离:|0 - 0| + |0 - 100| = 100
  • A 与 C 的欧几里得距离:√((0 - 0)² + (0 - 100)²) = 100
  • B 与 C 的曼哈顿距离:|10 - 0| + |0 - 100| = 110
  • B 与 C 的欧几里得距离:√((10 - 0)² + (0 - 100)²) ≈ 100.5

Illustration of the Manhattan vs Euclidean distances between points含离群点时的曼哈顿距离与欧几里得距离。图片作者自制

在该示例中,曼哈顿距离能清晰地区分 AC 与 BC 的距离,而欧几里得距离由于 y 坐标离群值的主导效应,显示两者几乎相同。

这一特性使曼哈顿距离在以下场景中尤为有用:

  1. 高维空间中离群点常见的任务,如图像处理或文本分析。
  2. 希望降低离群点对聚类中心影响的聚类算法。
  3. 希望识别离群点且不过度放大其重要性的异常检测系统。

通过对单个维度的极端值不那么敏感,曼哈顿距离可在许多真实世界数据集中提供更为均衡的不相似度量,尤其是在数据嘈杂或不完美的情况下。

Python 与 R 中的曼哈顿距离

本节我们将探索如何使用 Python 与 R 计算曼哈顿距离。每个示例都会展示不同的方法,从自定义函数到库方法。

Python 示例

Python 提供多种方式计算曼哈顿距离。下面介绍两种方法。

1. 使用 NumPy 数组计算:

import numpy as np
point_a_np = np.array([1, 1, 1])
point_b_np = np.array([4, 5, 6])
distance_numpy = np.sum(np.abs(point_a_np - point_b_np))
print(f"Manhattan distance (NumPy): {distance_numpy}")

输出: 

Manhattan distance (NumPy): 12

该方法直接使用 NumPy 数组,效率很高,尤其适用于处理大型数据集,或当您在分析中已使用 NumPy 时。

2. 使用 SciPy 的 cityblock() 函数计算: 

from scipy.spatial.distance import cityblock
point_a = (1, 1, 1)
point_b = (4, 5, 6)
distance_scipy = cityblock(point_a, point_b)
print(f"Manhattan distance (SciPy): {distance_scipy}")

输出:

Manhattan distance (SciPy): 12

SciPy 提供了 cityblock() 函数用于计算曼哈顿距离。该方法简洁高效,特别适合在项目中使用 SciPy 时。 

R 示例

R 同样提供多种方式计算曼哈顿距离。下面介绍两种方法。

1. 自定义函数

manhattan_distance <- function(x1, y1, x2, y2) {
  abs(x1 - x2) + abs(y1 - y2)
}
# Example points 
point1 <- c(3, 5) # (x1, y1) 
point2 <- c(1, 9) # (x2, y2) 
# Calculate Manhattan distance between point1 and point2 
distance <- manhattan_distance(point1[1], point1[2], point2[1], point2[2]) 
print(paste("Manhattan distance (custom function):", distance))

输出:

"Manhattan distance (custom function): 6"

在此示例中,我们创建了名为 manhattan_distance 的自定义函数。它将两点的坐标作为输入,通过对各自坐标的绝对差求和来得到曼哈顿距离。

2. 使用 stats 库

point_a <- c(1, 1, 1)
point_b <- c(4, 5, 6)
distance_builtin <- stats::dist(rbind(point_a, point_b), method = "manhattan")
print(paste("Manhattan distance:", distance_builtin))

输出: 

"Manhattan distance: 12"

在第二个示例中,我们使用 stats 包中的 dist() 函数来计算曼哈顿距离。该方法在处理矩阵或多个点时尤其方便,可显著简化流程。

结语

曼哈顿距离的重要性在于其简洁性、计算效率以及在某些情境下对离群点的鲁棒性。不同于欧几里得距离,曼哈顿距离在基于网格的系统中常常更直观,且在高维空间中计算更为高效。 

此外,曼哈顿距离和其他距离度量广泛存在于各种场景中。除了我们的 Designing Machine Learning Workflows in Python 课程(其中包含基于距离学习的一章)与 Cluster Analysis in R 课程(使用基于距离的度量进行分类与降维),您还可以查看我们的 Anomaly Detection in Python 课程,该课程使用距离度量进行离群点检测与特征缩放。  

请记住,距离度量的选择会显著影响算法的性能与结果。通过理解何时以及如何使用曼哈顿距离,您就为自己的数据科学工具箱增添了一件强有力的工具。继续实验、学习,并不断拓展基于距离的算法可能性吧!

Vinod Chugani

作者

Vinod Chugani

Vinod Chugani 的职业生涯始于东京,曾任摩根大通最年轻的对冲基金销售台负责人,随后在雷曼兄弟创下个人销售纪录,之后又打造了覆盖 30 个国家的电子分销业务,营收突破 1 亿新元,随后转向数据领域。他毕业于杜克大学经济学专业,亦为 NYC Data Science Academy 校友,并在 100 多名申请者中成为Hugo Bowne-Anderson 在 Maven 开设的 “Building AI Applications” 课程的三位奖学金获得者之一。目前,他为 DataCamp、KDnuggets、Machine Learning Mastery 和 Statology 撰稿,内容涵盖从统计学到代理式 AI 等主题,并在 NYC Data Science Academy 指导数据从业者,已完成超过 1,000 场一对一辅导。

 

常见问题解答

曼哈顿距离与欧几里得距离有何不同?

曼哈顿距离沿网格线(如城市街区)衡量路径,而欧几里得距离衡量两点之间的直线距离。在基于网格的系统或高维数据中,曼哈顿距离通常更合适;在开阔空间或连续数据中,欧几里得距离更为适用。

为什么曼哈顿距离被称为“出租车距离”?

之所以称为“出租车距离(taxicab distance)”,是因为它表示在网格状城市(如曼哈顿)中出租车行驶的距离,路线仅由水平和垂直路段组成。

相比其他距离度量,使用曼哈顿距离有哪些优势?

曼哈顿距离计算高效、在高维空间中对离群点不那么敏感,且在基于网格的系统中常常更直观。它也是一个真正的度量,满足度量空间中距离函数的四个条件。

曼哈顿距离可以用于机器学习中的聚类吗?

可以。曼哈顿距离可用于如 K-means 等聚类算法,尤其在处理高维或稀疏数据时。在这些场景下,与欧几里得距离相比,它有时能产生更稳健的结果。

曼哈顿距离能用于带有负坐标值的情况吗?

可以。曼哈顿距离可用于含负坐标的情况。其公式采用绝对值,因此适用于任意实数(正或负)。

主题