Pythonでマスターする!ユークリッド距離の計算法と応用例10選

Pythonを用いたユークリッド距離の計算と応用例のサンプルコードPython
この記事は約17分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonとユークリッド距離の応用についての記事を手に取っていただきありがとうございます。

Pythonはプログラミングの世界で広く使われている言語の一つで、その理由の一つはその汎用性と使いやすさにあります。

今回は、そのPythonを使用して、ユークリッド距離という概念を探求し、それを活用する方法について見ていきましょう。

●ユークリッド距離とは

ユークリッド距離は、私たちが普段生活している三次元空間における、二つの点間の直線距離を計算する方法です。

幾何学の基本的な概念であり、データ分析から機械学習、画像処理まで幅広い分野で利用されています。

○ユークリッド距離の計算法

ユークリッド距離は二つの点の座標を知っていれば計算することができます。

具体的には、二次元空間では次のように計算されます。

  1. 各座標の差(Δx、Δy)を計算する。
  2. それぞれの差を二乗する。
  3. 二乗した差を合計する。
  4. 合計した値の平方根を取る。

この計算法は、三次元空間、さらにはn次元空間にも拡張することができます。

●Pythonを使ったユークリッド距離の計算

では、Pythonを使って具体的にユークリッド距離を計算してみましょう。

○サンプルコード1:2次元空間におけるユークリッド距離の計算

このコードではPythonのmathライブラリを用いて二次元空間における二つの点間のユークリッド距離を計算しています。

import math

# ポイントの座標を定義
point1 = [1, 2]
point2 = [4, 6]

# ユークリッド距離の計算
distance = math.sqrt((point2[0] - point1[0])**2 + (point2[1] - point1[1])**2)

print(distance)

このコードを実行すると、「5.0」という結果が出力されます。

これは、座標(1,2)と座標(4,6)の間のユークリッド距離が5であることを表しています。

○サンプルコード2:3次元空間におけるユークリッド距離の計算

同様に、このコードでは三次元空間における二つの点間のユークリッド距離を計算しています。

import math

# ポイントの座標を定義
point1 = [1, 2, 3]
point2 = [4, 6, 9]

# ユークリッド距離の計算
distance = math.sqrt((point2[0] - point1[0])**2 + (point2[1] - point1[1])**2 + (point2[2] - point1[2])**2)

print(distance)

このコードを実行すると、「7.810249675906654」という結果が出力されます。

これは、座標(1,2,3)と座標(4,6,9)の間のユークリッド距離を表しています。

●ユークリッド距離の応用例

Pythonでユークリッド距離の計算を行うことにより、さまざまなアプリケーションで使用できます。

ここでは、ユークリッド距離を用いたいくつかの一般的な応用例を具体的なサンプルコードとともに紹介します。

○サンプルコード3:類似度計算

ユークリッド距離は、データ間の類似度を計算するために広く利用されています。

具体的には、二つのデータポイント間の距離が近いほど、それらは互いに類似していると考えられます。

下記のコードは、Pythonを使用して2つのベクトル間のユークリッド距離を計算するものです。

この例では、[1, 2]と[3, 4]という二つのベクトルを用いて類似度を計算しています。

import math

def euclidean_distance(vec1, vec2):
    return math.sqrt(sum(pow(a-b, 2) for a, b in zip(vec1, vec2)))

vec1 = [1, 2]
vec2 = [3, 4]
print(euclidean_distance(vec1, vec2))

このコードを実行すると、結果は約2.828となります。

これは、vec1とvec2という2つのベクトル間のユークリッド距離を表しています。

この値が小さいほど、2つのベクトルは互いに類似していると解釈できます。

○サンプルコード4:クラスタリング

ユークリッド距離はクラスタリングのアルゴリズムでも利用されます。

クラスタリングは、データを自然なグループに分ける方法で、それぞれのデータポイントを最も近いクラスターの中心に割り当てます。

下記のコードは、K-meansクラスタリングを行うもので、この例ではscikit-learnのKMeansクラスを使用しています。

from sklearn.cluster import KMeans
import numpy as np

data = np.array([[1, 2], [5, 8], [1.5, 1.8], [8, 8], [1, 0.6], [9, 11]])
kmeans = KMeans(n_clusters=2)  # 2つのクラスターを指定
kmeans.fit(data)

print(kmeans.cluster_centers_)  # クラスターの中心を出力

