本文へスキップ
ひもとくAI

ミニプロジェクト:k-means を自分で作る

レッスン 7/7

ミニプロジェクト:k-means を自分で作る

前のレッスンの k-means を、ライブラリを使わずに NumPy だけで作ります。データは、標準化したワインのデータ(178本、13個の成分)です。

作るもの

def kmeans(X, init_centers, n_iter=20):
    centers = init_centers.copy()                 # はじめの中心(k 行 × 特徴量の数)
    for _ in range(n_iter):
        dist = ...        # 1. 各点と各中心との距離(点の数 × k の表)
        labels = ...      # 2. 割り当て: 各点の、一番近い中心の番号
        centers = ...     # 3. 中心の更新: クラスタごとの平均の位置
    ...

1の距離の表は、次の1行で作れます(演習では書いてあります)。

dist = np.sqrt(((X[:, None, :] - centers[None, :, :]) ** 2).sum(axis=2))

X[:, None, :] は「点の数 × 1 × 特徴量の数」、centers[None, :, :] は「1 × k × 特徴量の数」の形です。引き算すると、NumPy が足りない方向を自動で広げて(ブロードキャスト)、「点の数 × k × 特徴量の数」の、すべての点とすべての中心の差になります。それを2乗して特徴量の方向(axis=2)に足し、平方根をとると、「点の数 × k」の距離の表になります。

実験の結果

はじめの中心を「データの最初の3本」にして、自分で作った k-means を動かしました。クラスタ内の誤差の2乗和は、繰り返すたびに次のように小さくなりました。

繰り返し1回目2回目3回目4回目5回目8回目
誤差の2乗和1945.21578.41364.21287.71282.11279.7

scikit-learn の KMeans に、同じはじめの中心を渡して(init=、n_init=1)比べると、178本すべてのクラスタの割り当てが一致し、中心も一致しました(差は 10−1510^{-15} ほどで、計算機の誤差の範囲)。

はじめの中心で、結果が変わる

はじめの中心最後の誤差の2乗和
データの最初の3本(どれも品種0)1279.7
品種ごとに1本ずつ(0番・60番・130番)1282.5
scikit-learn の既定(k-means++ で10回やり直し、一番よい結果)1277.9

同じデータ・同じ手順でも、はじめの中心によって、止まる場所(最後の分け方)が少し違いました。k-means は、「今より誤差が小さくなる方向」にしか動かないので、はじめの位置の近くの、一番よいとは限らない分け方で止まることがあります。下り坂だけを進んで山を下りると、近くの小さなくぼみで止まってしまい、もっと低い谷にたどり着けないのと同じです(このような場所を 局所最適解 と呼びます。ニューラルネットワークの勾配降下法でも起こりうる問題です)。scikit-learn が、はじめの中心を変えて何回もやり直すのは、このためです。

この章の振り返り:手法を比べる

分け方の考え方と、向いている場面

手法どんな考え方で分けるか標準化向いている場面・注意
ロジスティック回帰(第5章)重み付きの合計を確率に変える必要速く、係数で理由を説明しやすい。特徴量を工夫しないと、直線でしか分けられない
k近傍法近い kk 個の多数決必要仕組みが単純。予測が遅い。次元の呪いに弱い
SVM一番太い道を通す。カーネルで曲がった境界も必要数千〜数万件のデータで強い。大量のデータでは遅い
決定木(第5章)「いくつ以上か」の質問を重ねる不要人が読める。1本だけでは不安定
ランダムフォレストたくさんの木の多数決不要調整が少なくても安定して強い
勾配ブースティング前の木の間違いを次の木が直す不要表の形のデータで特に強い。調整が大切
ニューラルネットワーク(第6・7章)層を重ねて、特徴を自動で作る必要画像・音声・文章に強い。データと計算が多く必要

(標準化の「必要」は、距離や重み付きの合計を使うため、値の大きさの違いに左右されることを表します)

手書き数字での比較(テストデータの正解率、この章の実験)

ロジスティック回帰k近傍法線形SVMRBFカーネルのSVM決定木ランダムフォレスト勾配ブースティング
0.9610.9700.9700.9850.8570.9780.950

どの手法が一番よいかは、データによって変わります。乳がんのデータでは、ロジスティック回帰・RBFカーネルのSVM・勾配ブースティングが同じ0.977で並びました。「いつでも一番よい手法」はないので、いくつか試して、交差検証で比べる のが基本です。

教師なし学習

手法何をするか
主成分分析データが一番広がっている向きを探し、少ない数の軸にまとめる(次元圧縮)
k-means似たデータ同士をクラスタにまとめる

この章の振り返り

  1. k近傍法: 距離(三平方の定理)で近さを測る。標準化が必要。次元の呪い
  2. SVM: マージン最大化、サポートベクター、ソフトマージンとC、カーネル法
  3. アンサンブル学習: バギング、ランダムフォレスト、ブースティング。間違い方がばらばらなほど、多数決が効く
  4. 線形代数: 行列は変形。固有値・固有ベクトル、特異値分解、ランク、テンソル、アダマール積
  5. 主成分分析: 共分散の表の固有ベクトル、寄与率、次元圧縮。多重共線性
  6. クラスタリング: 教師なし学習、k-means、エルボー法。半教師あり学習
  7. k-means を自分で作る: はじめの中心で結果が変わる(局所最適解)

演習

演習を読み込んでいます…