NumPyでユークリッド距離の計算をする

このガイドでは、PythonでNumpyを使って2点間のユークリッド距離を計算する方法について見ていきます。

ユークリッド距離とは?

ユークリッド距離とは、ユークリッド空間内の系に関わる基本的な距離測度である。

>
ユークリッド空間とは、数学の授業でおなじみの古典的な幾何学的空間で、一般に3次元に束縛されています。

しかし、非負の整数の次元にも適用できます。

ということです。

ユークリッド
ユークリッド距離とは、ユークリッド空間における2点間の最短距離のことである。

ユークリッドとは、「幾何学の父」と呼ばれるユークリッドのことで、当時の人々が一般的に思い浮かべる空間はこれだけであったため、この名前が付けられました。

時代とともに、物理学や数学ではアフィン空間などの異なるタイプの空間が観察されるようになり、非ユークリッド空間や幾何学は、我々の認識にとって非常に直感的でないものである。

>
> 3次元ユークリッド空間では、2点間の最短線は常に2点間の直線となるが、高次元ではこれが成り立たない。

この事実を踏まえると、ユークリッド距離は多次元を扱う場合に必ずしも最も有用な指標とは言えず、ここでは2次元と3次元のユークリッド空間に着目してユークリッド距離を計算することにします。

高次元データの距離測定は、通常、マンハッタン距離のような他の距離測定基準を用いて行われます。

一般にユークリッド距離は、3次元世界の開発や、K-Nearest Neighborsのような距離メトリックを含む機械学習アルゴリズムに大きく利用されています。

一般的にユークリッド距離は、2つのデータポイントがどれだけ似ているかを表しますが、これは他のデータに基づくクラスタリングがすでに実行されていることを前提としています。

数式の説明

2次元空間における2点間のユークリッド距離の計算式。

d(p,q)=2√(q1−p1)2+(q2−p2)2d(p,q)=(q1−p1)2+(q2−p2)22
d(p,q) = sqrt[2]{(qttp_1-p_1)^2 + (qttp_2-p_2)^2 } となる。

この式は3次元空間だけでなく、任意の次元に容易に適用できる。

d(p,q)=2√(q1−p1)2+(q2−p2)2+(q3−p3)2d(p,q)=(q1−p1)2+(q2−p2)2+(q3−p3)22
d(p,q) = sqrt[2]{(qttp_1-p_1)^2 + (qttp_2-p_2)^2 + (qttp_3-p_3)^2 } となる。

一般式は次のように簡略化できる。

d(p,q)=2√(q1-p1)2+…+(qn-pn)2d(p,q)=(q1-p1)2+…+(qn-pn) 22
d(p,q) = sqrt[2]{(qgu_1-pgu_1)^2 + … + (qii_n-pii_n)^2 }.

ユークリッド距離とピタゴラスの定理が似ていることに気が付くかもしれない。

c2=a2+b2c2=a2+b2
c^2 = a^2 + b^2

d(p,q)2=(q1−p1)2+(q2−p2)2d(p,q)2=(q1−p1)2+(q2−p2)2
d(p,q)^2 = (q1-p_1)^2 + (q2-p2)^2

ユークリッド距離は、2点の直交座標を与えると、ピタゴラスの定理によって計算されるのであるが、実はこの間に関係がある。

>
ユークリッド距離はピタゴラスの距離とも呼ばれることがありますが、前者の方がよく知られています。

注:2点はベクトルですが、出力はスカラー(距離のこと)であるべきです。

この2点間の距離の計算にはNumPyを使いますが、2D空間でも3D空間でも同じ手法で計算します。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')


ax.scatter(0, 0, 0)
ax.scatter(3, 3, 3)
plt.show()


PythonでNumPyを使ってユークリッド距離を計算する。

まず、NumPyのライブラリをインストールする必要があります。

$ pip install numpy


インポートして、直交座標を (0, 0, 0) と (3, 3, 3) とする2点を設定しましょう。

import numpy as np
# Initializing the points
point_1 = np.array((0, 0, 0))
point_2 = np.array((3, 3, 3))


さて、手動で計算する代わりに、NumPyのヘルパーメソッドを利用して、もっと簡単に計算してみましょう!NumPyのヘルパーメソッドは、以下のようになります。

np.sqrt()とnp.sum()

ユークリッド距離の計算に必要な演算や数学関数は、足し算、引き算、平方根関数と、とてもシンプルです。

複数の足し算は、和に置き換えることもできます。

d(p,q)=2√(q1−p1)2+(q2−p2)2+(q3−p3)2d(p,q)=(q1−p1)2+(q2−p2)2+(q3−p3)22
d(p,q) = sqrt[2]{(qttp_1-p_1)^2 + (qttp_2-p_2)^2 + (qttp_3-p_3)^2 } ・・・・・・・・・は?

NumPyには、平方根を表す np.sqrt() 関数と、和を表す np.sum() 関数が用意されています。