このコードを実行すると、それぞれのクラスターの中心の座標が出力されます。

これは、各クラスター内の全てのデータポイントからのユークリッド距離の平均が最小になる点を表しています。

○サンプルコード5:画像処理

画像処理では、画像間の類似度を評価するために、ユークリッド距離が使用されます。

具体的には、各ピクセルの色情報をベクトルとし、その間の距離を計算することで、画像間の差異を評価します。

下気のコードは、PythonのライブラリであるOpenCVを使用して、二つの画像間のユークリッド距離を計算するサンプルコードです。

この例では、「image1.jpg」と「image2.jpg」という二つの画像を比較しています。

import cv2
import numpy as np

def calculate_euclidean_distance(image1, image2):
    image1 = cv2.imread(image1)
    image2 = cv2.imread(image2)
    return np.sqrt(np.sum((image1-image2)**2))

image1 = 'image1.jpg'
image2 = 'image2.jpg'
print(calculate_euclidean_distance(image1, image2))

このコードを実行すると、結果は二つの画像間のユークリッド距離となります。

この距離が小さいほど、二つの画像は類似していると解釈できます。

これは例えば、異なる角度から撮影された同じ物体の画像や、同じシーンの異なる時間帯の画像を比較する際などに有用です。

○サンプルコード6:機械学習

ユークリッド距離は機械学習の分野でも広く用いられます。

特に、教師なし学習の一種であるクラスタリングや、教師あり学習の一種であるk-最近傍法(k-NN)では、データポイント間のユークリッド距離を計算することが頻繁に行われます。

下記のコードは、k-NNアルゴリズムを用いて新しいデータポイントのクラスを予測するものです。

この例ではscikit-learnのKNeighborsClassifierクラスを使用しています。

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris

iris = load_iris()
X, y = iris.data, iris.target

model = KNeighborsClassifier(n_neighbors=3)  # 最近傍の3つのデータポイントを使用
model.fit(X, y)

new_data = [[5.1, 3.5, 1.4, 0.2]]
print(model.predict(new_data))  # 新しいデータポイントのクラスを予測

このコードを実行すると、新しいデータポイントのクラスが出力されます。

このクラスは、新しいデータポイントから最も近い3つのデータポイントのクラスの多数決により決定されます。

このように、ユークリッド距離は機械学習アルゴリズムの中核的な部分を形成しています。

○サンプルコード7:最適化問題

最適化問題もまた、ユークリッド距離が頻繁に使用されます。

具体的には、旅行する販売員問題(TSP)のような組み合わせ最適化問題で、すべての都市間の距離を計算するために使用されます。

下記のコードは、全都市間のユークリッド距離を計算し、それを行列として返す例です。

この例では、都市の位置は2次元平面上の座標として表現されます。

import numpy as np

def calculate_distance_matrix(cities):
    num_cities = len(cities)
    distance_matrix = np.zeros((num_cities, num_cities))
    for i in range(num_cities):
        for j in range(i+1, num_cities):
            distance = np.sqrt(np.sum((np.array(cities[i]) - np.array(cities[j]))**2))
            distance_matrix[i, j] = distance
            distance_matrix[j, i] = distance
    return distance_matrix

