Pythonで学ぶAIの概念

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コンパイラで実行できます。

練習問題

入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。

  1. 入力や重みを変えて、実行前に出力を予想してみましょう。
  2. 途中の値を出力して、計算の各ステップを追いましょう。
  3. 下のリンクのチャレンジを解いて、自分でアイデアを実装しましょう。
Python IDEで実行 →

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