Rで階層クラスタリングを使う

2016-11-30 (水) 14:41:58 (151d) | Topic path: Top / バイオ・データ・マイニング / Rで階層クラスタリングを使う

はじめに

『Rによるバイオインフォマティクスデータ解析』の7.8節「階層クラスタリング」を参考にして,階層クラスタリングを行います.

準備

Rのインストールについては,次のページを見てください.

ここでは,標準パッケージのstatsUSArrestsデータセットを使います. USArrestsデータセットは,アメリカ合衆国の州ごとの殺人の発生件数,暴行の発生件数,都市部の人口割合,強姦の発生件数を格納したデータです. 犯罪の発生件数については人口10万人当たりの件数で,1973年のデータです.

> data(USArrests)
> head(USArrests)
           Murder Assault UrbanPop Rape
Alabama      13.2     236       58 21.2
Alaska       10.0     263       48 44.5
Arizona       8.1     294       80 31.0
Arkansas      8.8     190       50 19.5
California    9.0     276       91 40.6
Colorado      7.9     204       78 38.7

クラスタリング

クラスタリングは,分類対象のデータ集合をいくつかのグループに分割するものです. 分割された部分データ集合をクラスターといいます.

クラスタリングの手法には,主に階層的アプローチ分割最適化アプローチがあります. ここでは,前者の階層的アプローチを行います.

階層クラスタリング

階層クラスタリングには,トップ・ダウンに階層化する分岐型とボトム・アップに階層化する凝集型があります. ここでは,後者の凝集型をやります.

凝集型階層クラスタリングでは,まず,1つのデータだけを含むクラスターをデータと同じ数だけ作ります. それから,最も近い(似ている)クラスター同士を結合してより大きい新しいクラスターを作ります. これを全てのクラスターが一つに結合されるまで繰り返します.

Rで階層型クラスタリングを用いるには,hclust関数を用います. hclust関数の引数には距離行列を与えます. そこで,距離行列をdist関数で計算します.

> d <- dist(USArrests)
> hc <- hclust(d)
> plot(hc)
usarrests_hclust_complete_euclidean.png

この図を見ると,どのクラスターとどのクラスターが結合したのかがわかります.

距離

上でも説明したように,凝集型階層クラスタリングでは最も近い(似ている)クラスター同士をくっつけますが,この「最も近い(似ている)」クラスターを決めるのに,距離尺度が必要になります.

一般的な距離尺度としては,ユークリッド距離が用いられています. \[ d({\bf x}_1, {\bf x}_2) = \sqrt{ \sum_{i=1}^p \left( x_{2,i} - x_{1,i} \right)^2 } \]

ユークリッド距離の他に,マンハッタン距離(マンハッタンでのタクシーを利用するときのように,一つの軸と並行に移動することしかできないときの移動距離) \[ d({\bf x}_1, {\bf x}_2) =\sum_{i=1}^p \left| x_{2,i} - x_{1,i} \right| \] を使うこともできます. マンハッタン距離を使うには,dist関数にオプションmethod="manhattan"を指定します.

> d <- dist(USArrests, method="manhattan")
> hc <- hclust(d)
> plot(hc)
usarrests_hclust_complete_manhattan.png

この他にも,いくつもの距離尺度が提案されています. 類似度と距離尺度に付いてはこちらにたくさんまとめられています.

結合方式

ユークリッド距離もマンハッタン距離も二つのデータ同士の間の距離を表していますが,どのクラスターとどのクラスターが最も近い(似ている)のかを直接的には表していません.

求めた距離に基づいて,どのクラスターとどのクラスターを結合するのかを決めなくてはなりません. これが結合方式です.

上の二つの例でも用いられた標準の方式は完全連結法 (complete linkage method) という方式で,クラスター[math]C_1[/math]に含まれるデータとクラスター[math]C_2[/math]に含まれるデータの間の距離の中で最大のもの(つまり,最も離れているもの)を[math]C_1 C_2[/math]間の距離として,最も近い(似ている)クラスターを結合します. \[ d(C_1, C_2) = \max_{{\bf x}_1 \in C_1, {\bf x}_2 \in C_2} d({\bf x}_1, {\bf x}_2) \]

単連結法 (single linkage method) では,反対に,クラスター[math]C_1[/math]に含まれるデータとクラスター[math]C_2[/math]に含まれるデータの間の距離の中で最小のもの(つまり,最も近いもの)を[math]C_1 C_2[/math]間の距離として,最も近い(似ている)クラスターを結合します. \[ d(C_1, C_2) = \min_{{\bf x}_1 \in C_1, {\bf x}_2 \in C_2} d({\bf x}_1, {\bf x}_2) \] 単連結法を用いるには,hclust関数にオプションmethod="single"を指定します.

> d <- dist(USArrests)
> hc <- hclust(d, method="single")
> plot(hc)
usarrests_hclust_simple_euclidean.png

群平均法 (group average method) では,クラスター[math]C_1[/math]に含まれるデータとクラスター[math]C_2[/math]に含まれるデータの間の距離の平均を[math]C_1 C_2[/math]間の距離として最も近い(似ている)クラスターを結合します. \[ d(C_1, C_2) = \frac{1}{|C_1||C_2|} \sum_{{\bf x}_1 \in C_1} \sum_{{\bf x_2} \in C_2} d({\bf x}_1 {\bf x}_2) \] hclust関数にオプションmethod="average"と指定すると,群平均法による結合になります. 参考にしている『Rによるバイオインフォマティクスデータ解析』には,クラスターに含まれるデータの平均同士の距離をクラスター同士の距離としているように書かれていますが,この説明は間違っています.

> d <- dist(USArrests)
> hc <- hclust(d, method="average")
> plot(hc)
usarrests_hclust_average_euclidean.png

