類似度・距離の指標
の使い分け
類似度・距離の指標は、データ同士がどれくらい近いかを数値化するためのものです。テキスト埋め込みから RAG 検索を作るとき、ユーザーをクラスタリングするとき、重複コンテンツを検知するとき——どれも「2 つのデータが似ているかを判定する」場面で出てきます。
類似度の指標は大きく 3 つの視点に分かれます。ベクトルの向きを見るならコサイン類似度、距離を見るならユークリッド/マンハッタン、集合同士の重なりを見るならジャッカード係数です。データの性質と目的で選び分けます。
01.まず結論:3つの視点で使い分ける
類似度・距離の指標は名前が紛らわしいですが、測っているものは大きく 3 種類に分けられます。
| 視点 | 代表指標 | 向くデータ |
|---|---|---|
| ベクトルの向き | コサイン類似度 | テキスト埋め込み、TF-IDF など、ベクトル長が場面で変わるデータ |
| ベクトルの距離 | ユークリッド距離、マンハッタン距離 | 数値の絶対差に意味があるデータ(座標、購買額など) |
| 集合の重なり | ジャッカード係数 | タグ集合、キーワード集合、N-gram 集合など |
02.ベクトルの「向き」で測る:コサイン類似度
コサイン類似度は、2 つのベクトルの間の角度を見る指標です。値は -1 〜 1 の範囲で、1 なら同じ向き(完全に類似)、0 なら直交(無関係)、-1 なら逆向き(反対の特徴)を意味します。
図:コサイン類似度はベクトルの「向き」を見る
ベクトルの長さは無視し、角度だけを見る。角度が小さいほど類似度が高い(1 に近い)。
似ている
cos ≒ 0.97
意味の近い文書
無関係
cos ≒ 0
異なる話題
反対
cos ≒ -1
対照的な特徴
ベクトルの長さは無視されるので、「短い文書と長い文書」のように大きさがバラバラなデータでも公平に比較できます。テキスト埋め込みを使った RAG・セマンティック検索・レコメンドの基本指標で、実装は sklearn.metrics.pairwise.cosine_similarity 1 行で済みます。ユーザー×アイテムの評価行列に使うと、協調フィルタリングの類似度計算にもそのまま使えます。
多くのテキスト埋め込み API(OpenAI、Voyage など)は出力ベクトルを L2 正規化して返します。その場合、コサイン類似度の代わりに内積(dot product)を計算しても結果は一致するため、検索エンジンは高速な内積でランキングするのが一般的です。
03.ベクトルの「距離」で測る:ユークリッド・マンハッタン
距離系の指標は、ベクトル同士の物理的な近さを測ります。コサイン類似度と違い、「ベクトルの大きさ」が値に影響します。
図:ユークリッド距離とマンハッタン距離の違い
A から B まで、ユークリッド距離は直線、マンハッタン距離は碁盤の目で測る。
(直線)
(碁盤の目)
| 指標 | 計算の考え方 | 向く場面 |
|---|---|---|
| ユークリッド距離 | 2点を結ぶ直線の長さ。√(差の二乗和) | 座標、画像特徴、k-meansクラスタリングなど |
| マンハッタン距離 | 縦・横の移動量の合計。Σ|差| | 外れ値の影響を抑えたいとき、軸が独立な意味を持つとき |
ユークリッド距離は二乗するため、1 つの軸で大きく外れた値の影響を強く受けます。外れ値が多いデータではマンハッタン距離の方が安定することがあります。
04.集合の「重なり」で測る:ジャッカード係数
ジャッカード係数は、ベクトルではなく「集合」を比較するための指標です。共通部分の要素数を、和集合の要素数で割って計算します。値は 0 〜 1 の範囲で、0 は重なりなし、1 は完全一致を意味します。
図:ジャッカード係数は集合の重なりの割合
共通部分(A∩B)を全体(A∪B)で割った値。0 で重なりなし、1 で完全一致。
ジャッカード係数
例:A={a,b,c,d}、B={c,d,e}
→ 共通{c,d} / 和{a,b,c,d,e}
→ 2/5 = 0.4
ジャッカード係数は、タグの一致度、検索キーワードの重複度、N-gram を使った重複コンテンツ検知、MinHash と組み合わせた大規模文書の近似重複検出などで使われます。「順序や頻度はどうでもよく、要素が含まれているかだけを比較したい」ときに向いています。
05.用途別の選び方
| やりたいこと | 推奨指標 | ひとこと |
|---|---|---|
| テキスト埋め込みで「意味が似た文書」を検索したい | コサイン類似度 | RAG・FAQ 検索の定番 |
| ユーザーの行動ベクトルでクラスタリングしたい | ユークリッド距離 | k-means の標準距離 |
| 外れ値の影響を抑えてユーザーを比較したい | マンハッタン距離 | 二乗しない分、ロバスト |
| タグやキーワード集合の一致度を見たい | ジャッカード係数 | 順序・頻度を無視できる |
| 数千万件の文書から重複を高速に見つけたい | ジャッカード係数 + MinHash | 近似計算で計算量を削減 |
| 短い文と長い文を公平に比較したい | コサイン類似度 | ベクトル長の影響を受けない |
実務でテキスト系のデータを扱うなら、まずコサイン類似度を試すのが無難です。距離の絶対値に意味がある場面(座標、購買額、センサー値など)が出てきたら、ユークリッド距離・マンハッタン距離に切り替えます。タグ集合の比較に直面したらジャッカード係数の出番、と覚えておけば困りません。
06.実装例(scikit-learn)
どの指標も scikit-learn(または scipy)の関数 1 つで計算できます。最小限の例を載せておきます。
import numpy as np
from sklearn.metrics.pairwise import (
cosine_similarity,
euclidean_distances,
manhattan_distances,
)
from sklearn.metrics import jaccard_score
a = np.array([[1, 2, 3]])
b = np.array([[2, 3, 4]])
cosine_similarity(a, b) # コサイン類似度 → 約 0.9926
euclidean_distances(a, b) # ユークリッド距離 → 約 1.732
manhattan_distances(a, b) # マンハッタン距離 → 3.0
# ジャッカード係数(2 値ベクトルや集合の比較)
y1 = [1, 0, 1, 1]
y2 = [1, 1, 0, 1]
jaccard_score(y1, y2) # → 0.5ベクトル長がバラバラなテキスト埋め込み比較なら、コサイン類似度が定番。L2 正規化済みベクトルなら内積でも同じ結果になります。
上のコード(A=[1, 2, 3]、B=[2, 3, 4])と同じ値を、下のツールに読み込んであります。コサイン類似度・ユークリッド距離・マンハッタン距離を、コードを書かずにその場で確認できます。「集合」モードに切り替えると、タグ集合のジャッカード係数も計算できます。
数値ベクトルやタグ・単語を入力すると、コサイン類似度・距離・ジャッカード係数を、判定と図解つきでその場で計算します(ブラウザ内で計算、サーバー送信なし)。
2つの数値の並び(ベクトル)を入力すると、向きの近さ(コサイン類似度)と距離(ユークリッド・マンハッタン)をまとめて計算します。
カンマ・空白・改行で区切り、A と B の個数は揃えてください。
読み取れた数値: 0個
読み取れた数値: 0個
07.よくある質問(FAQ)
コサイン類似度と内積は何が違いますか?
内積はベクトルの長さが結果に影響するのに対し、コサイン類似度はベクトルを長さ(ノルム)で割って正規化してから内積をとるため、長さの影響を受けません。多くのテキスト埋め込み API は L2 正規化済みベクトルを返すため、その場合は内積とコサイン類似度が一致します。検索エンジンは計算が軽い内積を採用することが多いです。
ユークリッド距離はそのままコサイン類似度に変換できますか?
L2 正規化済みベクトル同士であれば、ユークリッド距離 d とコサイン類似度 s には d² = 2(1 - s) の関係が成り立ちます。それ以外(長さがバラバラなベクトル)では単純に変換できないため、目的に合わせて指標自体を選び直す方が安全です。
ジャッカード係数とコサイン類似度はどちらがテキスト比較に向きますか?
意味の近さで比較したい場合は、テキストを埋め込みベクトルに変換してコサイン類似度を取るのが定番です。一方、「表記レベルでどれくらい単語が一致しているか」を見たいときはジャッカード係数が直感的です。重複コンテンツ検知では、ジャッカード係数(しばしば MinHash 近似と併用)が広く採用されています。
k-means クラスタリングで使うべき距離は?
標準の k-means はユークリッド距離(の二乗和)を最小化するアルゴリズムなので、ユークリッド距離で動かすのが自然です。テキスト埋め込みのように「向き」で類似を測りたい場合は、事前にベクトルを L2 正規化しておけば実質的にコサイン類似度ベースのクラスタリングになります。専用の Spherical k-means を使う選択肢もあります。
08.まとめ
類似度・距離の指標は、「ベクトルの向き(コサイン類似度)」「ベクトルの距離(ユークリッド/マンハッタン)」「集合の重なり(ジャッカード係数)」の 3 視点で整理すると迷いません。テキスト埋め込みでの検索ならコサイン類似度、座標や数値で似た点を探すならユークリッド距離、タグ集合の比較ならジャッカード係数が基本の選択肢です。
他の指標カテゴリ(一致度・予測モデル評価)は別の記事で詳しく扱っています。
データ分析でよく使うアルゴリズム・指標まとめ
類似度・一致度・予測モデル評価の3カテゴリで指標を整理した総合解説です。
一致度・信頼性の指標とは(カッパ係数・ICC)
評価者やモデル同士の判定の揃い具合を測る指標を整理します。
検索・RAG・データ分析の評価設計をご相談ください
社内向けの検索・RAG・データクラスタリングなど、データの類似度を扱う仕組みの設計・評価支援を行っています。お気軽にお問い合わせください。
データ分析・アルゴリズム 基礎知識集
一覧に戻る →全体像とカテゴリ早見
データの可視化
個別指標カテゴリ
- ›類似度・距離の指標の使い分け(この記事)
- ›一致度・信頼性の指標の使い分け
- ›予測モデル評価の指標と使い分け
- ›適合率と再現率|しきい値で見逃しと空振りを調整する
- ›確率較正(キャリブレーション)の基礎|事後較正・Vertex AI

