コサイン類似度とは?
一言で言うと?
コサイン類似度は、「ベクトルの方向がどれくらい似ているか」を測る指標です。
データの絶対的な大きさではなく、方向の違いに注目します。
“データの方向の違い”の分析は、文章や画像の特徴比較などに適しています。
例えば、
- 文章A: 「私は猫が好きです。」
- 文章B: 「私は犬が好きです。」
という2つのよく似た文章同士を比較するとします。
単語を数値化したベクトルを作成し、それらのコサイン類似度を計算することで、
このコサイン類似度を見ることで、文章同士がどれだけ似ているかを数値で評価できます。
ベクトルの大きさに影響を受けないため、主に「内容の類似性」を測るために使用されます。
コサイン類似度の定義
コサイン類似度とは、2つのベクトルがどれくらい似ているかを評価するための指標です。その計算式は次のようになります。
$$\text{Cosine Similarity} = \frac{A \cdot B}{||A|| ||B||} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \times \sqrt{\sum_{i=1}^{n} B_i^2}}$$
ここで、
- \(A\)と\(B\)はそれぞれ 次元のベクトル
- \(A \cdot B\)はベクトルの内積
- \(||A||\)および\(||B||\)はそれぞれのベクトルのノルム(長さ)
この計算によって、コサイン類似度は-1から1の範囲を取ります。
- 1に近い → 2つのベクトルの方向がほぼ同じ(類似している)
- 0に近い → 2つのベクトルが直交している(無関係)
- -1に近い → 2つのベクトルの方向が逆(全く異なる)
コサイン類似度の使い道
コサイン類似度は、先ほども述べたように「内容の類似度」で比較することができます。
そのため、データの特徴をベクトルで表す必要があるときに主に使われます。
自然言語処理(NLP)
- 文章の類似度を測る → 例:「このニュース記事は過去の記事と似ているか?」
- 検索エンジン → 例:「このクエリに最も関連するドキュメントはどれか?」
推薦システム
- 映画の推薦 → 例:「このユーザーが好きな映画と似た映画を推薦する」
- 商品推薦 → 例:「この顧客が過去に購入した商品と似た商品を提示する」
画像認識
- 画像の特徴ベクトルを比較し、類似する画像を検索する。
- 例:「この顔写真と最も似ている顔をデータベースから探す」
Pythonでのコサイン類似度の実装
Pythonでは、scipy
やsklearn
を用いて簡単にコサイン類似度を計算できます。
主に、Pythonではcosine_similarity(A, B)を使うことで実装することができます。
以下は簡単な実装例です。
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# 2つのベクトルを定義
A = np.array([[1, 2, 3]])
B = np.array([[4, 5, 6]])
# コサイン類似度を計算
similarity = cosine_similarity(A, B)
print(similarity)
【発展】次元の呪いとは?
次元の呪いとは
コサイン類似度を含む多くの機械学習アルゴリズムでは、「次元の呪い」と呼ばれる問題が発生します。
コサイン類似度における次元の呪いとは、高次元データ空間において発生する、以下のような問題を指します。
- データ同士が直交する確率が増え、コサイン類似度が小さく算出される傾向が生じる
コサイン類似度は、ベクトル同士のなす角が90°であれば0になると考えることができます。
次元が増えるとそれぞれのベクトル同士の角度が90°になる可能性は増え、コサイン類似度は0に近づいていきます。
次元の呪いを軽減する方法
高次元データを扱う際には、コサイン類似度が小さくなってしまうことは自然なことです。
そこで、以下のような手法を使って次元を絞ることで、次元の呪いを軽減することができます。
- 主成分分析(PCA): 高次元データを低次元に圧縮する
- t-SNE: 高次元データを2Dや3Dに可視化する
- 特徴選択: 重要な特徴のみを選択し、不要な次元を削減する
まとめ
今回はコサイン類似度の基本概念、用途、Pythonでの実装について解説しました。
コサイン類似度は、文章解析、推薦システム、画像認識など、さまざまな分野で活用されています。
機械学習などにも応用される非常に面白い内容ですので、楽しんで勉強を進めましょう!
データサイエンス.jpでは、データサイエンスや統計学をわかりやすく学べるようなプラットフォームを提供しています。機械学習やデータ分析など、実用的でトピックも扱っていますので、ぜひ他の記事もご覧ください!