コサイン類似度(Cosine Similarity)は、データ分析や機械学習の分野で広く使われている「2つのデータがどれくらい似ているか」を数値で表す指標です。
文書の類似度判定、レコメンドシステム、画像検索など、さまざまな場面で活用されています。
この記事では、コサイン類似度の基本的な概念から計算方法、実際の応用例まで詳しく解説します。
コサイン類似度とは
コサイン類似度は、2つのベクトル(方向と大きさを持つ矢印のようなもの)が「どれくらい同じ方向を向いているか」を測定する指標です。
基本的な考え方
2つの矢印があったとき、同じ方向を向いていれば「似ている」、反対方向なら「似ていない」と判断します。
矢印の長さ(大きさ)は関係なく、あくまで「向き」だけで類似度を判断するのが特徴です。
名前の由来
「コサイン」という名前は、三角関数のコサイン(cos)から来ています。
2つのベクトルがなす角度θ(シータ)のコサイン値(cos θ)が、そのまま類似度の値になるため、この名前が付けられました。
計算式と値の範囲
コサイン類似度は、以下の計算式で求められます。
計算式
cos(θ) = (A・B) / (||A|| × ||B||)
式の意味
A・B: ベクトルAとBの内積(各成分を掛け合わせて合計した値)||A||: ベクトルAの大きさ(ノルム、長さ)||B||: ベクトルBの大きさ(ノルム、長さ)
より詳しく書くと、n次元のベクトルの場合:
cos(θ) = (A₁B₁ + A₂B₂ + ... + AₙBₙ) / (√(A₁² + A₂² + ... + Aₙ²) × √(B₁² + B₂² + ... + Bₙ²))
値の範囲と意味
コサイン類似度は常に-1から1の間の値を取ります。
- 1に近い: 2つのベクトルがほぼ同じ方向を向いている(非常に類似している)
- 0に近い: 2つのベクトルが直交している(似ていない、無関係)
- -1に近い: 2つのベクトルが正反対の方向を向いている(完全に異なる)
特に、完全に一致する場合は1、完全に逆向きの場合は-1になります。
具体的な計算例
実際に数値を使って、コサイン類似度を計算してみましょう。
例1: 2次元ベクトルの場合
以下の2つのベクトルの類似度を求めます。
A = (3, 4)
B = (6, 8)
ステップ1: 内積を計算
A・B = 3×6 + 4×8 = 18 + 32 = 50
ステップ2: 各ベクトルの大きさを計算
||A|| = √(3² + 4²) = √(9 + 16) = √25 = 5
||B|| = √(6² + 8²) = √(36 + 64) = √100 = 10
ステップ3: コサイン類似度を計算
cos(θ) = 50 / (5 × 10) = 50 / 50 = 1
結果: コサイン類似度は1なので、この2つのベクトルは完全に同じ方向を向いています。
実際、Bはまちょうどの2倍のベクトルなので、方向は完全に一致しています。
例2: 映画の評価データ
3人(A、B、C)が4つの映画を5点満点で評価したとします。
| 映画 | Aさん | Bさん | Cさん |
|---|---|---|---|
| 映画1 | 5.0 | 3.5 | 4.5 |
| 映画2 | 4.5 | 3.5 | 5.0 |
| 映画3 | 2.5 | 5.0 | 2.5 |
| 映画4 | 5.0 | 2.5 | 4.5 |
それぞれの人を4次元ベクトルとして表現すると:
A = (5.0, 4.5, 2.5, 5.0)
B = (3.5, 3.5, 5.0, 2.5)
C = (4.5, 5.0, 2.5, 4.5)
AさんとCさんのコサイン類似度を計算
内積: 5.0×4.5 + 4.5×5.0 + 2.5×2.5 + 5.0×4.5 = 22.5 + 22.5 + 6.25 + 22.5 = 73.75
大きさ:
- ||A|| = √(5.0² + 4.5² + 2.5² + 5.0²) = √(25 + 20.25 + 6.25 + 25) = √76.5 ≈ 8.746
- ||C|| = √(4.5² + 5.0² + 2.5² + 4.5²) = √(20.25 + 25 + 6.25 + 20.25) = √71.75 ≈ 8.471
コサイン類似度:
cos(θ) = 73.75 / (8.746 × 8.471) ≈ 0.995
この結果から、AさんとCさんの映画の好みは非常に似ていることがわかります。
コサイン類似度の特徴
利点
1. 大きさに依存しない
ベクトルの大きさ(長さ)に関係なく、方向だけで類似度を判断します。
例えば、短い文書と長い文書を比較する場合でも、単語の出現パターンが似ていれば高い類似度を示します。
2. 計算コストが比較的低い
内積とノルム(ベクトルの大きさ)の計算だけで済むため、大規模なデータセットにも適用しやすいです。
3. 解釈しやすい
-1から1の範囲に正規化されるため、結果を直感的に理解できます。
4. 高次元データに強い
数千から数万次元のデータでも有効に機能します。
テキストデータなど、高次元になりやすいデータの類似度計算に適しています。
欠点と注意点
1. ベクトルの大きさ情報が失われる
大きさの違いが重要な場合には向きません。
例えば、単語の出現回数そのものが重要な場合、コサイン類似度だけでは不十分な場合があります。
2. 負の値の解釈
成分が負の値を持つ場合、コサイン類似度も負になることがあります。
この負の値をどう解釈するかは、応用先によって工夫が必要です。
3. 高次元の呪い
極端に次元が高い場合(数万〜数十万次元)、ほとんどのベクトルが直交に近くなり、類似度が0付近に集中してしまうことがあります。
4. 線形的な関係のみ
コサイン類似度は線形的な関係性しか捉えられません。
複雑な非線形関係を捉えたい場合は、深層学習ベースのモデルなど、他のアプローチとの組み合わせが必要です。
実用例
コサイン類似度は、さまざまな分野で実用的に活用されています。
1. 文書の類似度判定(自然言語処理)
応用場面
- 検索エンジン: ユーザーの検索クエリと文書の類似度を計算し、最も関連性の高い文書を返す
- 文書分類: 未知の文書がどのカテゴリに属するかを、既知の文書との類似度から判定
- 盗用検出: 複数の文書間で類似度を計算し、盗用の可能性を検出
- ニュース記事のグループ化: 似た内容のニュース記事を自動的にまとめる
仕組み
文書を単語の出現頻度を表すベクトルに変換します。
例えば、「機械学習」という単語が10回、「AI」という単語が5回出現する文書は、そのベクトル表現の対応する次元にこれらの値が入ります。
2. レコメンドシステム(推薦システム)
応用場面
- 映画やドラマの推薦(Netflix、Amazon Primeなど)
- 音楽の推薦(Spotify、Apple Musicなど)
- 商品の推薦(Amazon、楽天など)
- ニュース記事の推薦
仕組み
ユーザーの過去の評価や行動をベクトルとして表現します。
似た評価パターンを持つユーザー同士や、似た特徴を持つアイテム同士を見つけ出し、推薦に活用します。
3. 画像検索と画像認識
応用場面
- 類似画像の検索
- 顔認識システム
- 画像分類
仕組み
画像の特徴(色、形状、テクスチャなど)をベクトルとして抽出します。
クエリ画像と既存の画像データベースのベクトル間でコサイン類似度を計算し、最も似ている画像を見つけます。
4. 不正検知
応用場面
- クレジットカード不正利用の検出
- 異常なネットワークアクセスの検出
- スパムメールの検出
仕組み
正常な行動パターンと異常な行動パターンをベクトルで表現します。
新しい行動パターンが既知の正常パターンとの類似度が低い場合、不正や異常として検出します。
5. 大規模言語モデル(LLM)での活用
応用場面
- ChatGPTなどのAIチャットボット
- 文章の意味的類似度の計算
- ベクトルデータベースでの検索
仕組み
単語や文章を高次元の埋め込みベクトル(Embedding)に変換し、それらの間のコサイン類似度を計算することで、意味的に似た文章を見つけます。
他の類似度指標との比較
コサイン類似度以外にも、データ間の類似度を測る指標があります。
ユークリッド距離
概要
2点間の直線距離を計算します。
計算式
d = √((A₁-B₁)² + (A₂-B₂)² + ... + (Aₙ-Bₙ)²)
特徴
- ベクトルの大きさの違いを考慮する
- 距離が小さいほど類似している
- 高次元空間では効果が低下する場合がある
使い分け
数値データや物理的な特徴の比較に適しています。
文書の類似度など、大きさより方向が重要な場合はコサイン類似度が優れています。
ジャッカード係数(ジャッカード類似度)
概要
2つの集合の重なりを測定します。
計算式
J(A, B) = |A ∩ B| / |A ∪ B|
特徴
- カテゴリデータやバイナリデータに適している
- 0から1の値を取る
- 集合のサイズに依存
使い分け
タグ、クリック、商品閲覧など、カテゴリカルなデータやバイナリデータの類似度測定に適しています。
ピアソン相関係数
概要
2つの変数間の線形相関を測定します。
特徴
- -1から1の値を取る
- 平均値からの偏差を考慮
- 統計的な相関分析に使用
使い分け
ユーザーの評価パターンの相関を見る場合などに適しています。
コサイン類似度の中心化版(Centered Cosine Similarity)とも呼ばれます。
Pythonでの実装
コサイン類似度は、Pythonで簡単に計算できます。
NumPyを使った基本実装
import numpy as np
def cosine_similarity(vec1, vec2):
# 内積を計算
dot_product = np.dot(vec1, vec2)
# ベクトルの大きさを計算
norm_vec1 = np.linalg.norm(vec1)
norm_vec2 = np.linalg.norm(vec2)
# コサイン類似度を計算
similarity = dot_product / (norm_vec1 * norm_vec2)
return similarity
# 使用例
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
result = cosine_similarity(A, B)
print(f"コサイン類似度: {result}")
scikit-learnを使った実装
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# ベクトルを準備
A = np.array([[1, 2, 3]]) # 2次元配列に変形
B = np.array([[4, 5, 6]])
# コサイン類似度を計算
similarity = cosine_similarity(A, B)
print(f"コサイン類似度: {similarity[0][0]}")
文書の類似度を計算する例
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# 文書データ
documents = [
'データサイエンスは重要な分野です',
'これは最高のデータサイエンスコースです',
'データサイエンティストはデータを分析します'
]
# 文書をベクトル化
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)
# コサイン類似度を計算
similarities = cosine_similarity(X)
print("文書1と文書2の類似度:", similarities[0, 1])
print("文書1と文書3の類似度:", similarities[0, 2])
print("文書2と文書3の類似度:", similarities[1, 2])
コサイン距離との関係
コサイン類似度と関連する概念に「コサイン距離(Cosine Distance)」があります。
定義
コサイン距離 = 1 - コサイン類似度
特徴
- 0から2の値を取る(または0から1に正規化)
- 0に近いほど類似している(距離が近い)
- 1に近いほど異なっている(距離が遠い)
使い分け
コサイン類似度は「似ているほど大きい値」、コサイン距離は「似ているほど小さい値」になります。
クラスタリングなど、距離の概念を使うアルゴリズムではコサイン距離が使われることがあります。
まとめ
コサイン類似度は、2つのベクトルがどれくらい同じ方向を向いているかを測定する指標です。
重要なポイント
- 計算式: cos(θ) = (A・B) / (||A|| × ||B||)
- 値の範囲: -1から1(-1: 正反対、0: 無関係、1: 完全一致)
- 特徴: ベクトルの大きさに依存せず、方向のみを考慮
- 利点: 計算コストが低い、高次元データに強い、解釈しやすい
- 欠点: 大きさ情報が失われる、線形的な関係のみ
主な応用分野
- 自然言語処理(文書の類似度判定)
- レコメンドシステム(映画、音楽、商品の推薦)
- 画像検索と画像認識
- 不正検知
- 大規模言語モデル(ChatGPTなどのAI)
実装
PythonのNumPyやscikit-learnを使えば、簡単にコサイン類似度を計算できます。
コサイン類似度は、データサイエンスや機械学習の基本的な概念の1つです。
文書分析、推薦システム、画像認識など、幅広い分野で活用されており、現代のAI技術を支える重要な技術の1つとなっています。

コメント