实现闵可夫斯基距离度量

PythonBeginner
立即练习

介绍

在这个项目中,你将学习如何实现闵可夫斯基距离函数,这是一种广义距离度量,包括常用的距离度量,如欧几里得距离和曼哈顿距离。你还将学习如何测试和优化该函数,以及如何将其集成到一个更大的项目中。

🎯 任务

在这个项目中,你将学习:

  • 如何用 Python 实现闵可夫斯基距离函数
  • 如何使用不同的输入参数测试闵可夫斯基距离函数
  • 如何优化闵可夫斯基距离函数以处理边界情况
  • 如何将闵可夫斯基距离函数集成到一个更大的项目中

🏆 成果

完成这个项目后,你将能够:

  • 计算两点之间的闵可夫斯基距离
  • 处理闵可夫斯基距离函数的不同类型输入参数
  • 测试和优化函数以提高其鲁棒性
  • 将自定义函数集成到一个更大的项目中

实现闵可夫斯基距离函数

在这一步中,你将学习如何用 Python 实现闵可夫斯基距离函数。按照以下步骤完成此步骤:

在你的代码编辑器中打开 minkowski_distance.py 文件。

使用以下逻辑实现 minkowski_distance 函数:

from typing import List, Union
import numpy as np

def minkowski_distance(
    point_a: List[float], point_b: List[float], p: Union[int, str]
) -> float:
    """
    计算两点之间的闵可夫斯基距离。

    此函数计算两个表示为数值列表的点之间的闵可夫斯基距离。闵可夫斯基距离是欧几里得距离和曼哈顿距离等其他距离度量的推广。

    参数:
    - point_a (List[float]):第一个点的坐标。
    - point_b (List[float]):第二个点的坐标。
    - p (Union[int, str]):闵可夫斯基距离计算的指数参数。
      - 如果 p 是大于或等于 1 的整数,则计算 p-范数距离。
      - 如果 p 是 'INF',则计算无穷范数(切比雪夫)距离。

    返回:
    - float:两点之间的闵可夫斯基距离。如果提供了无效的 p 值,则返回 -1。
    """

    if isinstance(p, int) and p >= 1:
        distance = np.power(
            np.sum(np.abs(np.array(point_a) - np.array(point_b)) ** p), 1 / p
        )
    elif p == "INF":
        distance = np.max(np.abs(np.array(point_a) - np.array(point_b)))
    else:
        distance = -1
    return float(distance)

解释

首先,我们导入必要的模块。

然后,定义 minkowski_distance 函数,该函数接受三个参数:point_apoint_bp

该函数计算闵可夫斯基距离:

  • 如果 p 是大于或等于 1 的整数,则使用公式计算 p-范数距离:
    [ \text{distance} = \left( \sum \left| \text{point_a} - \text{point_b} \right|^p \right)^{1/p} ]
  • 如果 p 是 "INF",则使用公式计算无穷范数(切比雪夫)距离: [ \text{distance} = \max \left| \text{point_a} - \text{point_b} \right| ]
  • 如果 p 无效,则返回 -1.0

测试闵可夫斯基距离函数

在这一步中,你将使用不同的输入参数测试 minkowski_distance 函数。按照以下步骤完成此步骤:

在你的代码编辑器中打开 minkowski_distance.py 文件。

在文件底部添加以下测试用例:

if __name__ == "__main__":
    a = [1, 0]
    b = [2, 0]
    p = 2
    distance = minkowski_distance(a, b, p)
    print(f"{a=}, {b=}, {p=}, {distance=}")  ## 预期输出:a=[1, 0], b=[2, 0], p=2, distance=1.0

    a = [4, 9, 10]
    b = [2, 0, -3]
    p = "INF"
    distance = minkowski_distance(a, b, p)
    print(f"{a=}, {b=}, {p=}, {distance=}")  ## 预期输出:a=[4, 9, 10], b=[2, 0, -3], p=INF, distance=13.0

    a = [1, 4, 10, 0]
    b = [20, -3, -5, 0]
    p = -10
    distance = minkowski_distance(a, b, p)
    print(f"{a=}, {b=}, {p=}, {distance=}")  ## 预期输出:a=[1, 4, 10, 0], b=[20, -3, -5, 0], p=-10, distance=-1.0

使用以下命令运行 minkowski_distance.py 文件:

python minkowski_distance.py

验证输出是否与预期结果匹配:

  • 对于点 a = [1, 0]b = [2, 0]p = 2,距离应为 1.0
  • 对于点 a = [4, 9, 10]b = [2, 0, -3]p = "INF",距离应为 13.0
  • 对于点 a = [1, 4, 10, 0]b = [20, -3, -5, 0]p = -10,距离应为 -1.0

总结

恭喜你!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。

✨ 查看解决方案并练习✨ 查看解决方案并练习