Pythonで学ぶコサイン類似度とk-meansクラスタリング
教師なし学習は、ラベルのないデータから構造を見つけます。コサイン類似度は2つのベクトルがどれだけ似ているかを測り、k-meansは学習した中心の周りに点をクラスタとしてまとめます。
やさしい言葉で概念を理解する
教師なし学習は、ラベルのないデータから構造を見つけます。コサイン類似度は2つのベクトルがどれだけ似ているかを測り、k-meansは学習した中心の周りに点をクラスタとしてまとめます。
コサイン類似度で2つのベクトルの似ている度合いを測り、ラベルのないデータをk-meansでグループ分けします。
重要なポイント
- コサイン類似度は長さを無視して向きだけを比べるので、テキストや埋め込みに向いています。
- k-meansではクラスタ数kを最初に決める必要があります。
- 初期の中心によって結果が変わるため、k-meansは何度か実行することが多いです。
- クラスタはデータだけから見つかり、ラベルは不要です。
どのような場面で使う?
- ニューラルネットワークやAIライブラリの内部で何が起きているかを理解する。
- 対応するチャレンジで実装する前に考え方をつかむ。
- 機械学習の講座、面接、プロジェクトに備える。
動かして理解する
ステップでk-meansの2つの手順を交互に進め、再生で変化がなくなるまで実行します。右のベクトルを回すとコサイン類似度が変わります。
サンプルコード
main.py
import math
# Cosine similarity compares directions: 1 = same direction, 0 = unrelated.
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
return dot / (math.sqrt(sum(x * x for x in a)) * math.sqrt(sum(y * y for y in b)))
print("cos(doc1, doc2):", round(cosine([1, 2, 0], [2, 4, 0]), 3))
print("cos(doc1, doc3):", round(cosine([1, 2, 0], [0, 0, 3]), 3))
# k-means: assign points to the nearest centre, then move each centre to its points' mean.
points = [1, 2, 3, 10, 11, 12]
centres = [1.0, 2.0]
for step in range(1, 4):
groups = [[], []]
for p in points:
nearest = min(range(len(centres)), key=lambda i: abs(p - centres[i]))
groups[nearest].append(p)
centres = [sum(g) / len(g) for g in groups]
print(f"step {step}: centres={[round(c, 2) for c in centres]} groups={groups}")
期待される出力
cos(doc1, doc2): 1.0
cos(doc1, doc3): 0.0
step 1: centres=[1.0, 7.6] groups=[[1], [2, 3, 10, 11, 12]]
step 2: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]
step 3: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]
仕組み
cosine()は内積を両ベクトルの長さで割るので、doc1と同じ向きのdoc2は1、共通の単語がないdoc3は0になります。k-meansは、各点を最も近い中心に割り当てることと、各中心をその点の平均に動かすことを繰り返します。ステップ2以降は変化しないので収束しています。
値を変更し、PythonをインストールせずにCodeUtilityオンラインPythonコンパイラで実行できます。
練習問題
入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。
- 入力や重みを変えて、実行前に出力を予想してみましょう。
- 途中の値を出力して、計算の各ステップを追いましょう。
- 下のリンクのチャレンジを解いて、自分でアイデアを実装しましょう。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
- コサイン類似度 2つのベクトルの間の角度で類似度を測ります。検索エンジンが埋め込みを比べるのと同じ方法です。 簡単
- k-means クラスタリング 最も近い重心への割り当てと重心の移動を繰り返して、点を k 個のクラスタに分けます。 中級