これらを使えば、Pythonでユークリッド距離を計算するのは簡単で、直感的に理解することができます。

# Get the square of the difference of the 2 vectors
square = np.square(point_1 - point_2)
# Get the sum of the square
sum_square = np.sum(square)


これは非常にシンプルな結果を与えてくれます。

(0-3)^2 + (0-3)^2 + (0-3)^2


これは27に等しい。

あとは、この数字の平方根を求めればいいだけです。

# The last step is to get the square root and print the Euclidean distance
distance = np.sqrt(sum_square)
print(distance)


この結果は

5.196152422706632


ピトニック精神に則り、これを一行に短縮することができる。

distance = np.sqrt(np.sum(np.square(point_1 - point_2)))


そして、Pythonの math モジュールの組み込みメソッドである pow()sum() を代わりに使用することもできます。

ただし、これらのメソッドは、入力に対して少し手を加える必要があります。

この方法は、直感的には以前使った式に似ていますが、次のようになります。

from math import *
distance = np.sqrt(sum(pow(a-b, 2) for a, b in zip(point_1, point_2)))
print(distance)


これも結果は

5.196152422706632


np.linalg.norm()

np.linalg.norm()関数は Mathematical ノルムを表現します。

本質的に、ベクトルのノルムはその長さです。

この長さは必ずしもユークリッド距離である必要はなく、他の距離であっても構いません。

ユークリッド距離は、ベクトルの L2 ノルム(ユークリッドノルムとも呼ばれます)であり、デフォルトでは、norm()関数は L2 を使用します -ord` パラメータは 2 に設定されています。

もし、ord パラメータを他の値 p に設定すると、他の p-ノルムを計算することになります。

例えば、あるベクトルの L1 ノルムはマンハッタン距離です。

このことを考えると、 np.linalg.norm() 関数を使って簡単にユークリッド距離を計算することができ、他の関数を使うよりもずっときれいに計算することができるのです。

distance = np.linalg.norm(point_1-point_2)
print(distance)


この結果、L2/Euclidean距離が表示されます。

5.196152422706632


L2正規化、L1正規化は機械学習において入力データの正規化に多用されます。

>
特徴量のスケーリングについてもっと知りたい方は、Scikit-Learnを使ったデータの特徴量スケーリングガイドをご覧ください! > L2/Eucidean距離とL1正規化は、機械学習でよく使われます。

ということです。

np.dot()

ユークリッド距離の計算には、内積を使うこともできます。

数学では、ドットプロダクトは2つの同じ長さのベクトルを掛け合わせた結果、1つの数値、つまりスカラー値となります。

戻り値の型から、「スカラー積」とも呼ばれることがある。

この演算は、2つのベクトルに対して内積と呼ばれることもあります。

2つのベクトル間の内積を計算するには、以下の式を使用します。

→p⋅→q=(q1−p1)+(q2−p2)+(q3−p3)p→⋅q→=(q1−p1)+(q2−p2)+(q3−p3)
ȂȂȂ cdot vec{q} = {(qazu_1-pazu) + (qazu_2-pazu) + (qazu_3-pazu) }.

NumPyでは、2つのベクトルを渡してnp.dot()関数を使用することができます。

2つの点の差とその差の内積を計算すると、2つのベクトル間のユークリッド距離と同じ関係にある数値が得られます。

この数値の平方根を求めると、求めている距離になる。

# Take the difference between the 2 points
diff = point_1 - point_2
# Perform the dot product on the point with itself to get the sum of the squares
sum_square = np.dot(diff, diff)
# Get the square root of the result
distance = np.sqrt(sum_square)
print(distance)


もちろん、これを1行に短縮することもできる。

distance = np.sqrt(np.dot(point_1-point_2, point_1-point_2))
print(distance)


5.196152422706632


組み込みの math.dist() を使用する

Python は math モジュールに、3次元空間の2点間の距離を計算するビルトインメソッドを備えています。

しかし、これは Python 3.8 以降で動作します。

math.dist() は2つのパラメータ(2点)を受け取り、それらの点間のユークリッド距離を返します。

注:2点は同じ次元でなければならない(つまり、両方とも2次元または3次元空間でなければならない)ことに注意。

さて、これらの2点間のユークリッド距離を計算するには、dist() メソッドに2点をチャックするだけです。

import math
distance = math.dist(point_1, point_2)
print(distance)


5.196152422706632


結論

ユークリッド距離とは、ユークリッド空間内の系に関わる基本的な距離測度である。

>
ユークリッド空間は、数学の授業でおなじみの古典的な幾何学的空間で、一般に3次元に束縛されている。

しかし、非負の整数の次元にも適用できる。

ということです。

ユークリッド
ユークリッド距離とは、ユークリッド空間における2点間の最短距離のことである。

ユークリッド距離は、データマイニングや機械学習、その他様々な分野で利用されており、基本的な距離測定の一つである。

タイトルとURLをコピーしました