跳至主要内容

闵可夫斯基距离:全面指南

闵可夫斯基距离是一种根据所选参数而呈现“直”或“曲”路径的两点间距离度量。继续阅读,了解其基础、应用及与各领域中其他度量的比较。
· 11分钟 阅读

使用 AI 探索

距离度量是数据科学和机器学习中诸多算法的基石,用于衡量数据点之间的相似性或差异性。本文将探讨闵可夫斯基距离的基础、数学性质及其实现方式。我们会说明它与其他常见距离度量的关系,并通过 Python 和 R 的代码示例展示其用法。 

无论您是在开发聚类算法、进行异常检测,还是微调分类模型,理解闵可夫斯基距离都能提升您进行数据分析与模型开发的方法。让我们一探究竟。

什么是闵可夫斯基距离?

闵可夫斯基距离是一种用于赋范向量空间的通用度量,以德国数学家 Hermann Minkowski 命名。它是多个众所周知距离度量的推广,因此在数学、计算机科学和数据分析等领域都是基本概念。

其核心是提供一种在多维空间中衡量两点距离的方法。其特别有用之处在于,通过参数 p,它能够将其他距离度量作为特例纳入其中。该参数使闵可夫斯基距离能够适应不同的问题空间和数据特性。闵可夫斯基距离的一般公式为:

其中:

  • x 和 y 是 n 维空间中的两个点

  • p 是决定距离类型的参数(p ≥ 1)

  • |xi - yi| 表示在每个维度上 x 与 y 坐标的绝对差

闵可夫斯基距离之所以有用,主要有两点。首先,它让您能在需要时灵活切换曼哈顿距离或欧几里得距离。其次,它认识到并非所有数据集(如高维空间)都适合完全使用曼哈顿或完全使用欧几里得距离。

在实践中,参数 p 通常通过训练/测试验证流程来选择。通过在交叉验证中测试不同的 p 值,您可以确定哪个值能为您的特定数据集带来最佳模型表现。

闵可夫斯基距离如何工作

我们先看看闵可夫斯基距离与其他距离公式的关系,然后通过一个示例来说明其计算过程。 

对其他距离度量的泛化

首先需要理解的是,闵可夫斯基距离公式内部包含了曼哈顿、欧几里得和切比雪夫距离的公式。 

曼哈顿距离(p = 1): 

当 p 设为 1 时,闵可夫斯基距离即为曼哈顿距离。 

formula for Manhattan distance

又称为城市街区距离或 L1 范数,曼哈顿距离度量绝对差的总和。 

欧几里得距离(p = 2): 

当 p 设为 2 时,闵可夫斯基距离即为欧几里得距离。

formula for Euclidean distance

欧几里得距离是最常见的距离度量,表示两点之间的直线距离。 

切比雪夫距离(p → ∞): 

formula for Chebyshev distance

切比雪夫距离,又称棋盘距离,度量任一维度上的最大差异。 

通过示例演练

为真正理解闵可夫斯基距离的功能与优势,我们来做一个示例。这将帮助我们把握参数 p 如何影响在多维空间中距离的计算与解读。

考虑二维空间中的两点:

  • A 点:(2, 3)
  • B 点:(5, 7)

我们将针对不同的 p 值计算这两点间的闵可夫斯基距离。

Minkowski distance with different values of p

闵可夫斯基距离中的参数 p 控制该度量对各分量差异的敏感度:

  • 当 p=1:所有差异线性贡献。
  • 当 p=2:由于平方,较大的差异影响更显著。
  • 当 p>2:对较大差异的强调更强。
  • 当 p→∞:只关心各维度中最大的差异。

随着 p 增大,闵可夫斯基距离通常会减小,并趋近于切比雪夫距离。这是因为更高的 p 值会对最大差异赋予更大的权重,而对较小差异赋予更小权重。

为可视化不同 p 值如何影响 A(2, 3) 与 B(5, 7) 两点间的距离计算,请查看下图:

从图中可以看到,随着 p 增大,距离度量的变化:

  • 曼哈顿距离(p=1)以绿色路径表示,得到的路径最长,因为它严格沿着网格行进。
  • 欧几里得距离(p=2)以橙色直线表示,提供直接的直线路径。
  • 切比雪夫距离(p=∞)以红色虚线表示,只关注最大的坐标差异,路径表现为先在一个维度上尽量移动,再处理另一个维度。
  • p=3 的闵可夫斯基距离以紫色表示,路径略带曲线,显示从欧几里得到切比雪夫的过渡。

该可视化解释了为何在不同应用中会选择不同的 p 值。例如,城市导航问题可能更适合曼哈顿距离,而物理空间计算常用欧几里得距离。较高的 p 值(如 p=3)适用于需强调较大差异的场景;当最重要的是任一维度上的最大差异时,则可考虑切比雪夫距离。

闵可夫斯基距离的应用

