高次元データの可視化の手法をSwiss rollを例に見てみよう

こんにちは、今井です。

データが与えられた時、分析を行う前にまずデータ同士の関係を視覚的に見たいことがあります。しかし特徴量が4つ以上のデータに対してそのまま可視化することはできないため、なるべく元のデータの関係を保ったまま2,3次元で表現できると嬉しいです。特徴量数の多い高次元データの分析は次元の呪いと呼ばれる現象が起こり得るので、これを回避するために高次元データをより少ない次元(一般的に2,3次元とは限りません)にする次元削除や次元圧縮と呼ばれる方法があります。この方法を用いて2,3次元に次元削除を行えば、高次元データを可視化することができます。今回は高次元データの可視化の難しさを知るために、Swiss rollと呼ばれる3次元データから2次元に色々な方法で写してみましょう。

Swiss rollは日本語では「ロールケーキ」という意味で、下図のとおりロールケーキのような形をしているものです。このSwiss rollの次元削除をして、2次元平面上でキレイなグラデーションの点の集まりができるかを見て行きましょう。

Swiss_roll

このデータの生成及び可視化のRのコードは以下のとおりです。Rでプロットしたオブジェクトはマウスを用いて図を回転させることができます。(上図は画像化しているので動きません)

#可視化及び後に用いる次元削除のためRDRToolboxのインストール
source("http://bioconductor.org/biocLite.R")
biocLite("RDRToolbox")

library(RDRToolbox)

N=1000
p = sqrt(2 + 2 * seq(-1, 1 - 2/N, 2/N))
y = 2 * runif(N, -1, 1)
d_sr = cbind(p * cos(2*pi*p), y, p * sin(2*pi*p))

color <- vector()
for(i in 1:N){
 color[i] = rainbow(ceiling(N/50))[ceiling(i/50)]
}
labels=seq(N)

plotDR(data=d_sr, labels=labels, col=color)

古典的な高次元データの可視化の手法として次の3つがよく知られています:

  1. 主成分分析(PCA)
  2. 多次元尺度構成法(MDS)
  3. 自己組織化マップ(SOM)

■主成分分析(PCA)

主成分分析による2次元への次元削除は、データを線形的に平面に写した時にデータの分散が最も大きくなるような平面を用いることになります。Rで実行した結果が下図になります。色が混ざってしまっており、うまくいっていません。

PCA

#主成分分析による次元削除
d_pca <- prcomp(d_sr, scale=TRUE)
d_pca$x[,1:2]
plotDR(data=d_pca$x[,1:2], labels=labels, col=color)

■多次元尺度構成法(MDS)

多次元尺度構成法はデータ同士の近さを元に、近いもの同士は近くに配置し、遠いものは遠くに配置する手法です。ここではデータ同士の近さをユークリッド距離で測ることにします。Rで実行した結果が下図になります。こちらも色が混ざってしまっており、うまくいっていません。

MDS

#多次元尺度構成法による次元削除
d_cmds <- cmdscale(dist(d_sr), k = 2)
plotDR(data=d_cmds, labels=labels, col=color)

■自己組織化マップ(SOM)

自己組織化マップは2層のニューラルネットワークを用いて2次元への写すものです。ここでは可視化の際に、点が重ならないように乱数を用いて点を散らばらせるjitterと呼ばれる処理を行っています。Rで実行した結果が下図になります。こちらも色が混ざってしまっており、うまくいっていません。

som

#自己組織化マップによる可視化
install.packages("som") #somパッケージのインストール
library(som)
d_som <- som(normalize(d_sr), xdim=8, ydim=4)
plotDR(data=(d_som$visual[,1:2]+0.5+cbind(rnorm(nrow(d_sr),0, 0.2), rnorm(nrow(d_sr), 0, 0.2))), labels=labels, col=color)

古典的な3つの手法では全てうまくいきませんでした。この3つの手法の改良を行った方法が提案されているので、それらの手法による可視化を見ていきましょう。

■カーネル主成分分析

主成分分析がうまくいかなかったのはデータが非線形だったからです。カーネル法と呼ばれる、データを再生核ヒルベルト空間という高次元な空間に写すことで、非線形データも線形的に扱うことが可能になります。このカーネル法と主成分分析を組み合わせたカーネル主成分分析という方法があります。Rで実行した結果が下図になります。一部色が混じってはいるものの、ある程度色が分かれていることが分かります。ハイパーパラメータを調整すればもっとキレイに分かれると思います。

kernel_PCA

#カーネル主成分分析による次元削除
install.packages("kernlab") #kernlabパッケージのインストール
library(kernlab)
d_kpca <- kpca(d_sr, kernel = "rbfdot", features=2, kpar=list(sigma=3))
plotDR(data=pcv(d_kpca), labels=labels, col=color)

■Isomap

次に、多次元尺度構成法のデータ同士の近さを測る方法として、ユークリッド空間を一般化させた多様体を用いるやり方があります。この手法は多様体学習と呼ばれています。isomapは多様体上で距離を測り、多次元尺度構成法を行います。Rで実行した結果が下図になります。非常にうまくいっていることが分かります。

isomap

#isomapによる次元削除
library(RDRToolbox)
d_isomap <- Isomap(data=d_sr, dims=2, k=5)
plotDR(data=d_isomap[[1]], labels=labels, col=color)

■Locally Linear Embedding(LLE)

isomap以外の多様体学習として、多様体が局所的にユークリッドであることを用いたLocally Linear Embeddingというものがあります。Rで実行した結果が下図になります。これもうまくいっていることが分かります。

LLE

#Locally Linear Embeddingによる次元削除
install.packages("lle") #lleパッケージのインストール
library(lle)
d_lle <- lle(d_sr, m=2, k=12)
plotDR(data=d_lle[[1]], labels=labels, col=color)

■Diffusion Map

他にも多様体上のランダムウォークを利用するdiffusion mapというものがあります。Rで実行した結果が下図になります。これもうまくいっていることが分かります。

Diffusion_map

#diffusion mapによる次元削除
install.packages("diffusionMap") #diffusionMapパッケージのインストール
library(diffusionMap)
d_dffmap <- diffuse(dist(scale(d_sr)))
plotDR(data=d_dffmap$X[,1:2], labels=labels, col=color)

■Generative Topographic Map(GTM)

最後に、自己組織化マップの様々な欠点(収束の保証がない等)を解消したgenerative topographic mapという手法を紹介します。これは潜在変数を用いた生成モデルで、EMアルゴリズムを用いて尤度の最大化を行います。Rでこの手法を用いるには”gtm”パッケージがあるのですが、現在はcranから削除されているのでここではRのコードは書かないことにします。cranのアーカイブにあるgtmパッケージのコードを元に実行した結果が下図になります。この方法ではあまりうまくいっていないことが分かります。

gtm

以上、次元削除による可視化の方法を古典的な手法から比較的新しい手法まで紹介をしました。今回は次元削除を図で理解するために元のデータを3次元データで見えるものを対象にしておりましたが、これらの手法は4次元以上のデータでも用いることができます。これらの手法を用いて高次元データの可視化をしてみると新たな発見があるかもしれません。