u++の備忘録

kmeansのinertiaとは何物か

暇だったのでkmeansのdocumentationを読んでいたら、今まで曖昧な理解だった"inertia"という語についてまとまった言及があったので、自分用メモ。

2.3. Clustering — scikit-learn 0.19.1 documentation

inertiaとは

kmeansの最適化において最小化すべき指標で、各クラスター内の二乗誤差のこと。

  • 凸面や等方性を想定しており、細長い集合などイレギュラーな構造が合わさった集合などを扱うのには向いていない
  • 正規化された指標ではないので「低い方が良く、0が最適」以上のことは言えない

inertiaの算出

ここでは、直接的な関数を使わずにinertiaを算出してみる。Jupyter notebookのコードはGithubで公開。

github.com

サンプル

下記記事の内容を利用。

qiita.com

f:id:upura:20171107113421p:plain

上記のようにクラスター分けされた集合でのinertiaを算出する。関数を用いると、以下の値が出る。

print ('Distortion: %.2f'% km.inertia_)
Distortion: 72.48

定義から計算

定義の通り、各クラスターごとの中心点との二乗誤差を足し上げる。関数を用いた結果と、ほぼほぼ一致した。

SSE = 0
for cluster in range(3):
    SSE += sum((km.cluster_centers_[cluster,0] - X[y_km==cluster,0])**2 + (km.cluster_centers_[cluster,1] - X[y_km==cluster,1])**2)
print(SSE)
72.47601671