ミンコフスキー距離メトリックの実装

PythonBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、ユークリッド距離やマンハッタン距離などの一般的な距離測定法を含む一般化された距離メトリックであるミンコフスキー距離関数を実装する方法を学びます。また、関数をテストして改善する方法、およびそれをより大きなプロジェクトに統合する方法についても学びます。

🎯 タスク

このプロジェクトでは、以下を学びます。

  • Python でミンコフスキー距離関数を実装する方法
  • 異なる入力パラメータでミンコフスキー距離関数をテストする方法
  • 端数ケースを処理するためにミンコフスキー距離関数を改善する方法
  • ミンコフスキー距離関数をより大きなプロジェクトに統合する方法

🏆 成果

このプロジェクトを完了すると、以下ができるようになります。

  • 2 点間のミンコフスキー距離を計算する
  • ミンコフスキー距離関数の異なる種類の入力パラメータを処理する
  • 関数をテストして改善し、そのロバスト性を向上させる
  • カスタム関数をより大きなプロジェクトに統合する

ミンコフスキー距離関数を実装する

このステップでは、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:
    """
    2 点間のミンコフスキー距離を計算する。

    この関数は、数値のリストとして表される 2 点間のミンコフスキー距離を計算します。ミンコフスキー距離は、ユークリッド距離やマンハッタン距離などの他の距離メトリックの一般化形です。

    パラメータ:
    - point_a (List[float]): 最初の点の座標。
    - point_b (List[float]): 2 番目の点の座標。
    - p (Union[int, str]): ミンコフスキー距離計算の指数パラメータ。
      - p が 1 以上の整数の場合、p-ノルム距離が計算されます。
      - p が 'INF' の場合、無限大ノルム(チェビシェフ)距離が計算されます。

    戻り値:
    - float: 2 点間のミンコフスキー距離。無効な 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)

解説

まず、必要なモジュールをインポートします。

次に、point_apoint_bp の 3 つのパラメータを持つ minkowski_distance 関数を定義します。

この関数は、ミンコフスキー距離を計算します。

  • 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

出力が予想結果と一致することを確認します。

  • p = 2 のときの点 a = [1, 0]b = [2, 0] の距離は 1.0 である必要があります。
  • p = "INF" のときの点 a = [4, 9, 10]b = [2, 0, -3] の距離は 13.0 である必要があります。
  • p = -10 のときの点 a = [1, 4, 10, 0]b = [20, -3, -5, 0] の距離は -1.0 である必要があります。

まとめ

おめでとうございます!このプロジェクトを完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を行って練習してください。

✨ 解答を確認して練習✨ 解答を確認して練習