Differential Entropic Clustering of Multivariate Gaussians (NIPS 2006) をPythonで実装した

論文はこれ.

proceedings.neurips.cc

多変量ガウス分布の平均と共分散行列の集合が与えられたときに,分布を単位として(=対応する平均と共分散をペアにして)クラスタリングするアルゴリズムが提案されている. 行列の距離を測るための"Burg matrix divergence"が利用されているのが興味深い.これは行列を対象にしたBregman divergenceに相当する.

実装してみたのがこれ.要progressbar2.

Section 4.1 "Synthetic Data"を参考に,simplex上から平均ベクトルをクラスタ数だけランダムにサンプリングする.共分散行列は対角共分散にして,かつ対角成分の大きさも論文を参考にした.論文と設定が異なるのは,クラスタリングの対象とするのが標本平均と標本共分散という点である.つまり平均ベクトルと共分散行列で指定されるガウス分布から点を指定個数だけサンプルし,それらサンプル点に基づいて標本平均と標本共分散を計算する.論文よりも厳しい条件で分布クラスタリングを試していると言える.

クラスタリングの性能指標は以下を計算できるようにした.Purity Score以外は全てscikit-learnから利用できる. 参考までにAccuracyも計算している.

  • Rand Index
  • Adjusted Rand Index
  • Adjusted Mutual Information
  • Normalized Mutual Information
  • Purity Score
  • Homogenity Score

試しに動かしたらこんな感じ:

  • Rand Index = 0.776869 ± 0.071684
  • Adjusted Rand Index = 0.420437 ± 0.191200
  • Adjusted Mutual Information = 0.485865 ± 0.204090
  • Normalized Mutual Information = 0.494591 ± 0.200726
  • Purity Score = 0.630800 ± 0.135231
  • Homogenity Score = 0.485421 ± 0.196300

乱数の種を50回変えたときの結果(平均と標準偏差)である.データの次元数は4,クラスタ数も4である.今回はスコアのバラつきが大きくなった. スクリプト内のget_dataset関数をカスタマイズし,各クラスタの平均ベクトルの取り方や共分散行列の取り方を変えてみると,バラつきの傾向も変わるので色々と楽しめる.例えば,今回のように平均ベクトルをsimplex上に限定する必要はない.

クラスタリング結果の可視化はそのうち.