ユークリッド距離の数学的定義からGISや機械学習での実務的な使い方、高次元データで起こる距離集中、埋め込み空間における距離の意味、さらにFAISSやHNSWなどの近似最近傍探索まで、現代のデータ分析でユークリッド距離を適切に使うための考え方を解説します。
はじめに:なぜ今、ユークリッド距離を「再考」するのか?
ユークリッド距離は、2点間を直線で結んだときの長さを表す、最も基本的な距離の一つです。統計学、機械学習、画像処理、GIS、レコメンド、ベクトル検索など、現在のデータ活用を支える多くの技術で利用されています。
一方で、「数字が近ければ意味的にも近い」とは限りません。特徴量の単位が異なれば距離は簡単に歪み、地理データでは座標系によって結果が変わり、高次元空間では距離そのものの識別力が低下することがあります。さらに生成AIやRAGで一般化したベクトル検索では、数百〜数千次元の埋め込みに対して距離を計算する場面も増えました。
つまり現代における重要な問いは、「ユークリッド距離を使うかどうか」だけではありません。どの空間で、どの特徴量を、どの尺度にそろえ、どの距離として比較するのかを設計することが本質です。
まずは定義を正確に — ユークリッド距離を一行で
2つのベクトル
x,y∈Rn\mathbf{x},\mathbf{y}\in\mathbb{R}^{n}
に対して、ユークリッド距離は次のように定義されます。
d(x,y)=∑i=1n(xi−yi)2d(\mathbf{x},\mathbf{y}) = \sqrt{\sum_{i=1}^{n}(x_i-y_i)^2}
これはL2距離とも呼ばれ、L2ノルム
∥x−y∥2\|\mathbf{x}-\mathbf{y}\|_2
に対応します。非負性、同一性、対称性、三角不等式を満たすため、数学的な意味での「距離」です。
たとえば、A=(1,2,3)、B=(2,0,4)なら、各座標の差は(-1,2,-1)なので、距離は
1+4+1=6≈2.449\sqrt{1+4+1}=\sqrt6\approx2.449
となります。
ただし機械学習では、距離そのものではなく二乗ユークリッド距離を使う場合もあります。k-meansが代表例で、平方根を省いた二乗距離の和を最小化することで計算を扱いやすくしています。
実務で使う前に確認したい6つのポイント
第一に確認すべきなのは単位とスケールです。年齢、年収、購入回数のように単位や値の範囲が異なる変数をそのまま比較すると、値の大きな特徴量が距離を支配します。標準化やMin-Maxスケーリング、ロバストスケーリングなどを目的に応じて選ぶ必要があります。
第二は外れ値です。差を二乗するため、極端な値が距離へ強く影響します。外れ値がノイズなら前処理を検討すべきですが、重要な異常値まで削除すると情報を失うため、単純な除去ではなく分析目的との整合性が重要です。
第三は次元数だけでなくデータの構造です。高次元になるほど距離集中が問題になり得ますが、「10次元なら危険」「20次元なら使えない」のように一律の境界を設定することは適切ではありません。分布、相関、冗長な特徴、データの内在次元などによって状況が変わります。近年の研究でも、ランダムな高次元ベクトルと実際のテキスト埋め込みでは、最近傍探索の意味が異なることが示されています。
第四はデータ型です。カテゴリ変数を単純に0、1、2と数値化してユークリッド距離を計算しても、「0と1の差」と「1と2の差」に意味があるとは限りません。カテゴリなら適切な符号化や別の類似度、混合データならGower距離など、データの性質に合わせた方法を検討します。
第五は地理座標の扱いです。緯度・経度は角度であり、そのまま平面上のメートルとして扱うことはできません。対象地域や目的に応じた投影座標系、あるいは地球楕円体上の測地距離を選択する必要があります。
第六は計算量です。N個のデータについてすべての組み合わせを比較すると、単純な総当たりでは計算量が急増します。データが大規模になれば、KD-tree、HNSW、IVF、PQなどの索引・近似技術を検討することになります。
GISでは「直線距離」が本当に欲しい距離なのか
GISにおけるユークリッド距離は、「空間上の2点を直線で結んだ距離」という意味で非常に便利です。ArcGIS ProのEuclidean Distanceは、各セルから最も近いソースまでの距離を計算でき、平面上のPlanar距離だけでなく、楕円体上のGeodesic距離も選択できます。
ここで重要なのが投影座標系です。投影座標系は線形単位を使う平面座標として扱えるため、対象地域に適した投影を選ぶことで距離を扱いやすくなります。
一方、「最寄り店舗まで直線で500m」と「道路を実際に歩いて500m」は同じではありません。道路網、河川、鉄道、建物などの障害物がある場合、ネットワーク距離やコスト距離のほうが現実に近いことがあります。
つまりGISでは、計算できる距離と、意思決定に必要な距離を混同しないことが重要です。
機械学習ではk-NNやk-meansが代表例
ユークリッド距離は機械学習でも基本的な役割を持ちます。
k-NNでは、入力データから距離の近い学習データを探し、その近傍のラベルなどを利用して分類・回帰します。scikit-learnのNearestNeighborsでも、Minkowski距離のp=2が標準的なユークリッド距離に対応しています。
k-meansでは、各データとクラスタ中心との二乗ユークリッド距離を基準にクラスタを更新します。そのため、特徴量のスケールや外れ値の影響を強く受けます。
一方、テキストや画像などの埋め込みでは、単純な生データの距離とは事情が異なります。ベクトルの方向を重視するならコサイン類似度、座標ごとの差の総量を重視するならL1距離など、目的に応じて比較方法を選びます。
高次元で起きる「距離集中」はどう考えるべきか
ユークリッド距離を語るうえで避けられないのが、いわゆる次元の呪いです。
高次元になると、異なる点同士の距離が似た値に集中し、「最も近い点」と「かなり遠い点」の違いが相対的に小さくなる場合があります。これが距離集中です。結果として、最近傍探索や距離ベースのクラスタリングで「距離の大小」が持つ意味が弱くなることがあります。高次元空間における距離や最近傍の振る舞いは、古くから理論的に研究されており、近年も距離集中や内在次元との関係が研究されています。
ただし、ここで重要なのは「次元が高ければユークリッド距離は必ず役に立たない」という意味ではないことです。2024年の研究では、数千次元にもなる高密度ベクトルについて、ランダムベクトルと実際のテキスト埋め込みでは最近傍探索の性質が異なり、実データの埋め込みは高次元化しても比較的意味のある近傍関係を維持する場合があることが報告されています。
したがって現在の実務では、「何次元だから危険」と決めつけるより、近傍検索の評価指標や検索結果を実データで検証することが重要です。
解決策は「距離を変える」だけではない
距離集中への対策としては、まず不要な特徴量を削減する方法があります。相関の強い変数やノイズの多い変数を整理し、PCAなどで低次元表現へ変換する方法も代表的です。
ただし、t-SNEやUMAPは主として可視化や構造探索を目的とする手法であり、「2次元にしたから、そのユークリッド距離をそのまま業務上の距離として使える」とは限りません。
もう一つの考え方が埋め込み学習です。Siamese NetworkやTriplet Loss、コントラスト学習などでは、似たデータが近く、異なるデータが遠くなるように表現空間そのものを学習できます。すると、元の特徴量空間では意味を持たなかったL2距離が、学習後の潜在空間では有用な類似度として機能する可能性があります。
近年の研究では、高次元空間の中に低次元の構造が存在する「内在次元」や多様体構造を考慮することも重要視されています。
大規模化したらANNが現実解になる
数百万、数億規模のベクトルを毎回すべて比較するのは現実的ではありません。そこで利用されるのがApproximate Nearest Neighbor(ANN:近似最近傍探索)です。
代表的な実装の一つがFAISSです。現在のFAISSには、L2の完全探索を行うIndexFlatL2に加え、HNSW、IVF、Scalar Quantization、Product Quantizationなど複数の方式が用意されています。つまり、検索精度だけでなくメモリ使用量やレイテンシとのトレードオフを設計できます。
HNSWはベクトル同士をグラフとして構成し、すべてのデータを調べずに近傍を探索する方式です。検索精度と速度のバランスをパラメータで調整できる一方、グラフ構造を保持するためメモリ消費や更新方法には注意が必要です。FAISSのドキュメントでも、MやefSearchなどが精度と計算コストを左右する主要パラメータとして整理されています。
ScaNNも大規模なベクトル類似検索を目的とした技術で、量子化や探索空間の枝刈りを利用し、内積だけでなくユークリッド距離にも対応しています。
ここで大切なのは、ANNは「ユークリッド距離を別の距離に変える技術」ではなく、同じ類似検索をより少ない計算で近似的に実行するための技術だという点です。
最小限のPython実装
基本的な計算だけならNumPyで十分です。
import numpy as np
def euclidean(a, b):
return np.linalg.norm(a - b)
a = np.array([1.0, 2.0, 3.0])
b = np.array([2.0, 0.0, 4.0])
print(euclidean(a, b))
# 2.449489742783178
実際の最近傍探索では、データ量や検索回数に応じてscikit-learn、FAISSなどを利用します。scikit-learnではNearestNeighborsによってユークリッド距離を含む複数の距離を扱えます。
ケーススタディ:都市分析と商品レコメンド
都市分析で店舗から最寄り施設までの距離を求めるなら、ユークリッド距離はシンプルで高速です。しかし道路網に沿った移動時間を知りたいなら、ネットワーク距離など別の指標が必要になります。
一方、商品レコメンドでは、商品説明や画像から生成した埋め込みをベクトル化し、近いベクトルを検索する構成が一般的です。この場合、重要なのは「L2が正しい」と最初から決めることではありません。利用する埋め込みモデルが想定する類似度、ベクトルの正規化方法、検索インデックス、そして実際の推薦品質を一体として評価する必要があります。
特にベクトルをL2正規化すると、コサイン類似度とL2距離の順位関係を結び付けられるため、検索システムの設計では距離の選択だけでなくベクトル前処理と検索メトリックの整合性が重要になります。FAISSでも正規化ベクトルを用いた内積検索をコサイン類似度として利用できることが説明されています。
まとめ:ユークリッド距離の本当の使いどころ
ユークリッド距離は古典的な数学概念ですが、AI・GIS・ベクトル検索が発展した現在でも重要な基本技術です。ただし、重要なのは「とりあえずL2を使う」ことではありません。
低次元で特徴量の意味と尺度が明確なら、ユークリッド距離は非常に扱いやすい選択肢です。一方、異なる単位の特徴量、外れ値、カテゴリ変数、地理座標、高次元埋め込み、大規模検索が絡むと、前処理や距離関数そのものの設計が結果を左右します。
特に現代のAIでは、「どの距離を使うか」よりも「どの表現空間で距離を測るか」が重要になっています。生の特徴量をそのまま比較するのか、正規化するのか、低次元化するのか、学習済み埋め込みを使うのか。その選択によって、同じユークリッド距離でも意味は大きく変わります。
ユークリッド距離は古い技術だから不要なのではありません。むしろ、距離を測る対象となる空間そのものを設計する時代になったからこそ、ユークリッド距離の意味を正しく理解する価値が高まっているのです。

