« 読了: Gower (1971) 質と量が混じっているときの類似性係数(人呼んでGower距離) | メイン | 読了:Burnham et al. (2001) PLS回帰モデルの「回帰係数」をどう解釈するか »
2019年12月26日 (木)
Szepannek, G. (2018) clustMixType: User-Friendly Clustering of Mixed-Type Data in R. The R Journal, 10(2), 200-208.
数値変数とカテゴリカル変数が混じったデータを一発でクラスタリングするRパッケージclustMixTypeの紹介。実戦投入前の儀式として目を通した。ただのR Journalの記事だけど、読んだものはなんでも記録しておくのだ...
いわく。
Rで量質混合データをクラスタリングする方法としては以下がある。
- gowerパッケージなりcluster::daisy()なりで個体間のGower距離を求める。
- hclust()なりcluster::agnes()なりで階層クラスタリングする [さらっと仰るけどどういう意味よ... Gower距離行列をhclustに食わせるってことじゃなくて?それともいきなり量質混合データを食わせるってことかしらん]
- CluMixパッケージ。個体間の距離行列が必要になるので大データには向いてない。
- flexclustパッケージ。任意の距離関数によるk-centroids法。残念ながら量質混合データの距離関数はいまのところ提供されてない。
- fpc::flexmixedruns()なりclustMDパッケージなり。計算が大変。
- kamilaパッケージ。質的変数はダミー変数に展開しておく必要がある。
最近ではHuangのk-prototypeクラスタリングに基づく提案がたくさん出てきている。
というわけで、お待たせしました、clustMixTypeパッケージのご紹介です。
k-prototypesアルゴリズムというのは、次のような目的関数をとる分割クラスタリングである。$x_i$を個体$i$のベクトル, $mu_j$をプロトタイプ$j$のベクトルとして
$E = \sum_i^n \sum_j^k u_{ij} d(x_i, \mu_j)$
$u_{ij}$は分割を表す二値変数で、任意の$i$について$\sum_j^k u_{ij} = 1$となる。
さて、問題は距離の定義である。変数の数は$p$個、うち最初の$q$個の変数は数値で残りはカテゴリカルだとして、[以下、原文の表記がわかりにくいので、ベクトル$x_i$の$m$番目の要素を$x_{im}$と書く]
$d(x_i, \mu_j) = \sum_m^q (x_{im} - \mu_{jm})^2 + \lambda \sum_{m=q+1}^p \delta(x_{im}, \mu_{jm})$
ただし、$\delta(a,b)$は$a=b$のときに1, そうでないときに0となる関数。
$d()$はユークリッド距離と単純一致距離の重みづけ和となる。
あとはk-meansアルゴリズムと似ていて、(1)プロトタイプをランダムに選び (2)それぞれの個体について、それを$d()$が一番小さいプロトタイプに割り当て、プロトタイプを更新、(3)動かなくなるか反復数が最大に達するまで(2)を繰り返す。
プロトタイプとは、数値変数については平均、カテゴリカル変数についてはモードである。
というわけで、clustMixTypeパッケージではkproto()関数をご用意している。
この関数は重み$\lambda$をいい感じに決める。どうやるのかというと...
もともとHuangは$(1/3)\sigma \leq \lambda \leq (2/3)\sigma$がいいんじゃないかと云っていた($\sigma$は数値変数のSDの平均)。
いっぽうこの関数では、$\sigma$ないし$\sigma^2$と、カテゴリカル変数の集中度を測る$h_{cat}$の両方を考える。
$h_{cat}$の決め方はふたつある。その1, $h_m = 1-\sum_c p^2_{mc}$の平均とする[つまり、各変数について水準の割合の平方和を1から引いて、平均をとるわけね]。その2, $h_m = 1-max_c p_{mc}$の平均とする[各変数について最大の水準の割合を1から引いて、平均をとるわけね]。デフォルトではその1。
で、$\lambda$は$\sigma/h_{cat}$か$\sigma^2/h_{cat}$のどちらかにする。デフォルトでは前者。
[えーと、分子は数値変数の分散が大きいときに大きくなり、分母はカテゴリカル変数の分布が分散しているときに大きくなる。要は分散のバランスをみているわけだ]
[欠損はどう扱うかとか、アルゴリズムの高速化とか。メモ略]
[事例。省略]
...うーむ。読めば読むほど、そんなことでいいんすか?という疑念がわくぞ。要するに、全部カテゴリカル変数だったら、個体間の距離は単純なハミング距離ってことですよね。それってどうなの。
論文:データ解析(2018-) - 読了: Szepannek (2018) RのclustMixTypeパッケージ