メジアン法 (median linkage method) では,クラスター[math]C_1[/math]に含まれるデータの中央値とクラスター[math]C_2[/math]に含まれるデータの中央値の間の距離を[math]C_1 C_2[/math]間の距離として,最も近い(似ている)クラスターを結合します. メジアン法を用いるには,hclust関数にオプションmethod="median"を指定します.

> d <- dist(USArrests)
> hc <- hclust(d, method="median")
> plot(hc)
usarrests_hclust_median_euclidean.png

重心法 (centroid linkage method) では,クラスター[math]C_1[/math]の重心とクラスター[math]C_2[/math]の重心の間の距離を[math]C_1 C_2[/math]間の距離として,最も近い(似ている)クラスターを結合します. \[ d(C_1, C_2) = d({\bf c}_1, {\bf c}_2) \] \[ {\bf c}_{i} = \frac{ \sum_{x \in C_i} x}{|C_i|} \] 重心法を用いるには,hclust関数にオプションmethod="centroid"を指定します.

> d <- dist(USArrests)
> hc <- hclust(d, method="centroid")
> plot(hc)
usarrests_hclust_centroid_euclidean.png

Ward法では,クラスター[math]C_1, C_2[/math]を結合してクラスター[math]C_1 \cup C_2[/math]を作ったときに,各データとそれが含まれるクラスターの重心との距離の分散の増分を[math]C_1 C_2[/math]間の距離として,最も近い(似ている)クラスターを結合します. \[ d(C_1, C_2) = {\mathrm E}(C_1 \cup C_2) - {\mathrm E}(C_1) - {\mathrm E}(C_2) \] \[ {\mathrm E}(C_i) = \sum_{{\bf x} \in C_i} (d({\bf x}, {\bf c_i}))^2 \] Ward法を用いるには,hclust関数にオプションmethod="ward.D"を指定します(新しい"ward.D2"という方法もあります).

> d <- dist(USArrests)
> hc <- hclust(d, method="ward.D")
> plot(hc)
usarrests_hclust_ward_euclidean.png

距離行列

hclustでは,距離行列を自分で作成して階層クラスタリングを行うことができます. 距離行列は,(対角要素を除いた)下三角行列からas.distを用いて作成します.

ここでは,例として,A, B, C, Dという4つのデータを含む距離行列を作成します.

まず,名前のベクトルを作成します.

> names = c("A", "B", "C", "D")

つぎに,4次の正方行列を作成します.

> d = matrix(, 4, 4, dimnames=list(names, names))
> d
   A  B  C  D
A NA NA NA NA
B NA NA NA NA
C NA NA NA NA
D NA NA NA NA

対角要素以外の下三角行列の要素に,各データ間の距離を代入します.

> d[2,1] = 1
> d[3,1] = 5
> d[4,1] = 6
> d[3,2] = 4
> d[4,2] = 5
> d[4,3] = 1
> d
   A  B  C  D
A NA NA NA NA
B  1 NA NA NA
C  5  4 NA NA
D  6  5  1 NA

このデータは,一直線上に並べることができ,Aを0とすると,Bが1,Cが5,Dが6の位置にあります.

as.distを用いてこの正方行列を距離行列に変換できることを確認します.

> as.dist(d)
  A B C
B 1    
C 5 4  
D 6 5 1

この距離行列をhclustに引数として与えることで,階層クラスタリングができます.

> hc <- hclust(as.dist(d))
> plot(hc)
dist_hclust.png

クラスター番号

階層クラスタリングによってつけられたクラスター番号を調べるには,cutree関数を使います. cutree関数には,hclust関数によって出力された結果とクラスター数を与えます.

> d <- dist(USArrests)
> hc <- hclust(d)
> cutree(hc, 3)
       Alabama         Alaska        Arizona       Arkansas     California 
             1              1              1              2              1 
      Colorado    Connecticut       Delaware        Florida        Georgia 
             2              3              1              1              2 
        Hawaii          Idaho       Illinois        Indiana           Iowa 
             3              3              1              3              3 
        Kansas       Kentucky      Louisiana          Maine       Maryland 
             3              3              1              3              1 
 Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
             2              1              3              1              2 
       Montana       Nebraska         Nevada  New Hampshire     New Jersey 
             3              3              1              3              2 
    New Mexico       New York North Carolina   North Dakota           Ohio 
             1              1              1              3              3 
      Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
             2              2              3              2              1 
  South Dakota      Tennessee          Texas           Utah        Vermont 
             3              2              2              3              3 
      Virginia     Washington  West Virginia      Wisconsin        Wyoming 
             2              2              3              3              2 

これはWard法による階層クラスタリングの結果をクラスター数を3として分けたときのそれぞれの州が属するクラスター番号です.

まとめ

凝集型階層クラスタリングでは,最も近いクラスターを結合して新しいクラスターを作成することを繰り返すことによってクラスタリングを行います.

このとき,最も近い2つのクラスターを選び出すために,クラスター間の距離を測る必要があります. クラスター間の距離尺度の違いにより,完全結合法,単結合法,群平均法,メジアン法,重心法,Ward法という方法に分かれます.

また,クラスター間の距離尺度はデータ間の距離尺度に基づいているため,データ間の距離も測る必要があります. データ間の距離尺度には,ユークリッド距離,マンハッタン距離,マハラノビス距離,コサイン係数などがあります.

したがって,凝集型階層型クラスタリングでは,データ間の距離尺度とクラスター間の距離尺度の二つを選択することになります.

演習

irisデータに対して、Speciesの列を取り除き、1列目から4列目だけを取り出して階層クラスタリングをやってみよう。

irisデータから1列目から4列目だけを取り出すには、次のようにします。

> data(iris)
> data <- iris[,1:4]

参考文献

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS