距离度量是衡量空间中对象或点之间相隔多远的基本工具。这些度量在诸多领域发挥着重要作用,包括机器学习、机器人技术和地理信息系统。通过量化距离,我们可以完成诸如模式识别、数据聚类和空间分析等任务,这些任务对商业机构和研究人员都同样重要。
曼哈顿距离(Manhattan distance),也称为 L1 距离或出租车距离(taxicab distance),在网格路径或多维空间中计算点与点之间的距离时尤为实用。本文将同时介绍其数学基础,并展示如何在 Python 与 R 中实现曼哈顿距离。
"曼哈顿距离。" 图片由 Dall-E 提供。
请记住,曼哈顿距离只是更广泛“距离度量”主题的一部分,这一主题在各个领域中反复出现。若您希望精通基于距离的学习,可根据偏好的语言选择我们的 Designing Machine Learning Workflows in Python 课程或 Cluster Analysis in R 课程。
曼哈顿距离的定义
曼哈顿距离是一种用于确定网格路径中两点距离的度量。不同于欧几里得距离(两点之间的最短直线),曼哈顿距离是各坐标之间绝对差的和。之所以称为“曼哈顿距离”,是因为它像出租车在曼哈顿的网格街道中行驶一样,只能沿着网格线移动。
从数学上讲,n 维空间中两点的曼哈顿距离等于它们笛卡尔坐标的绝对差之和。

曼哈顿距离公式包含绝对值函数,它将任何负的差值转换为正值。这一点对距离计算至关重要,因为它确保所有距离均为非负,真实反映与行进方向无关的标量距离。
曼哈顿距离的计算与可视化
如前所述,曼哈顿距离通过对两点对应坐标的绝对差求和得到。下面以 2D 与 3D 空间为例进行说明。
二维示例
考虑两点:A(1, 1) 和 B(4, 5):
- 计算 |x₁ - x₂| = |1 - 4| = 3
- 计算 |y₁ - y₂| = |1 - 5| = 4
- 求和:3 + 4 = 7
因此,A 和 B 之间的曼哈顿距离为 7 个单位。
两个向量的曼哈顿距离。图片作者自制。
在这个二维网格中,您可以看到曼哈顿距离遵循出租车行驶的路径,只通过水平与垂直移动从点 A 到达点 B。
三维示例
现在考虑三维空间中的两点:A(1, 2, 3) 和 B(4, 5, 6):
- 计算 |x₁ - x₂| = |1 - 4| = 3
- 计算 |y₁ - y₂| = |2 - 5| = 3
- 计算 |z₁ - z₂| = |3 - 6| = 3
- 求和:3 + 3 + 3 = 9
这两个三维点之间的曼哈顿距离为 9 个单位。
与欧几里得距离的比较
曼哈顿距离沿网格线度量路径;而欧几里得距离度量两点之间的直线距离,也就是常说的“鸟飞直线距离”。
针对我们的二维示例:
- 曼哈顿距离:7 个单位
- 欧几里得距离:√((1-4)² + (1-5)²) = 5 个单位
下面是曼哈顿距离与欧几里得距离的可视化对比:
曼哈顿距离 vs. 欧几里得距离。图片作者自制。
在欧几里得空间中,欧几里得距离总是小于或等于曼哈顿距离。
在曼哈顿与欧几里得距离之间进行选择
在以下情境中,曼哈顿距离尤其有用:
- 移动受限于网格路径(如城市街区、电路板布局)。
- 不允许对角线移动,或对角线移动代价更高。
- 在机器学习中处理高维数据时,相比欧几里得距离可能在计算上更高效。
- 分析离散或有序数据的差异。
相反,在以下情境中欧几里得距离更合适:
- 在开阔空间中测量物理距离。
- 处理连续数据且对角线移动同样有效。
曼哈顿距离的应用
曼哈顿距离在计算机科学、数据分析与地理空间技术等多个领域都有应用。以下是其尤为有用的一些关键方向。
路径搜索算法(如 A* 算法)
在基于网格的环境中,曼哈顿距离可作为快速有效的启发式,用于估计两点之间的距离。它在 A* 算法中尤为实用,当移动仅限于水平和垂直方向时,可更高效地引导搜索朝向目标。典型场景包括城市道路路径规划、迷宫求解算法以及某些类型的电子游戏 AI 路径规划。
聚类技术(如 K-Means 聚类)
曼哈顿距离可作为聚类算法的距离度量,尤其在处理高维数据时。在 K-Means 聚类中,用曼哈顿距离替代欧几里得距离有时能得到更好的结果,尤其在处理稀疏的高维数据或存在离群点时。此外,由于其在稀疏向量空间中的有效性,它常用于文本分类和文档聚类。曼哈顿距离对单个维度极端值的较低敏感性,在某些数据集上可带来更为均衡的聚类结果。
图像识别
曼哈顿距离可用于比较像素值或特征向量。在模板匹配中(即在大图中查找小图的出现位置)尤为有用。它也适用于人脸识别系统、视频流中的目标检测或大型图像数据库中的模式匹配等场景,此时速度至关重要,相较欧几里得距离略有的精度损失通常可以忽略。
离群点检测
与欧几里得距离相比,曼哈顿距离对单个维度极端值的敏感性更低,因此可用于识别数据集中与其他点显著不同的数据点。这一特性使其适用于异常检测系统,如欺诈检测或网络安全。在金融系统中,例如,曼哈顿距离可以帮助识别异常交易模式,而不会过度受某一单一属性极端值的影响,从而有望减少误判。
地理信息系统(GIS)
在 GIS 应用中,曼哈顿距离可对沿网格化街道网络的移动进行建模,因此在城市规划与物流中颇为实用。它用于选址-分配问题,例如在城市中基于最小化总出行距离来确定设施的最优位置。曼哈顿距离也可应用于空间分析任务,如围绕道路或河流等线性要素创建缓冲区。城市规划人员可以用它分析公共服务的可达性,而物流公司则可借助它优化城市配送路线。
曼哈顿距离的数学性质
曼哈顿距离具备若干重要的数学性质,使其尤为实用。下面我们探讨两个关键方面:其度量空间性质以及对离群点的鲁棒性。
度量空间性质
曼哈顿距离是一个真正的度量,这意味着它满足度量空间中距离函数所需的四个条件:
- 非负性: 任意两点之间的距离总是非负。对所有 x 与 y,d(x, y) ≥ 0。
- 同一性: 一点与其自身的距离为零;若两点之间的距离为零,则两点相同。d(x, y) = 0 当且仅当 x = y。
- 对称性: 从点 A 到点 B 的距离与从 B 到 A 的距离相同。对所有 x 与 y,d(x, y) = d(y, x)。
- 三角不等式: 任意两点之间的距离不大于它们分别与第三点的距离之和。对所有 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
含离群点时的曼哈顿距离与欧几里得距离。图片作者自制
在该示例中,曼哈顿距离能清晰地区分 AC 与 BC 的距离,而欧几里得距离由于 y 坐标离群值的主导效应,显示两者几乎相同。
这一特性使曼哈顿距离在以下场景中尤为有用:
- 高维空间中离群点常见的任务,如图像处理或文本分析。
- 希望降低离群点对聚类中心影响的聚类算法。
- 希望识别离群点且不过度放大其重要性的异常检测系统。
通过对单个维度的极端值不那么敏感,曼哈顿距离可在许多真实世界数据集中提供更为均衡的不相似度量,尤其是在数据嘈杂或不完美的情况下。
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)
}
point1 <- c(3, 5)
point2 <- c(1, 9)
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 课程,该课程使用距离度量进行离群点检测与特征缩放。
请记住,距离度量的选择会显著影响算法的性能与结果。通过理解何时以及如何使用曼哈顿距离,您就为自己的数据科学工具箱增添了一件强有力的工具。继续实验、学习,并不断拓展基于距离的算法可能性吧!
距离度量是衡量空间中对象或点之间相隔多远的基本工具。这些度量在诸多领域发挥着重要作用,包括机器学习、机器人技术和地理信息系统。通过量化距离,我们可以完成诸如模式识别、数据聚类和空间分析等任务,这些任务对商业机构和研究人员都同样重要。
曼哈顿距离(Manhattan distance),也称为 L1 距离或出租车距离(taxicab distance),在网格路径或多维空间中计算点与点之间的距离时尤为实用。本文将同时介绍其数学基础,并展示如何在 Python 与 R 中实现曼哈顿距离。
请记住,曼哈顿距离只是更广泛“距离度量”主题的一部分,这一主题在各个领域中反复出现。若您希望精通基于距离的学习,可根据偏好的语言选择我们的 Designing Machine Learning Workflows in Python 课程或 Cluster Analysis in R 课程。
曼哈顿距离的定义
曼哈顿距离是一种用于确定网格路径中两点距离的度量。不同于欧几里得距离(两点之间的最短直线),曼哈顿距离是各坐标之间绝对差的和。之所以称为“曼哈顿距离”,是因为它像出租车在曼哈顿的网格街道中行驶一样,只能沿着网格线移动。
从数学上讲,n 维空间中两点的曼哈顿距离等于它们笛卡尔坐标的绝对差之和。
曼哈顿距离公式包含绝对值函数,它将任何负的差值转换为正值。这一点对距离计算至关重要,因为它确保所有距离均为非负,真实反映与行进方向无关的标量距离。
曼哈顿距离的计算与可视化
如前所述,曼哈顿距离通过对两点对应坐标的绝对差求和得到。下面以 2D 与 3D 空间为例进行说明。
二维示例
考虑两点:A(1, 1) 和 B(4, 5):
因此,A 和 B 之间的曼哈顿距离为 7 个单位。
在这个二维网格中,您可以看到曼哈顿距离遵循出租车行驶的路径,只通过水平与垂直移动从点 A 到达点 B。
三维示例
现在考虑三维空间中的两点:A(1, 2, 3) 和 B(4, 5, 6):
这两个三维点之间的曼哈顿距离为 9 个单位。
与欧几里得距离的比较
曼哈顿距离沿网格线度量路径;而欧几里得距离度量两点之间的直线距离,也就是常说的“鸟飞直线距离”。
针对我们的二维示例:
下面是曼哈顿距离与欧几里得距离的可视化对比:
在欧几里得空间中,欧几里得距离总是小于或等于曼哈顿距离。
在曼哈顿与欧几里得距离之间进行选择
在以下情境中,曼哈顿距离尤其有用:
相反,在以下情境中欧几里得距离更合适:
曼哈顿距离的应用
曼哈顿距离在计算机科学、数据分析与地理空间技术等多个领域都有应用。以下是其尤为有用的一些关键方向。
路径搜索算法(如 A* 算法)
在基于网格的环境中,曼哈顿距离可作为快速有效的启发式,用于估计两点之间的距离。它在 A* 算法中尤为实用,当移动仅限于水平和垂直方向时,可更高效地引导搜索朝向目标。典型场景包括城市道路路径规划、迷宫求解算法以及某些类型的电子游戏 AI 路径规划。
聚类技术(如 K-Means 聚类)
曼哈顿距离可作为聚类算法的距离度量,尤其在处理高维数据时。在 K-Means 聚类中,用曼哈顿距离替代欧几里得距离有时能得到更好的结果,尤其在处理稀疏的高维数据或存在离群点时。此外,由于其在稀疏向量空间中的有效性,它常用于文本分类和文档聚类。曼哈顿距离对单个维度极端值的较低敏感性,在某些数据集上可带来更为均衡的聚类结果。
图像识别
曼哈顿距离可用于比较像素值或特征向量。在模板匹配中(即在大图中查找小图的出现位置)尤为有用。它也适用于人脸识别系统、视频流中的目标检测或大型图像数据库中的模式匹配等场景,此时速度至关重要,相较欧几里得距离略有的精度损失通常可以忽略。
离群点检测
与欧几里得距离相比,曼哈顿距离对单个维度极端值的敏感性更低,因此可用于识别数据集中与其他点显著不同的数据点。这一特性使其适用于异常检测系统,如欺诈检测或网络安全。在金融系统中,例如,曼哈顿距离可以帮助识别异常交易模式,而不会过度受某一单一属性极端值的影响,从而有望减少误判。
地理信息系统(GIS)
在 GIS 应用中,曼哈顿距离可对沿网格化街道网络的移动进行建模,因此在城市规划与物流中颇为实用。它用于选址-分配问题,例如在城市中基于最小化总出行距离来确定设施的最优位置。曼哈顿距离也可应用于空间分析任务,如围绕道路或河流等线性要素创建缓冲区。城市规划人员可以用它分析公共服务的可达性,而物流公司则可借助它优化城市配送路线。
曼哈顿距离的数学性质
曼哈顿距离具备若干重要的数学性质,使其尤为实用。下面我们探讨两个关键方面:其度量空间性质以及对离群点的鲁棒性。
度量空间性质
曼哈顿距离是一个真正的度量,这意味着它满足度量空间中距离函数所需的四个条件:
不同于不满足三角不等式的余弦距离,曼哈顿距离满足上述所有性质,因此在多种数学与计算应用中都很有用。例如:
增强的离群点区分能力
相比将差值平方的欧几里得距离,采用线性求和的曼哈顿距离在区分离群点方面往往更具优势。原因在于曼哈顿距离对各维度的绝对差分别累加,从而降低了某一单一维度上巨大差异的压倒性影响。
考虑二维空间中的两点:A(0, 0) 与 B(10, 0)。现在引入一个离群点 C,其坐标为 (0, 100):
在该示例中,曼哈顿距离能清晰地区分 AC 与 BC 的距离,而欧几里得距离由于 y 坐标离群值的主导效应,显示两者几乎相同。
这一特性使曼哈顿距离在以下场景中尤为有用:
通过对单个维度的极端值不那么敏感,曼哈顿距离可在许多真实世界数据集中提供更为均衡的不相似度量,尤其是在数据嘈杂或不完美的情况下。
Python 与 R 中的曼哈顿距离
本节我们将探索如何使用 Python 与 R 计算曼哈顿距离。每个示例都会展示不同的方法,从自定义函数到库方法。
Python 示例
Python 提供多种方式计算曼哈顿距离。下面介绍两种方法。
1. 使用 NumPy 数组计算:
输出:
该方法直接使用 NumPy 数组,效率很高,尤其适用于处理大型数据集,或当您在分析中已使用 NumPy 时。
2. 使用 SciPy 的 cityblock() 函数计算:
输出:
SciPy 提供了
cityblock()函数用于计算曼哈顿距离。该方法简洁高效,特别适合在项目中使用 SciPy 时。R 示例
R 同样提供多种方式计算曼哈顿距离。下面介绍两种方法。
1. 自定义函数
输出:
在此示例中,我们创建了名为
manhattan_distance的自定义函数。它将两点的坐标作为输入,通过对各自坐标的绝对差求和来得到曼哈顿距离。2. 使用 stats 库
输出:
在第二个示例中,我们使用
stats包中的dist()函数来计算曼哈顿距离。该方法在处理矩阵或多个点时尤其方便,可显著简化流程。结语
曼哈顿距离的重要性在于其简洁性、计算效率以及在某些情境下对离群点的鲁棒性。不同于欧几里得距离,曼哈顿距离在基于网格的系统中常常更直观,且在高维空间中计算更为高效。
此外,曼哈顿距离和其他距离度量广泛存在于各种场景中。除了我们的 Designing Machine Learning Workflows in Python 课程(其中包含基于距离学习的一章)与 Cluster Analysis in R 课程(使用基于距离的度量进行分类与降维),您还可以查看我们的 Anomaly Detection in Python 课程,该课程使用距离度量进行离群点检测与特征缩放。
请记住,距离度量的选择会显著影响算法的性能与结果。通过理解何时以及如何使用曼哈顿距离,您就为自己的数据科学工具箱增添了一件强有力的工具。继续实验、学习,并不断拓展基于距离的算法可能性吧!