マンハッタン距離(L1)を本音で使いこなす:定義・実装・実務での選び方ガイド
マンハッタン距離(タクシー距離・L1ノルム)の定義から実装、k-NNや正則化との関係、スパースデータでの利点と落とし穴、実運用での「いつ使うか/使わないか」まで、実務で使える視点とコード例を交えて解説します。機械学習エンジニアやデータサイエンティスト必読の実践ガイド。
目次
はじめに:なぜ今マンハッタン距離を再評価すべきか
マンハッタン距離(Manhattan distance、別名:タクシー距離、L1距離)は、ベクトルの各座標差の絶対値を合計する単純な距離尺度です。直感的には「碁盤目状の道を移動するときの移動量」を表します。数式で表すと、2点 x,y∈Rdx,y \in \mathbb{R}^dx,y∈Rd に対して
dL1(x,y)=∑i=1d∣xi−yi∣d_{L1}(x,y)=\sum_{i=1}^d |x_i-y_i|
dL1(x,y)=i=1∑d∣xi−yi∣
となります。定義や基礎的な説明は入門記事で丁寧に示されています。
マンハッタン距離の「本質」:定義と性質
マンハッタン距離は L1 ノルムに基づくメトリックで、距離の定義自体が座標ごとの誤差の総和を測る点に特徴があります。ユークリッド距離(L2)は二乗和の平方根で「長さ」を測るのに対し、L1は「合計誤差」を重視します。この違いは外れ値への感度やスパース性との親和性に直結します。数学的性質や高校数学的な解説もまとまっています。学びTimes
重要な性質(要点)
- ノルムとして三角不等式を満たす(メトリックである)。
- L1は成分ごとの寄与が線形和で表れるため「どの次元で誤差が出たか」が分かりやすい。
- L2に比べて外れ値(極端な1次元の差)が距離に与える影響が相対的に小さい場合が多い。
実装と高速化 — 実用コード(NumPy)
実務でよく使う、点集合A(n×d)と点集合B(m×d)間のマンハッタン距離行列をNumPyで高速に計算する例:
import numpy as np
# A: (n, d), B: (m, d)
def manhattan_distance_matrix(A, B):
# ブロードキャストを利用:|A[:,None,:] - B[None,:,:]| -> (n,m,d)
return np.abs(A[:, None, :] - B[None, :, :]).sum(axis=2)
# 例
A = np.array([[1,2],[3,4]]) # (2,2)
B = np.array([[0,0],[2,2],[5,5]]) # (3,2)
D = manhattan_distance_matrix(A, B)
print(D) # (2,3) 行: Aの点、列: Bの点
ベクトル化すればPythonレベルのループを回避してC実装(NumPy)で高速化できます。大規模データではメモリフットプリントに注意し、ミニバッチ化やGPU(CuPyなど)の利用を検討してください。Qiitaの実装例も参考になります。
実務での選び方:L1 vs L2(ユークリッド) — 具体的チェックリスト
L1(マンハッタン距離)を選ぶ理由
- 特徴がスパース(多くがゼロ)で、次元ごとの寄与を明確にしたいとき。
- 外れ値を完全に無視したくはないが、L2ほど二乗で増幅したくない場合。
- L1正則化(LASSO)のようにスパース性と親和性があるモデル設計を行う場合。
L2(ユークリッド)を選ぶ理由
- 連続的な幾何学的距離感(回転や直線距離)が重要な場合。
- 誤差が二乗和で意味を持つ統計的仮定(例:ガウスノイズ)を仮定できる場合。
実務の判断フロー(簡易)
- データの分布と特徴量スケールを可視化する(boxplot, hist)。
- 特徴がスパースならL1系、連続ならL2をまず試す。
- k-NNなど距離ベースモデルなら交差検証で評価(標準化は必須)。
- 次元が高い場合は次元削減(PCA)や近似近傍探索を導入してから評価。
応用ケーススタディ(実例で考える)
k-NN分類での使い分け
k-NNでは距離がそのまま予測に影響します。カテゴリデータのワンホット表現やバイナリ特徴にはL1が合うことが多く、画像や埋め込みベクトルのような連続値にはL2の方が直感的に良い場合があります。実務では同一データセットでL1/L2両方を評価することが手堅いです。
LASSO(L1正則化)との関係
機械学習の正則化では、L1ノルムはパラメータをスパース化する効果があるため、解釈性や特徴選択を重視する場合に有用です(LASSO)。L1距離の「スパース性と親和性」は理論的にも実務的にも見逃せない性質です。
ロボティクス/経路計画、都市解析
格子状マップや碁盤目都市(例:マンハッタン、京都の一部)では実移動コストがL1に近くなるため、経路評価や近傍探索でL1が現実的な指標となります。具体例や直感的な説明は参考記事にもあります。
注意点と落とし穴(避けるための実務ルール)
- スケーリング:各次元の単位がバラバラだと特定次元が距離を支配します。必ず標準化(Zスコア)や正規化を行いましょう。
- 次元の呪い:次元が非常に高いと距離の違いが薄れる(局所性が失われる)ため、次元削減や特徴選択が不可欠です。
- 回転に対する不変性の欠如:L1は軸に沿った誤差に敏感で、データ空間を回転すると挙動が変わる点に注意。
- 近似近傍探索の選択:KD-treeはL2に有利な設計が多いため、L1向けにはプローブ数やハッシュ法など実装を工夫してください。Qiitaや技術ブログの実装ヒントが役立ちます。
発展:学習距離と重み付きL1、近似手法
近年は距離自体を学習する「メトリック学習」が普及しており、単純なL1を重み付きL1や線形変換で補強することで、タスクに沿った類似度を作れます(学習された重みで重要次元を強調)。また、大規模集合ではLSH(ローカリティセンシティブハッシング)、ランダム投影、GPUベクトル化などで実用的に加速できます。研究や実装のアップデートを常に追う価値があります。
実践チェックリスト(デプロイ前に確認)
- 特徴量のスケールは統一されているか(標準化/正規化済み)
- L1とL2を比較するA/B評価を行ったか
- 次元数が大きければPCAやL1による特徴選択を試したか
- 大規模データなら近似近傍探索やバッチ計算で速度評価済みか
- モデルの解釈性(重要次元の特定)が必要な場合、重み付きL1やLASSOを検討したか
まとめ(3分で決断)
マンハッタン距離はシンプルで解釈しやすく、スパースデータや特徴選択、碁盤目状の空間など実務で有用になる場面が明確です。一方でスケーリングや高次元の問題を無視すると性能低下を招きます。まずは小さなプロトタイプでL1とL2を比較評価し、必要に応じて重み付きL1や近似探索を組み合わせる——これが実務での王道アプローチです。