闵可夫斯基距离通过可调的参数 p,成为跨多个领域的灵活工具。通过改变 p,我们可以定制点与点之间的距离度量方式,使其适配不同任务。下列四类应用中,闵可夫斯基距离都扮演着重要角色。

机器学习与数据科学

在机器学习与数据科学中,闵可夫斯基距离是许多依赖数据点相似度或差异度的算法的基础。一个典型示例是k 近邻(k-NN)算法,它根据最近邻居的类别对数据点进行分类。通过使用闵可夫斯基距离,我们可以调整参数 p 来改变对“接近度”的计算方式。

模式识别

模式识别旨在识别数据中的模式与规律,如手写识别或人脸特征检测。在此背景下,闵可夫斯基距离用于衡量表示模式的特征向量之间的差异。例如,在图像识别中,每幅图像都可由像素值向量表示。计算这些向量之间的闵可夫斯基距离,可以量化图像之间的相似或差异程度。

通过调整 p,我们可以控制距离度量对特定特征差异的敏感度。较低的 p 可能更关注所有像素上的整体差异,而较高的 p 则会强调图像某些区域的显著差异。

异常检测

异常检测旨在识别与大多数数据显著偏离的数据点,这在欺诈检测、网络安全和系统故障检测等领域至关重要。闵可夫斯基距离可用于衡量某个数据点与数据集中其他点的距离,距离较大的点可能是潜在异常。通过选择合适的 p,分析人员可以提升异常检测系统对特定场景中最相关偏差的敏感度。

计算几何与空间分析

在计算几何与空间分析中,闵可夫斯基距离用于计算空间中点与点之间的距离,这是许多几何算法的基础。例如,这些领域中的碰撞检测依赖闵可夫斯基距离来判断物体何时足够接近而发生交互。通过调整 p,开发者可以构建多样的碰撞边界,从棱角分明(较低 p)到圆润(较高 p)。

除了碰撞检测,闵可夫斯基距离在空间聚类与形状分析中也很有用。改变 p 的取值可使研究者强调空间关系的不同方面,从城市街区式的距离到整体形状相似性。

闵可夫斯基距离的数学性质

闵可夫斯基距离不仅在实践中用途广泛,在数学理论上(尤其是度量空间与范数的研究)也是一个重要概念。

度量空间性质

闵可夫斯基距离满足使一个函数成为度量所需的四个基本性质:

  • 非负性:任意两点之间的闵可夫斯基距离总是非负,d(x,y)≥0。这很明显,因为它是若干非负项(绝对值的 p 次方)之和的 p 次方根。
  • 不可分辨同一性:当且仅当两点完全相同时,闵可夫斯基距离为零。数学上,d(x,y) = 0 当且仅当 x=y。这是因为相同分量的绝对差为零。
  • 对称性:闵可夫斯基距离是对称的,即 d(x,y)=d(y,x)。这是因为绝对值中的减法顺序不会影响结果。
  • 三角不等式:闵可夫斯基距离满足三角不等式,即对任意三点 x、y 和 z,从 x 到 z 的距离至多等于从 x 到 y 与 y 到 z 的距离之和;形式化为 d(x,z)≤d(x,y)+d(y,z)。这一性质不易直接从公式证明,通常需要更高等的数学工具,但其本质确保两点间的直达路径是最短的。

范数的泛化

闵可夫斯基距离通过范数的概念,提供了一个统一在数学空间中度量距离的通用框架。简单来说,范数是一个为向量空间中的向量赋予非负长度或大小的函数,本质上衡量向量的“长度”。通过调整闵可夫斯基距离公式中的参数 p,我们可以在不同范数之间平滑过渡,每种范数都提供了各自计算向量长度的方法。

例如,当 p=1 时,闵可夫斯基距离变为曼哈顿范数,将距离视为各维度绝对差之和——可想象为在城市网格中行走。当 p=2 时,它变为欧几里得范数,计算两点之间的直线(“鸟飞直线”)距离。随着 p 趋于无穷大,它收敛到切比雪夫范数,距离由各维度中最大的单一差异决定。这种灵活性使闵可夫斯基距离能够适应多种数学与实际场景,成为衡量距离的多面手。

在 Python 和 R 中计算闵可夫斯基距离

下面我们分别用 Python 和 R 来实现闵可夫斯基距离的计算。我们将使用现成的包与库来完成这项任务。 

Python 示例

在 Python 中,我们可以使用 SciPy 库,它提供了多种距离度量的高效实现。以下示例计算不同 p 值下的闵可夫斯基距离:

import numpy as np
from scipy.spatial import distance

# Example points
point_a = [2, 3]
point_b = [5, 7]

# Different p values
p_values = [1, 2, 3, 10, np.inf]
print("Minkowski distances using SciPy:")

for p in p_values:
	if np.isinf(p):
	    # For p = infinity, use Chebyshev distance
	    dist = distance.chebyshev(point_a, point_b)
	    print(f"p = ∞, Distance = {dist:.2f}")
	else:
	        dist = distance.minkowski(point_a, point_b, p)
	        print(f"p = {p}, Distance = {dist:.2f}")

