Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで学ぶミンコフスキー距離の計算方法

ミンコフスキー距離とは

ミンコフスキー距離は、ノルムが定義されたベクトル空間における距離計量(メトリック)の一つです。この距離概念は「ミンコフスキーの不等式」として知られる数学的性質に基づいており、機械学習やデータ分析の分野では、ベクトル間の類似度を測定するために広く利用されています。

ミンコフスキー距離の大きな特徴は、パラメータ p の値によってさまざまな距離を統一的に表現できる点です。

  • p = 1:マンハッタン距離(各成分の差の絶対値の合計)
  • p = 2:ユークリッド距離(一般的な直線距離)
  • p → ∞:チェビシェフ距離(最大差分)

SciPyを使った計算方法

Pythonでは、SciPyライブラリの scipy.spatial.distance.minkowski 関数を使うことで、ミンコフスキー距離を簡単に計算できます。第3引数に p 値を指定するだけで、目的の距離が求まります。

>>> from scipy.spatial import distance
>>> distance.minkowski([1, 0, 0], [0, 1, 0], 1)
2.0
>>> distance.minkowski([1, 0, 0], [0, 1, 0], 2)
1.4142135623730951
>>> distance.minkowski([1, 0, 0], [0, 1, 0], 3)
1.2599210498948732
>>> distance.minkowski([1, 1, 0], [0, 1, 0], 1)
1.0
>>> distance.minkowski([1, 1, 0], [0, 1, 0], 2)
1.0
>>> distance.minkowski([1, 1, 0], [0, 1, 0], 3)
1.0

この例からわかるように、ベクトル間の差が1つの成分だけの場合、p 値を大きくするほど距離の値は小さくなっていきます。

自作関数による実装例

SciPyに頼らず、標準ライブラリの mathdecimal モジュールを組み合わせて、ミンコフスキー距離を自分で実装することも可能です。以下はそのサンプルコードです。

from math import *
from decimal import Decimal

def my_p_root(value, root):
   my_root_value = 1 / float(root)
   return round(Decimal(value) ** Decimal(my_root_value), 3)

def my_minkowski_distance(x, y, p_value):
   return (my_p_root(sum(pow(abs(a-b), p_value)
      for a, b in zip(x, y)), p_value))

# 実行部分
vector1 = [0, 2, 3, 4]
vector2 = [2, 4, 3, 7]
my_position = 5
print("The Distance is::", my_minkowski_distance(vector1, vector2, my_position))

このコードでは、まず my_p_root 関数で累乗根を高精度に計算し、my_minkowski_distance 関数内で2つのベクトルの対応する要素同士の差の絶対値を p 乗して合計し、その p 乗根を返しています。zip(x, y) を使うことで、複数の次元を持つベクトルにも柔軟に対応できます。

実行結果

The Distance is:: 3.144

p = 5 の場合、ベクトル [0, 2, 3, 4] と [2, 4, 3, 7] の間のミンコフスキー距離は 3.144 となります。このように、p 値を調整することで、データの特性に応じた距離評価が可能になります。


  1. 【初心者向け】Pythonのissuperset()メソッドの使い方をわかりやすく解説

    はじめにこの記事では、Pythonのissuperset()メソッドについて、基本的な仕組みから実際のコード例まで詳しく解説します。issuperset()は、セット(集合)に対して使用できるメソッドで、引数として渡されたセットのすべての要素が、呼び出し元のセットに含まれているかどうかを判定します。呼び出し元のセットBが、引数のセットAのすべての要素を含んでいる場合 → True を返すセットAの要素がすべてBに含まれていない場合 → False を返すつまり、「BがAの上位集合(スーパーセット)であるかどうか」を判定するためのメソッドです。基本構文B.issuperset(A)この式は、Bが

  2. PythonでQuine(クワイン)プログラムを書いてみよう

    「Quine(クワイン)」とは、入力を一切受け取らずに、自分自身のソースコードを出力する特殊なプログラムのことです。一見すると不思議な自己言及的な仕組みですが、実装にはいくつかの厳格なルールがあります。最も重要な条件は、プログラム内部からソースコードファイルを読み込んではいけないという点です。つまり、純粋にコード自身の論理だけで自分の内容を再現しなければなりません。 サンプルコード Pythonでは、わずか1行でQuineを実現できます。 a=a=%r;print (a%%a);print (a%a) 実行結果 a=a=%r;print (a%%a);print (a%a) ご覧のとお