cities = [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
print(calculate_distance_matrix(cities))

このコードを実行すると、各都市間のユークリッド距離を要素とする行列が出力されます。

この行列はTSPのような問題を解く際に重要な役割を果たします。

また、この距離行列は、DijkstraのアルゴリズムやFloyd-Warshallのアルゴリズムなど、最短経路問題を解くためのアルゴリズムにも利用されます。

○サンプルコード8:ロボティクス

ロボティクスの分野でも、ユークリッド距離は頻繁に使用されます。

例えば、ロボットが目的地に向かう最短経路を計画する際や、センサーデータから物体までの距離を計算する際に用います。

下記のサンプルコードでは、2D空間上でのロボットの現在地と目的地までのユークリッド距離を計算します。

import numpy as np

def calculate_distance(point1, point2):
    return np.sqrt(np.sum((np.array(point1) - np.array(point2))**2))

robot_position = (1, 1)
goal_position = (4, 5)
print(calculate_distance(robot_position, goal_position))

このコードを実行すると、ロボットの現在地と目的地までのユークリッド距離が出力されます。

この距離はロボットがどれだけ移動すべきかを知るための基本的な情報であり、経路計画や制御のためのアルゴリズムに利用されます。

また、このような距離計算は、ロボットが周囲の環境を認識する際の物体認識やスラム(自己位置推定と地図作成)の技術にも応用されます。

○サンプルコード9:情報検索

情報検索の分野では、ユークリッド距離は文章の類似度を計算する際に使用されます。

文章のベクトル化(例えばTF-IDFなどの手法を用いて)を行った後、ユークリッド距離を用いて、その間の距離=類似度を求めることができます。

下記のサンプルコードは、文書をTF-IDFでベクトル化し、そのベクトル間のユークリッド距離を計算します。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import euclidean_distances

def calculate_document_distance(doc1, doc2):
    vectorizer = TfidfVectorizer()
    tfidf = vectorizer.fit_transform([doc1, doc2])
    return euclidean_distances(tfidf[0:1], tfidf[1:2])

doc1 = "Pythonは機械学習でよく使われるプログラミング言語です"
doc2 = "PythonはWeb開発にも使える便利な言語です"
print(calculate_document_distance(doc1, doc2))

上記のコードを実行すると、2つの文章の間のユークリッド距離が出力されます。

この距離が小さいほど、二つの文章はより類似していると考えられます。

類似性の判断は、文書のクラスタリングや検索エンジンなど、情報検索の多くの側面で利用されています。

○サンプルコード10:音声認識

音声認識や自然言語処理の分野でも、ユークリッド距離は頻繁に使用されます。

例えば、音声信号や言語データをベクトルとして表現し、それらの間の類似度を計算する際にユークリッド距離が用いられます。

下記のコードでは、2つの音声信号(ここでは単純化のためにリストを使用)間のユークリッド距離を計算します。

import numpy as np

def calculate_sound_distance(sound1, sound2):
    return np.sqrt(np.sum((np.array(sound1) - np.array(sound2))**2))

sound1 = [1, 2, 3, 4, 5]
sound2 = [2, 3, 4, 5, 6]
print(calculate_sound_distance(sound1, sound2))

このコードを実行すると、二つの音声信号間のユークリッド距離が出力されます。

この距離は、音声認識のアルゴリズムや音声分類、音声のクラスタリングなど、音声データを扱う様々なアプリケーションで利用されます。

●Pythonでのユークリッド距離計算の注意点

Pythonを用いてユークリッド距離を計算する際のいくつかの注意点を挙げます。

まず第一に、ユークリッド距離は二つのベクトル間の直線距離を測定するため、ベクトルの次元数が一致していることが前提です。

これは、ベクトルの各要素間の差を計算するためで、次元数が一致しない場合にはエラーが発生します。

次に、ユークリッド距離は絶対的な距離を示すため、ベクトルのスケールが大きい場合や値の範囲が広い場合には、ユークリッド距離も大きくなる傾向があります。

このため、比較を行う前にデータのスケーリング(標準化や正規化など)を行うことが推奨されます。

最後に、Pythonの計算においては浮動小数点の誤差に注意が必要です。

極めて近い二つの数値の差が0と認識されない場合があります。

そのため、結果を評価する際には、適切な精度で四捨五入を行うなどの対策が必要です。

下記のサンプルコードは、二つのベクトル間のユークリッド距離を計算する際のこれらの注意点を表しています。

import numpy as np

# 正規化を行う関数
def normalize(vector):
    return vector / np.linalg.norm(vector)

# ベクトルの作成
vector1 = np.array([100, 200, 300, 400, 500])
vector2 = np.array([200, 300, 400, 500, 600])

# ベクトルの正規化
norm_vector1 = normalize(vector1)
norm_vector2 = normalize(vector2)

# ユークリッド距離の計算
dist = np.linalg.norm(norm_vector1 - norm_vector2)

# 誤差の考慮
dist_rounded = round(dist, 4)

print(dist_rounded)

このコードでは、まず二つのベクトルを作成し、それらを正規化してからユークリッド距離を計算しています。

そして最後に、浮動小数点の誤差を考慮し、結果を四捨五入しています。

以上の注意点を押さえておけば、Pythonでユークリッド距離を計算する際に、より正確で実用的な結果を得ることができます。

●カスタマイズ方法

ユークリッド距離の計算自体は簡単ですが、それをどのように応用するかは具体的な問題やデータによります。

しかし、いくつかの一般的なカスタマイズ方法を紹介します。

  1. 加重ユークリッド距離:各次元に重みを付けることで、特定の特徴量が距離計算により大きな影響を与えるようにします。
    例えば、ある特徴が他の特徴より重要である場合などに使用します。
  2. 別の距離尺度の使用:ユークリッド距離以外にも多くの距離尺度が存在します。例えばマンハッタン距離、チェビシェフ距離、マハラノビス距離などです。
    それぞれ異なる特性を持つため、具体的な問題に応じて最適な距離尺度を選択します。

これらのカスタマイズ方法は、Pythonの強力な数値計算機能を用いて簡単に実装できます。

また、ユークリッド距離計算はnumpyやscipyなどのライブラリを活用することで、さらに高速かつ簡単に行うことができます。

○サンプルコード11:Numpyを用いたユークリッド距離の計算

Pythonの数値計算ライブラリであるNumpyを用いて、ユークリッド距離を計算する方法を次のサンプルコードで紹介します。

import numpy as np

# ベクトルの作成
vector1 = np.array([1, 2, 3])
vector2 = np.array([4, 5, 6])

# ユークリッド距離の計算
dist = np.linalg.norm(vector1 - vector2)

print(dist)

このサンプルコードでは、まずNumpyを用いて二つのベクトルを作成しています。

そして、ベクトルの差を計算し、そのノルム(ユークリッド距離)を計算するためにNumpyの関数np.linalg.normを使用しています。

実行すると、次のように出力されます。

5.196152422706632

この値はベクトル[1, 2, 3]とベクトル[4, 5, 6]のユークリッド距離を表しています。

このコードの中で、np.linalg.normはベクトルの長さ(ノルム)を計算する関数で、ここでは二つのベクトルの差のノルムとしてユークリッド距離を計算しています。

ユークリッド距離の計算はこのように短いコードで実現でき、そのシンプルさがPythonを用いた数値計算の魅力の一つです。

次に、Scipyという科学計算ライブラリを用いたユークリッド距離の計算方法を見ていきましょう。

○サンプルコード12:Scipyを用いたユークリッド距離の計算

Pythonの科学計算ライブラリであるScipyも、ユークリッド距離を計算するために使用できます。

Scipyのscipy.spatial.distance.euclidean関数を用いると、直接二つのベクトル間のユークリッド距離を計算できます。

下記のサンプルコードでは、Scipyを用いたユークリッド距離の計算方法を示しています。

from scipy.spatial.distance import euclidean

# ベクトルの作成
vector1 = [1, 2, 3]
vector2 = [4, 5, 6]

# ユークリッド距離の計算
dist = euclidean(vector1, vector2)

print(dist)

このコードを実行すると、先程のNumpyを用いた計算と同様の結果が得られます。

5.196152422706632

このサンプルコードでは、Scipyのeuclidean関数を使って二つのベクトル間のユークリッド距離を直接計算しています。

こちらも非常にシンプルなコードでユークリッド距離の計算を実現できます。

まとめ

この記事では、Pythonを使ってユークリッド距離を計算する方法をマスターしました。

具体的には、NumpyとScipyという2つの重要な科学計算ライブラリを使用したユークリッド距離の計算方法について詳しく説明しました。

Numpyを使ったユークリッド距離の計算では、2つのベクトルを作成し、それらの差のノルム(長さ)を計算するnp.linalg.norm関数を使ってユークリッド距離を計算しました。

そしてScipyを用いたユークリッド距離の計算では、scipy.spatial.distance.euclidean関数を直接使用して2つのベクトル間のユークリッド距離を計算しました。

ユークリッド距離は、データ分析や機械学習の中で頻繁に用いられる重要な概念です。

特に、クラスタリング(データのグループ分け)や類似度の計算などのタスクでよく使われます。

この記事で紹介したNumpyとScipyを使ったユークリッド距離の計算方法は、非常にシンプルでありながら強力なツールです。

Pythonの数値計算能力とそのシンプルさが、データ分析や機械学習の現場でPythonが愛されている理由の一つでしょう。

これらのユークリッド距離の計算方法をマスターすることで、あなたのデータ分析や機械学習のプロジェクトがさらに進化することでしょう。

これからもPythonを活用し、様々な問題に挑戦してみてください。

本記事がPythonを使ったユークリッド距離の計算、そしてその応用例を理解する一助となれば幸いです。

プログラミングの世界は広大で、まだまだ学ぶべきことがたくさんあります。

一歩一歩、確実にスキルを上げていきましょう。