例如,当 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技术支持
此代码演示了:
如何使用 SciPy 的距离函数计算闵可夫斯基与切比雪夫距离。
如何计算包括无穷在内的多种 p 值对应的距离。
闵可夫斯基距离与其他度量(曼哈顿、欧几里得、切比雪夫)之间的关系。
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))}}技术支持
此代码演示了:
如何基于 stats 的 dist() 函数创建 minkowski_distance。
如何处理不同的 p 值,包括用于切比雪夫距离的无穷大。
如何计算不同 p 值下的闵可夫斯基距离。
如何将输出格式化为保留两位小数。
该代码的输出为:
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,从业者可以将距离计算更好地与其数据特性和项目需求相匹配,从而在聚类到异常检测等任务中潜在提升结果。
距离度量是数据科学和机器学习中诸多算法的基石,用于衡量数据点之间的相似性或差异性。本文将探讨闵可夫斯基距离的基础、数学性质及其实现方式。我们会说明它与其他常见距离度量的关系,并通过 Python 和 R 的代码示例展示其用法。
无论您是在开发聚类算法、进行异常检测,还是微调分类模型,理解闵可夫斯基距离都能提升您进行数据分析与模型开发的方法。让我们一探究竟。
什么是闵可夫斯基距离?
闵可夫斯基距离是一种用于赋范向量空间的通用度量,以德国数学家 Hermann Minkowski 命名。它是多个众所周知距离度量的推广,因此在数学、计算机科学和数据分析等领域都是基本概念。
其核心是提供一种在多维空间中衡量两点距离的方法。其特别有用之处在于,通过参数
p,它能够将其他距离度量作为特例纳入其中。该参数使闵可夫斯基距离能够适应不同的问题空间和数据特性。闵可夫斯基距离的一般公式为:其中:
x和y是 n 维空间中的两个点p是决定距离类型的参数(p ≥ 1)|xi - yi|表示在每个维度上 x 与 y 坐标的绝对差闵可夫斯基距离之所以有用,主要有两点。首先,它让您能在需要时灵活切换曼哈顿距离或欧几里得距离。其次,它认识到并非所有数据集(如高维空间)都适合完全使用曼哈顿或完全使用欧几里得距离。
在实践中,参数
p通常通过训练/测试验证流程来选择。通过在交叉验证中测试不同的 p 值,您可以确定哪个值能为您的特定数据集带来最佳模型表现。闵可夫斯基距离如何工作
我们先看看闵可夫斯基距离与其他距离公式的关系,然后通过一个示例来说明其计算过程。
对其他距离度量的泛化
首先需要理解的是,闵可夫斯基距离公式内部包含了曼哈顿、欧几里得和切比雪夫距离的公式。
曼哈顿距离(p = 1):
当
p设为 1 时,闵可夫斯基距离即为曼哈顿距离。又称为城市街区距离或 L1 范数,曼哈顿距离度量绝对差的总和。
欧几里得距离(p = 2):
当
p设为 2 时,闵可夫斯基距离即为欧几里得距离。欧几里得距离是最常见的距离度量,表示两点之间的直线距离。
切比雪夫距离(p → ∞):
切比雪夫距离,又称棋盘距离,度量任一维度上的最大差异。
通过示例演练
为真正理解闵可夫斯基距离的功能与优势,我们来做一个示例。这将帮助我们把握参数
p如何影响在多维空间中距离的计算与解读。考虑二维空间中的两点:
我们将针对不同的
p值计算这两点间的闵可夫斯基距离。闵可夫斯基距离中的参数
p控制该度量对各分量差异的敏感度:随着
p增大,闵可夫斯基距离通常会减小,并趋近于切比雪夫距离。这是因为更高的p值会对最大差异赋予更大的权重,而对较小差异赋予更小权重。为可视化不同
p值如何影响 A(2, 3) 与 B(5, 7) 两点间的距离计算,请查看下图:从图中可以看到,随着 p 增大,距离度量的变化:
该可视化解释了为何在不同应用中会选择不同的
p值。例如,城市导航问题可能更适合曼哈顿距离,而物理空间计算常用欧几里得距离。较高的p值(如 p=3)适用于需强调较大差异的场景;当最重要的是任一维度上的最大差异时,则可考虑切比雪夫距离。闵可夫斯基距离的应用
闵可夫斯基距离通过可调的参数
p,成为跨多个领域的灵活工具。通过改变p,我们可以定制点与点之间的距离度量方式,使其适配不同任务。下列四类应用中,闵可夫斯基距离都扮演着重要角色。机器学习与数据科学
在机器学习与数据科学中,闵可夫斯基距离是许多依赖数据点相似度或差异度的算法的基础。一个典型示例是k 近邻(k-NN)算法,它根据最近邻居的类别对数据点进行分类。通过使用闵可夫斯基距离,我们可以调整参数
p来改变对“接近度”的计算方式。模式识别
模式识别旨在识别数据中的模式与规律,如手写识别或人脸特征检测。在此背景下,闵可夫斯基距离用于衡量表示模式的特征向量之间的差异。例如,在图像识别中,每幅图像都可由像素值向量表示。计算这些向量之间的闵可夫斯基距离,可以量化图像之间的相似或差异程度。
通过调整
p,我们可以控制距离度量对特定特征差异的敏感度。较低的p可能更关注所有像素上的整体差异,而较高的p则会强调图像某些区域的显著差异。异常检测
异常检测旨在识别与大多数数据显著偏离的数据点,这在欺诈检测、网络安全和系统故障检测等领域至关重要。闵可夫斯基距离可用于衡量某个数据点与数据集中其他点的距离,距离较大的点可能是潜在异常。通过选择合适的
p,分析人员可以提升异常检测系统对特定场景中最相关偏差的敏感度。计算几何与空间分析
在计算几何与空间分析中,闵可夫斯基距离用于计算空间中点与点之间的距离,这是许多几何算法的基础。例如,这些领域中的碰撞检测依赖闵可夫斯基距离来判断物体何时足够接近而发生交互。通过调整 p,开发者可以构建多样的碰撞边界,从棱角分明(较低 p)到圆润(较高 p)。
除了碰撞检测,闵可夫斯基距离在空间聚类与形状分析中也很有用。改变 p 的取值可使研究者强调空间关系的不同方面,从城市街区式的距离到整体形状相似性。
闵可夫斯基距离的数学性质
闵可夫斯基距离不仅在实践中用途广泛,在数学理论上(尤其是度量空间与范数的研究)也是一个重要概念。
度量空间性质
闵可夫斯基距离满足使一个函数成为度量所需的四个基本性质:
范数的泛化
闵可夫斯基距离通过范数的概念,提供了一个统一在数学空间中度量距离的通用框架。简单来说,范数是一个为向量空间中的向量赋予非负长度或大小的函数,本质上衡量向量的“长度”。通过调整闵可夫斯基距离公式中的参数
p,我们可以在不同范数之间平滑过渡,每种范数都提供了各自计算向量长度的方法。例如,当 p=1 时,闵可夫斯基距离变为曼哈顿范数,将距离视为各维度绝对差之和——可想象为在城市网格中行走。当 p=2 时,它变为欧几里得范数,计算两点之间的直线(“鸟飞直线”)距离。随着
p趋于无穷大,它收敛到切比雪夫范数,距离由各维度中最大的单一差异决定。这种灵活性使闵可夫斯基距离能够适应多种数学与实际场景,成为衡量距离的多面手。在 Python 和 R 中计算闵可夫斯基距离
下面我们分别用 Python 和 R 来实现闵可夫斯基距离的计算。我们将使用现成的包与库来完成这项任务。
Python 示例
在 Python 中,我们可以使用 SciPy 库,它提供了多种距离度量的高效实现。以下示例计算不同 p 值下的闵可夫斯基距离:
运行这段代码,您可以观察到随着 p 值变化,距离如何变化,从而加深对本文前述概念的理解。
此代码演示了:
R 示例
在 R 中,我们将使用
stats库中的dist()函数:此代码演示了:
如何基于
stats的dist()函数创建minkowski_distance。如何处理不同的 p 值,包括用于切比雪夫距离的无穷大。
如何计算不同 p 值下的闵可夫斯基距离。
如何将输出格式化为保留两位小数。
该代码的输出为:
该 R 实现与 Python 示例相呼应,便于读者了解如何在不同编程环境中计算闵可夫斯基距离。
结语
闵可夫斯基距离为在多维空间中度量距离提供了一种灵活且可调的思路。其通过参数
p对其他常见距离度量进行泛化,使其在数据科学和机器学习的多个领域都具备重要价值。通过调整p,从业者可以将距离计算更好地与其数据特性和项目需求相匹配,从而在聚类到异常检测等任务中潜在提升结果。在您的实践中应用闵可夫斯基距离时,建议您尝试不同的 p 值并观察其对结果的影响。若希望进一步深化理解与技能,欢迎学习 Designing Machine Learning Workflows in Python 课程,并考虑我们的 Data Scientist Certification 职业认证项目。这些资源可帮助您在距离度量方面更进一步,并在不同情境中有效应用。