运行这段代码,您可以观察到随着 p 值变化,距离如何变化,从而加深对本文前述概念的理解。

Minkowski distances using SciPy:
p = 1, Distance = 7.00
p = 2, Distance = 5.00
p = 3, Distance = 4.50
p = 10, Distance = 4.02
p = ∞, Distance = 4.00

此代码演示了:

  1. 如何使用 SciPy 的距离函数计算闵可夫斯基与切比雪夫距离。
  2. 如何计算包括无穷在内的多种 p 值对应的距离。
  3. 闵可夫斯基距离与其他度量(曼哈顿、欧几里得、切比雪夫)之间的关系。

R 示例

在 R 中,我们将使用 stats 库中的 dist() 函数:

# Define the Minkowski distance function using stats::dist

minkowski_distance <- function(x, y, p) {
  points <- rbind(x, y)
  if (is.infinite(p)) {
    # For p = Inf, use method = "maximum" for Chebyshev distance
    distance <- stats::dist(points, method = "maximum")
  } else {
    distance <- stats::dist(points, method = "minkowski", p = p)
  }
  return(as.numeric(distance))
}

# Example usage
point_a <- c(2, 3)
point_b <- c(5, 7)

# Different p values
p_values <- c(1, 2, 3, 10, Inf)
cat("Minkowski distances between points A and B using stats::dist:\n")

for (p in p_values) {
  distance <- minkowski_distance(point_a, point_b, p)
  if (is.infinite(p)) {
    cat(sprintf("p = ∞, Distance = %.2f\n", distance))
  } else {
    cat(sprintf("p = %g, Distance = %.2f\n", p, distance))
  }
}

此代码演示了:

  1. 如何基于 stats 的 dist() 函数创建 minkowski_distance。

  2. 如何处理不同的 p 值,包括用于切比雪夫距离的无穷大。

  3. 如何计算不同 p 值下的闵可夫斯基距离。

  4. 如何将输出格式化为保留两位小数。

该代码的输出为:

Minkowski distances between points A and B using stats::dist:
p = 1, Distance = 7.00
p = 2, Distance = 5.00
p = 3, Distance = 4.50
p = 10, Distance = 4.02
p = ∞, Distance = 4.00

该 R 实现与 Python 示例相呼应,便于读者了解如何在不同编程环境中计算闵可夫斯基距离。

结语

闵可夫斯基距离为在多维空间中度量距离提供了一种灵活且可调的思路。其通过参数 p 对其他常见距离度量进行泛化,使其在数据科学和机器学习的多个领域都具备重要价值。通过调整 p,从业者可以将距离计算更好地与其数据特性和项目需求相匹配,从而在聚类到异常检测等任务中潜在提升结果。

在您的实践中应用闵可夫斯基距离时,建议您尝试不同的 p 值并观察其对结果的影响。若希望进一步深化理解与技能,欢迎学习 Designing Machine Learning Workflows in Python 课程,并考虑我们的 Data Scientist Certification 职业认证项目。这些资源可帮助您在距离度量方面更进一步,并在不同情境中有效应用。

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 场一对一辅导。

 

闵可夫斯基距离常见问答

什么是闵可夫斯基距离?

闵可夫斯基距离是一种广义度量,用于衡量多维空间中两点之间的距离。它由参数“p”定义,从而可以将其他距离度量作为特例纳入,使其在数据科学和机器学习的多种应用中具有高度的通用性。

闵可夫斯基距离与欧几里得距离、曼哈顿距离有什么关系?

闵可夫斯基距离是欧几里得距离与曼哈顿距离的推广。当参数 p=2 时,它等同于欧几里得距离;当 p=1 时,它等同于曼哈顿距离。借助这种灵活性,闵可夫斯基距离能够适应不同的问题空间与数据特征。

当 `p` 趋于无穷大时会发生什么?

当 p 趋近于无穷大时,闵可夫斯基距离收敛为切比雪夫距离。在这种情况下,距离由任一单一维度上的最大差异决定,这在某些优化问题和最坏情形分析中非常有用。

闵可夫斯基距离可以用于分类数据吗?

闵可夫斯基距离主要面向数值型数据。对于分类型数据,Hamming 距离或 Gower 距离等其他度量更为合适。不过,如果将分类数据适当编码为数值形式,也可以应用闵可夫斯基距离。

特征的尺度会影响闵可夫斯基距离吗?

是的,闵可夫斯基距离对特征量纲敏感。如果各特征的尺度不同,在应用闵可夫斯基距离之前应对数据进行归一化或标准化,以确保所有特征对距离计算的贡献恰当。

使用闵可夫斯基距离有哪些局限?

尽管闵可夫斯基距离具有通用性,但它假设所有维度对距离的贡献相同,这并不总是合理。对于大型数据集,尤其是分数阶 p 值的情况,计算成本可能较高。此外,它可能无法捕捉数据中的复杂非线性关系,而某些其他距离度量可能更能揭示这些关系。

主题