三角関数からコサイン類似度へ!AI時代に必須の数学をエンジニア向けに一気通貫解説

こんにちは。ゆうせいです。

「三角関数」「ベクトル」「コサイン」…

学生時代に苦しんだ数学のキーワードを見て、思わずブラウザを閉じようとしていませんか?

ちょっと待ってください!

実は、ゲームキャラクターを滑らかに動かす数学と、あなたにピッタリの商品をおすすめするAIの数学に、深い繋がりがあるとしたらどうでしょう?

今日は、一見すると全く別物に見える「三角関数」と「コサイン類似度」の世界を繋げ、エンジニアにとってどれだけ強力な武器になるかを探検していきます。

数学アレルギーの人でも大丈夫。一つずつ、ゆっくりと進んでいきましょう!

三角関数 (sin, cos) のインタラクティブ・アニメーションは以下のリンクから見られます。

https://saycon.co.jp/html/sincos.html

まずは基本の「キ」!アニメーションを支える三角関数

最初のテーマは、多くの人が一度は学んだことがある三角関数です。

「サイン、コサイン、タンジェントなんて、何の役に立つの?」と思っているなら、それは非常にもったいない!

特に、画面上で何かを動かす時、三角関数は魔法のような力を発揮します。

三角関数とは、一言でいえば「直角三角形の辺の比率」でしたね。

sin (サイン), cos (コサイン), tan (タンジェント) の中で、エンジニアが特にお世話になるのがsinとcosです。

この2つを使うと、円運動や回転を驚くほど簡単に表現できます。

例えば、中心が原点(0,0)で半径がrの円周上にある点の座標(x, y)は、角度θ(シータ)さえ分かれば、次の式で一発で計算できてしまいます。

x = r \times \cos(\theta)

x座標 = 半径 × cos(角度)

y = r \times \sin(\theta)

y座標 = 半径 × sin(角度)

この式があるおかげで、ゲーム開発者はキャラクターを特定の軸周りに回転させたり、Webデザイナーはローディングアイコンを滑らかに回したりできるのです!

覚えておきたい注意点:度の罠

ここで一つ、プログラミング初心者が必ずハマる罠があります。それは角度の単位です。

私たちが日常で使うのは円一周が360度の「度数法」ですが、多くのプログラミング言語では円一周を2π(パイ)とする「弧度法(ラジアン)」が使われます。

「180度 = πラジアン」この関係だけは、しっかり覚えておきましょう!

「角度」の考え方を応用!コサイン類似度でAIの世界へ

さて、三角関数が「角度を使って座標を求める」道具だったことを思い出してください。

ここからは、その「角度」という考え方を全く別の問題に応用してみましょう。

それは、「二つのデータがどれくらい似ているか?」を判定する世界です。

主役となるのが、今回の記事の核心、「コサイン類似度」です。

コサイン類似度とは、ズバリ「二つのデータの『向き』がどれくらい似ているか」を測る指標です。

コンピュータは文章などを直接理解できないので、まず「ベクトル」という数値のリストに変換します。

例えば、2つの文章をベクトル化してみましょう。

辞書に「猫」「犬」「好き」という単語があるとして、各単語の登場回数でベクトルを作ります。

  • 文章A: 「猫が好き」 → [猫:1, 犬:0, 好き:1]
  • 文章B: 「犬が好き」 → [猫:0, 犬:1, 好き:1]

コサイン類似度は、このベクトル同士が作る「角度のコサイン(cos)」を計算します。

思い出してください、cos(0度)は1、cos(90度)は0でしたね。

  • ベクトルの向きが全く同じ → 角度0度 → 類似度は1 (完全に似ている)
  • ベクトルの向きが直角 → 角度90度 → 類似度は0 (全く似ていない)

なぜコサイン類似度がすごいのか?

コサイン類似度の最大のメリットは、「データの大きさ(量)に影響されない」点です。

例えば、「猫が好きです」という短い文章と、「私は本当に本当に猫が大好きなんです」という長い文章があったとします。

内容はほぼ同じですが、文字数が全く違います。

コサイン類似度は、この長さの違いを無視して、「猫が好き」という『向き』が同じであることを見抜いてくれるのです!

この性質のおかげで、ECサイトの推薦エンジンは、購入数が少ないユーザーとヘビーユーザーの「好みの傾向」を公平に比較できるわけですね。

コサイン類似度の数式

数式も見ておきましょう。構造は意外とシンプルですよ。

ベクトルAとベクトルBのコサイン類似度は、以下の式で計算されます。

\text{similarity} = \cos(\theta) = \frac{A \cdot B}{|A| |B|}

類似度 = (ベクトルAとベクトルBの内積) / (ベクトルAの長さ × ベクトルBの長さ)

これは、ベクトルの長さを分母で割ることで影響をなくし、純粋に「向き」の情報(内積)だけを取り出す操作をしています。

Pythonコードで体感してみよう!

では、先ほどの「猫が好き」「犬が好き」の類似度をPythonで計算してみましょう。

import numpy as np
from numpy.linalg import norm

# 文章A: 「猫が好き」 -> [猫:1, 犬:0, 好き:1]
vector_a = np.array([1, 0, 1])

# 文章B: 「犬が好き」 -> [猫:0, 犬:1, 好き:1]
vector_b = np.array([0, 1, 1])

# 内積を計算
dot_product = np.dot(vector_a, vector_b)

# それぞれのベクトルの長さを計算
norm_a = norm(vector_a)
norm_b = norm(vector_b)

# コサイン類似度を計算
cosine_similarity = dot_product / (norm_a * norm_b)

print(f"コサイン類似度: {cosine_similarity}")
# 出力結果: コサイン類似度: 0.5

「好き」という共通の方向性があるため類似度は0より大きく、しかし「猫」と「犬」という違う方向を向いているため1よりは小さい、0.5という直感に合う結果が得られました!

さらなる高みへ!次のステップ

今日の内容をマスターしたら、あなたはもう一歩先に進めます。

  1. 三角関数の応用:キャラクターをプレイヤーの方向に向かせたい時などに使う「逆三角関数(arctan)」を学んでみましょう。よりインタラクティブな表現が可能になります。
  2. コサイン類似度の応用:単語の登場回数だけでなく、単語の重要度も考慮した「TF-IDF」という手法でベクトルを作ると、類似度の精度が格段に上がります。また、単語の意味自体をベクトル化する「単語埋め込み(Word2Vecなど)」の世界を覗いてみると、自然言語処理の最前線に触れることができますよ!

このように、cosという一つの概念が、ビジュアルな表現からデータ分析まで、全く異なる分野で活躍しているのは面白いですよね。

一見難しそうな数学も、エンジニアにとってはアイデアを形にするための強力なツールキットです。

怖がらずに、ぜひあなたのプロジェクトに取り入れて、プログラミングの世界をさらに楽しんでください!

三角関数 (sin, cos) のインタラクティブ・アニメーションは以下のリンクから見られます。

https://saycon.co.jp/html/sincos.html

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。