マンハッタン距離(タクシー距離・L1ノルム)の定義から実装、k-NNやLASSOとの関係、スパースデータや高次元データにおける特徴、L2との違い、さらに近似最近傍探索やメトリック学習まで、マンハッタン距離を実務で「いつ使うべきか」「いつ避けるべきか」を分かりやすく解説します。
はじめに:マンハッタン距離を今あらためて考える理由
マンハッタン距離(Manhattan distance)は、2つのベクトルについて各座標の差の絶対値を合計する距離尺度です。「タクシー距離」や「L1距離」と呼ばれることもあります。名前の由来は、道路が碁盤目状に配置された都市では、建物同士を直線で結ぶ距離ではなく、道路に沿って縦横に移動した距離が実際の移動量に近くなることです。
2点 x,y∈Rdx,y\in\mathbb{R}^d のマンハッタン距離は、
dL1(x,y)=∑i=1d∣xi−yi∣d_{L1}(x,y)=\sum_{i=1}^{d}|x_i-y_i|
と表されます。
一見すると非常に単純ですが、マンハッタン距離は機械学習、データマイニング、画像処理、推薦システム、自然言語処理、グリッド型の経路探索など、幅広い領域で利用されています。特に、特徴量の「差を一つずつ足し合わせる」という性質は、スパースなデータや外れ値の影響を抑えたいケースで重要です。
ただし、「L1だから外れ値に強い」「高次元ならL1が必ず有利」と単純化するのは危険です。距離尺度はデータの分布、特徴量の意味、前処理、探索アルゴリズムとセットで考える必要があります。
マンハッタン距離の最大の特徴は、各次元の誤差を絶対値として計算し、それらを線形に合計することです。
例えば2次元で、点Aが(1,2)、点Bが(4,6)なら、マンハッタン距離は、
∣1−4∣+∣2−6∣=3+4=7|1-4|+|2-6|=3+4=7
となります。一方、ユークリッド距離(L2)なら、
(1−4)2+(2−6)2=5\sqrt{(1-4)^2+(2-6)^2}=5
です。
L2では大きな差を二乗するため、一部の次元で極端な差が生じると、その差が距離に強く反映されます。L1では差を二乗しないため、同じ条件ではL2ほど極端な差を増幅しません。この性質から、L1はL2より外れ値の影響を受けにくい傾向があります。
ただし、「L1は外れ値に強い」という表現には注意が必要です。L1も大きな値の影響を受けるため、外れ値を無視するわけではありません。より正確には、「大きな差を二乗によってさらに増幅しない」という特徴を持つと理解するのが適切です。
また、L1はノルムとして非負性、同一性、対称性、三角不等式を満たします。そのため、単なる類似度ではなく、数学的に扱いやすい距離として多くのアルゴリズムで利用できます。
NumPyで実装するマンハッタン距離
実務では、2点間の距離だけでなく、複数の点集合間にある全距離をまとめて計算するケースがあります。NumPyならブロードキャストを利用してベクトル化できます。
import numpy as np
def manhattan_distance_matrix(A, B):
# A: (n, d), B: (m, d)
return np.abs(A[:, None, :] - B[None, :, :]).sum(axis=2)
A = np.array([
[1, 2],
[3, 4]
])
B = np.array([
[0, 0],
[2, 2],
[5, 5]
])
D = manhattan_distance_matrix(A, B)
print(D)
この方法では、Aの各点とBの各点についてL1距離を一括計算できます。Pythonのループを何重にも回すより高速になりやすい一方、途中で n×m×dn\times m\times d の配列を生成するため、大規模データではメモリ消費が問題になります。
データ量が大きい場合は、バッチ単位で距離を計算したり、専用の最近傍探索ライブラリを利用したりする方が現実的です。GPUを利用する場合も、単純にGPUへ移せば速くなるとは限らず、データ転送や中間テンソルのサイズまで含めて評価する必要があります。
L1とL2、どちらを選ぶべきか
実務で最も重要なのは「L1とL2のどちらが優れているか」ではなく、「どちらの距離の意味が、対象データと目的に合っているか」です。
L1は、特徴量ごとの差を積み上げることに意味がある場合に適しています。例えば、ワンホットエンコーディングされた特徴量や、非常に多くの要素がゼロになるスパースなデータでは、L1の解釈が比較的しやすくなります。文書を単語の出現情報として表現したデータなどでも、L1は候補になります。
一方、連続値の特徴量について「空間上の直線距離」を表現したい場合は、L2が自然なことがあります。画像や連続的な特徴ベクトルでも、L2が適切な場合がありますが、画像・埋め込み・特徴表現ではデータの学習方法や正規化によって適切な距離が変わるため、L2を自動的に選ぶべきではありません。
さらに重要なのが、特徴量のスケールです。例えば「年齢」が0〜100、「年収」が0〜2,000万円、「購入回数」が0〜50というデータをそのままL1で比較すると、単位や数値レンジの大きい特徴量が距離を支配します。これはL2でも同様ですが、距離ベースのモデルでは特に深刻です。
したがって、k-NNなどを利用する場合は、標準化や正規化を含めた前処理をパイプライン化し、交差検証によって距離尺度と前処理をまとめて評価することが重要です。
k-NNでは距離の選択がそのまま予測に影響する
k-NN(k近傍法)は、未知データに近い学習データを探し、その近傍のラベルなどを利用して予測するアルゴリズムです。そのため、距離の定義そのものがモデルの挙動を決めます。
L1を使うと「各特徴量でどれだけ違うか」を積み上げた近傍が選ばれます。L2なら「全体としてどれだけ直線的に離れているか」を重視する近傍になります。
この違いは、データによって結果が変わります。したがって、「ワンホットならL1」「連続値ならL2」というルールだけで決めるのではなく、同一の学習・検証条件で複数の距離を比較することが重要です。
特に高次元データでは、距離そのものの識別力が低下する「次元の呪い」に注意が必要です。次元が増えるほど、最も近い点と遠い点の距離の差が相対的に小さくなり、近傍探索が難しくなることがあります。単にL1へ変更するだけでは、この問題を根本的に解決できません。
L1正則化とマンハッタン距離は別物だが、共通する数学的性質がある
「L1距離」と「L1正則化」は関連する考え方ですが、同じものではありません。
L1正則化では、モデルのパラメータの絶対値の合計をペナルティとして加えます。代表例がLASSOです。L1ペナルティには、一部の係数をちょうど0にする方向へ働きやすいという特徴があり、特徴選択やモデルのスパース化に利用されます。
つまり、L1という数学的構造は「2つのデータがどれだけ離れているか」を測る場合だけでなく、「モデルのパラメータをどのように制約するか」という場面にも登場します。
ただし、L1距離を使ったからモデルが自動的にスパースになるわけではありません。距離としてのL1と、正則化としてのL1は目的が異なるため、混同しないことが重要です。
ロボティクスや都市解析ではL1の意味がさらに明確になる
マンハッタン距離が特に直感的なのは、移動方向が限定されたグリッド空間です。
例えばロボットが上下左右にしか移動できない格子状マップでは、斜めに直線移動できないため、始点と終点のL1距離は最小移動量を考える際の自然な指標になります。都市の道路網が碁盤目状である場合も、直線距離よりL1距離の方が実際の移動コストに近いケースがあります。
ただし、現実の道路には一方通行、交差点、橋、坂、通行規制などがあります。そのため、実際の経路を求める用途ではL1距離をそのまま「最短経路」とみなすのではなく、グラフ探索や道路ネットワーク上のコストと組み合わせる必要があります。
実務で見落としやすい落とし穴
第一に、特徴量のスケールです。距離ベースの手法では、単位の違いが結果を大きく変えます。標準化、正規化、ロバストスケーリングなどをデータ特性に応じて検討しましょう。
第二に、特徴量の相関です。L1距離は各軸の差を単純に合計するため、強く相関した特徴量を複数入れると、同じ情報を重複して距離に反映してしまう場合があります。
第三に、軸への依存性です。L1距離は座標軸に依存するため、座標空間を回転させると距離の関係が変化します。これは「どの特徴量を軸として定義するか」が重要なデータでは無視できません。
第四に、高次元化です。特徴量を増やせば情報量が増えるとは限りません。不要な特徴を大量に追加すると、距離の意味が薄くなることがあります。特徴選択や次元削減を検討する価値があります。
大規模検索では「距離の選択」と「探索方式」をセットで考える
近年のデータ基盤では、数百万〜数十億規模のベクトルから近傍を検索するケースも増えています。この規模になると、すべてのデータとの距離を正確に計算する総当たり方式は、計算量とレイテンシの面で現実的ではありません。
そこで、近似最近傍探索(ANN)が利用されます。代表的なアプローチには、グラフ型探索、量子化、ハッシュ、木構造などがあります。
ここで重要なのは、ANNのアルゴリズムには得意な距離やデータ構造があることです。「L1距離を使いたい」という要件だけで検索基盤を選ぶのではなく、利用するインデックスが対象の距離尺度をどのように扱えるのか、検索精度とレイテンシのトレードオフはどうなるのかを確認する必要があります。
また、近年のベクトル検索では、単純なL1/L2だけでなく、コサイン類似度や内積などが使われることも多くなっています。特に機械学習モデルから生成した埋め込みでは、モデルがどのような類似度を前提として学習されているかを確認することが重要です。
発展的な使い方:重み付きL1とメトリック学習
すべての特徴量を同じ重要度で扱う必要がない場合は、重み付きL1距離が有効です。
[d(x,y)=\sum_i w_i|x_i-y_i|]
とすれば、重要な特徴には大きな重みを、影響を抑えたい特徴には小さな重みを設定できます。
さらに進んだ方法として、データから距離そのものを学習するメトリック学習があります。これは「何を近いとみなすべきか」を教師データなどから学習する考え方です。
実務では、単純なL1/L2をベースラインとして構築し、性能が不足した場合に重み付けや学習型の距離へ発展させる方が、原因を追いやすくなります。最初から複雑な距離学習を導入するよりも、ベースラインとの比較によって改善効果を測定しやすいからです。
マンハッタン距離を使う前の実践チェックリスト
マンハッタン距離を採用するなら、まず特徴量の単位とスケールを確認しましょう。そのうえで、L1とL2、必要ならコサイン類似度などを同じ検証データで比較します。
k-NNや最近傍検索で利用する場合は、距離そのものだけでなく、検索精度、推論時間、メモリ使用量まで含めて評価することが重要です。高次元データでは特徴選択や次元削減も検討し、大規模データではANNの対応距離やインデックス方式まで確認します。
さらに、距離の結果を人間が解釈する必要がある場合は、「その距離が何の差を表しているのか」を説明できるかも重要な判断基準になります。
まとめ:マンハッタン距離は「単純だから強い」のではなく「意味が明確だから強い」
マンハッタン距離は、各特徴量の差の絶対値を合計するという非常にシンプルな距離尺度です。しかし、そのシンプルさこそが実務上の強みになります。
特に、各次元の差を個別に扱いたい場合、スパースな特徴量を扱う場合、外れ値による二乗増幅を避けたい場合、あるいはグリッド状の空間で移動コストを考える場合には有力な選択肢になります。
一方で、L1を選べば常に精度が上がるわけではありません。特徴量のスケール、高次元性、相関、データの生成過程、検索アルゴリズムとの相性によって結果は変わります。
実務で最も重要なのは、「L1かL2か」という二択を先に決めることではありません。まずデータと目的を理解し、適切な前処理を行ったうえで複数の距離尺度を比較し、精度だけでなく解釈性・計算コスト・検索性能まで含めて判断することです。
マンハッタン距離は古典的な手法ですが、スパースデータ、近傍探索、機械学習、最適化など現在のデータ活用でも十分に価値があります。重要なのは「古い距離だから使わない」のではなく、「このデータでは、差を絶対値で足し合わせることにどんな意味があるのか」を考えることです。

