データ解析入門

クラスタリング(3章)

画面操作キー(全画面,ワイド表示,ソースコードハイライト)

クラスタリング(3章)

  • クラスタリングとは
    • 「類似したデータをクラスタ(Cluster:集団)としてまとめること」
    • データをクラスタへ分割すること
  • クラスタリングには
    • 階層的クラスタリング
    • 非階層的クラスタリング(重要,本講義の対象)
  • 非階層的クラスタリングには,クラスタリングの良さを示す基準がある
    • 基準(目的関数)の最適値を与える分割は「最適解」
    • 基準を変えれば,別の切り口で分割.最適解も変わる
    • 組み合わせ数が膨大.通常はその近似解を探索する
    • 良い近似解を得るには,解の探索アルゴリズムの選択が鍵
  • 非階層的クラスタリング.クラスタリング基準アルゴリズムを選択

平方和最小基準クラスタリング(1)

  • クラスタリング対象:複数の項目を持つデータの集合.
  • 複数の項目→座標値→ベクトル表現.ベクトル集合(入力ベクトル
  • ベクトル間の距離(差分ベクトルの長さ)の近いもの同士をクラスタへ
  • あるクラスタに入力ベクトル○(\({\boldsymbol x}\))が6つ
  • その重心ベクトル●(\({\boldsymbol \mu}\)) との差分ベクトル(\({\boldsymbol x}-{\boldsymbol \mu}\))
  • 差分ベクトルの長さの2乗\(\|{\boldsymbol x}-{\boldsymbol \mu}\|^2\)の和→\(\sum \|{\boldsymbol x}-{\boldsymbol \mu}\|^2\)基準

平方和最小基準クラスタリング(2)

  • クラスタリング対象:複数の項目を持つデータの集合.
  • ベクトル間の距離(差分ベクトルの長さ)の近いもの同士をクラスタへ
  • 座標値を持つデータはベクトル(位置ベクトル)で表現可能.
  • ベクトル\({\boldsymbol x}\)の長さは\(\|{\boldsymbol x}\|\)と表す.\(\|{\boldsymbol x}\|=\sqrt{x_1^2+x_2^2+\cdots}\)(何次元でも同様)
  • 平方和基準,差分ベクトルの長さの2乗(ユークリッド2乗距離)使用

「手動」クラスタリング演習(1)

  • クラスタリングは,個々のデータにクラスタラベルを付与すること
  • 下記のデータは,札幌市からの相対座標(2次元)を持つ
    札幌市   0.0    0.0
    函館市   -50.3  -140.8
    小樽市   -28.9  14.2
    旭川市   81.2   78.4 
    ‥‥‥
    例えば,4番目のカラムにクラスタラベル(0..3)を付与すること
  • 札幌市   0.0    0.0      0
    函館市   -50.3  -140.8   1
    小樽市   -28.9  14.2     0
    旭川市   81.2   78.4     2 
  • JavaScriptアプリケーションではラジオボタンで選択すること

「手動」クラスタリング演習(2)

  • あるクラスタの平方和の算出過程.重心ベクトル\({\boldsymbol \mu}\)と差分ベクトル\({\boldsymbol x}-{\boldsymbol \mu}\)を計算
  • クラスタ\(C^k\)の平方和→ \( \sum_{{\boldsymbol x}_i \in C^k} \|{\boldsymbol x}_i-{\boldsymbol \mu}_k\|^2. \) (\({\boldsymbol \mu}_k\)は,クラスタ\(C^k\)の重心)
\({\boldsymbol x}\) or \({\boldsymbol \mu}\)\({\boldsymbol x}-{\boldsymbol \mu}\)\(\|{\boldsymbol x}-{\boldsymbol \mu}\|^2\)
札幌市\((0.0, 0.0)\)\((-12.8, 7.3)\)\(12.8^2+7.3^2\)
千歳市\((23.8,-26.4)\)\((11.0,-19.1)\)\(11.0^2+19.1^2\)
江別市\((14.6, 4.6)\)\((1.8, 11.9)\)\(1.8^2+11.9^2\)
重心\({\boldsymbol \mu}\)\((12.8,-7.3)\)

「手動」クラスタリング演習(3)

  • クラスタ\(C^k\)の平方和→ \( \sum_{{\boldsymbol x}_i \in C^k} \|{\boldsymbol x}_i-{\boldsymbol \mu}_k\|^2. \)
    • \({\boldsymbol \mu}_k\)は,クラスタ\(C^k\)の重心
    • \({\boldsymbol x}_i \in C^k\)は,「クラスタ\(C^k\)に属する\({\boldsymbol x}_i\)すべて について」
  • クラスタ\(1..K\)の平方和を足し合わせると,→クラスタリング基準\(J_W\) \[ J_W = \sum_{k=1}^K \sum_{{\boldsymbol x}_i \in C^k} \|{\boldsymbol x}_i-{\boldsymbol \mu}_k\|^2 \]
  • \(J_W\)が小さいほど,平方和最小基準クラスタリングにおいて良い
  • 演習:クラスタリング(=クラスタラベルの付与)を行い,\(J_W\)を計算

「手動」クラスタリング演習(4)

式とプログラムによる実装例の対応について \[ J_W = \sum_{k=1}^K \sum_{{\boldsymbol x}_i \in C^k} \|{\boldsymbol x}_i-{\boldsymbol \mu}_k\|^2 = \sum_{k=1}^K \sum_{{\boldsymbol x}_i \in C^k} \sum_{m=1}^M(x^i_m-\mu^k_m)^2 \] クラスタ内平方和計算プログラムcalcJw.cppの抜粋
vecs[i][m]はi番目の入力ベクトルのm次元目の要素\(x^i_m\)
mu[label][m]は上式における重心ベクトルの要素\(\mu^k_m\)
for( int i = 0 ; i < nvec ; i++ ){   // nvecは入力ベクトル数
  int label = lbls[i];               // i番目のベクトルのクラスタラベル
  for( int m = 0 ; m < ndim ; m++ ){ // ndimは次元数M.ここでは2
    double tmp = vecs[i][m] - mu[label][m]; 
    Jw += tmp * tmp; 
  }
} 

k-meansアルゴリズム(1)

\[ J_W = \sum_{k=1}^K \sum_{{\boldsymbol x}_i \in C^k} \|{\boldsymbol x}_i-{\boldsymbol \mu}_k\|^2\]
  • 平方和最小基準クラスタリングのための代表的アルゴリズム
  • 基本アイデア:基準(=目的関数)\(J_W\)を減少させるように更新
    • \(\|{\boldsymbol x}_i-{\boldsymbol \mu}_k\|^2 > \|{\boldsymbol x}_i-{\boldsymbol \mu}_t\|^2\)なら\({\boldsymbol x}_i\)の所属先を\(C^t\)に変更
  • 下記を交互に繰り返す(重みベクトル\({\boldsymbol w}(\supset {\boldsymbol \mu})\)の導入)
    • 重みベクトル\({\boldsymbol w}_k\)の更新:クラスタの重心\({\boldsymbol \mu}_k\)を計算し,これを重みベクトル\({\boldsymbol w}_k\)とする
    • クラスタラベルの更新:すべての入力ベクトル\({\boldsymbol x}_i\)の所属先を, 最も近い重心ベクトル\({\boldsymbol w}_k\)に対応するクラスタ\(C^k\)に変更する

k-meansアルゴリズム(2)

  • 重みベクトル\({\boldsymbol w}_k\)の更新:クラスタの重心\({\boldsymbol \mu}_k\)を計算し,これを重みベクトル\({\boldsymbol w}_k\)とする(図左
  • クラスタラベルの更新:すべての入力ベクトル\({\boldsymbol x}_i\)の所属先を, 最も近い重みベクトル\({\boldsymbol w}_k\)に対応するクラスタ\(C^k\)に変更する(図右
    • 重みベクトル\({\boldsymbol w}\)による「ボロノイ分割」,境界線は垂直二等分線
  • 演習:k-meansアルゴリズムが\(J_W\)を減少させることを実験で確認

k-meansアルゴリズム(3)

重みベクトル\({\boldsymbol w}_k\)の更新の実装例:クラスタの重心\({\boldsymbol \mu}_k\)を計算し,これを重みベクトル\({\boldsymbol w}_k\)とする
common.cppupdateWeightより.重みベクトル\({\boldsymbol w}\)はweightと表記
//-- クラスタの重心として重みベクトルを更新 --
for( int k = 0 ; k < numc ; k++ )   // nvecは入力ベクトル数
  for( int m = 0 ; m < ndim ; m++ ) weight[k][m] = 0; //ベクトル初期化
std::vector<double> n(numc,0);      // n[k]はクラスタkの要素数を格納
for( int i = 0 ; i < nvec ; i++ ){
  int label = lbls[i];              // i番目のベクトルのクラスタラベル
  n[label]++;                    // ↓所属する入力ベクトルの和算出
  for(int m = 0 ; m < ndim ; m++) weight[label][m] +=vecs[i][m];
}
for( int k = 0 ; k < numc ; k++ )//要素数で割り(平均化)重みベクトル算出
  if( n[k] != 0 ) 
    for( int m = 0 ; m < ndim ; m++ ) weight[k][m] *= 1.0/n[k];

k-meansアルゴリズム(4)

入力ベクトル\({\boldsymbol x}_i\)のクラスタラベル更新common.cpp,updateLabel
for( int i = 0 ; i < nvec ; i++ ){
  int label = -1;        //-- クラスタラベルの仮設定(以下で更新)
  double minE = std::numeric_limits<double>::max(); //最小誤差初期化
  for( int k = 0 ; k < numc ; k++ ){ //-- 各重みベクトルとの誤差計算
    double sum = 0;      //-- 誤差計算用の変数
    for( int m = 0 ; m < ndim ; m++ ){
      double tmp = vecs[i][m] - weight[k][m];
      sum += tmp * tmp;
    }
    if( sum < minE ){    //-- もし「最小誤差」の候補より小さいなら
      minE = sum;        //-- 「最小誤差」の候補の更新
      label = k;         //-- クラスタラベル候補の更新
    }
  }
  lbls[i] = label;       //-- クラスタラベルの更新
}

ベクトル量子化(1)

  • ベクトル量子化は,クラスタリングと表裏一体の解析(タスク)
  • 入力ベクトル集合を代表する代表ベクトルを求めること(←大事)
  • 入力ベクトルを少ない代表ベクトルで表すことで,データ圧縮が可能.
  • これも,評価基準(量子化誤差,例:2乗誤差\(E_Q\))に基づく

    • \[E_Q = \sum_{i=1}^N \min_k\|{\boldsymbol x}_i-{\boldsymbol w}_k\|^2 \]


  • \(E_Q\)は,クラスタリングにおける,「クラスタラベル更新」時の入力ベクトル\({\boldsymbol x}_i\)と最近傍重みベクトル\({\boldsymbol w}_k\)との長さの2乗和に等しい.

ベクトル量子化(2)

  • k-meansアルゴリズムは,局所最適解(平方和\(J_W\)一定)に収束
  • 収束時,クラスタの重心\({\boldsymbol \mu}\)と重みベクトル\({\boldsymbol w}\)は等しい
  • 収束時,クラスタリング基準\(J_W\)と2乗誤差\(E_Q\)は等しい
  • クラスタリング問題の局所最適解\({\cal C}\)は,解\({\cal C}\)で決まる重心ベクトル\({\boldsymbol \mu}_k\)の集合を代表ベクトル集合とするベクトル量子化問題の解\({\cal W}\)のボロノイ分割で決まる分割\({\cal C}'\)と一致.
    • クラスタリングの解\({\cal C}\)は,各入力ベクトルが属するクラスタラベル\(C^k\)情報の集合
      ベクトル量子化の解\({\cal W}=\{{\boldsymbol w}_1,\ldots\}\)は重みベクトルの集合
  • この意味において,局所最適解における両問題の解は実質的に等価
  • 平方和最小基準クラスタリング問題の局所最適解探索は,2乗誤差に基づくベクトル量子化問題の局所最適解の探索に置き換えられる

競合学習

  • 競合学習はベクトル量子化アルゴリズム(代表ベクトルを求める)
  • クラスタリングアルゴリズムでもある(局所最適解が同じため)
  • k-meansアルゴリズムは,重みベクトル\({\cal W}\)を一括更新
  • 競合学習では,\({\boldsymbol w}\)を逐次的に更新(下記を繰り返す)
    • ランダムに入力ベクトル\({\boldsymbol x}\)を選択
    • 入力ベクトルに最も近い重みベクトル\({\boldsymbol w}_c\)(勝者)を選択
    • 勝者\({\boldsymbol w}_c\)を入力ベクトル\({\boldsymbol x}\)に近づけるよう更新
    • \({\boldsymbol w}_c=(1-\gamma){\boldsymbol w}_c+\gamma{\boldsymbol x}\). \(\gamma\)は学習率(0.1など)
    • 局所誤差\(\|{\boldsymbol x}-{\boldsymbol w}_c\|^2\)を小さくする(確率的降下法)
  • クラスタリング基準とアルゴリズムの選択が重要
  • 演習:k-meansアルゴリズムと競合学習の性能比較

さまざまなクラスタリング基準

  • クラスタリング基準とアルゴリズムの選択が重要
  • 平方和最小基準以外にもクラスタリング基準がある
  • ビッグデータ(行動ログ,文書)の多くは高次元.別の基準が必要
  • 高次元データでは,球面集中現象「一様分布する特徴ベクトルは,超球の表面付近に集中して存在する」が起こりやすい
    • バームクーヘンのたとえ「内側の1cmより外側の1cm」
    • 平方和最小基準は,重心付近に多くのデータがあることを前提
    • そのため役に立たない(「前提=仮定」は,教科書5.5節記載)
  • さまざまなクラスタリング基準の例(教科書では8章で紹介)
    • コサイン類似度
    • 情報理論的クラスタリング
  • アルゴリズムや考え方などは,平方和基準と類似あるいは共通
  • 平方和最小基準とそのためのアルゴリズム理解は有意義

<Thank You!>

データ解析入門(第3章) 内山俊郎