トップページ | ひとつ上のページ | 目次ページ | このサイトについて | ENGLISH

高次元を2次元に圧縮して可視化

高次元を2次元に圧縮して可視化する方法を使うと、 サンプルの仲間分けの分析 ができます。

2次元にすることによって、データの様子を見ることが簡単になり、データの特徴をつかみ易くなります。 下の例は、3次元データを2次元に変換した例です。 4つのグループにサンプルが分かれていることが、 2次元散布図 で簡単にわかるようになっています。 なお、変換前のデータはもっと高次元でもできます。
k-means --> tsne

2次元マップの特徴

たくさんの列(説明変数)があるデータを 2次元散布図 を使って調べる時には、 一般的には、2列ずつの組み合わせを順に散布図にします。

高次元を2次元に圧縮して可視化する方法でも散布図を作るのですが、この散布図には、2列ではなく、すべての列の情報が入っています。

「高次元データを2次元データにする」という説明では、ピンと来ないかもしれませんが、 本来であれば2列しか表現できないはずの散布図に、たくさんの列の情報を描いてしまうのが、すごいです。

ブレーンストーミングの後に、 出てきた意見を似ているものでグループに分けてみたり、 何かのコレクションを、似ているもので近くに置いてみたりする事がありますが、 この2次元マップは、その発想に近いです。 つまり、近い場所にあるかどうかは意味があるのですが、マップ上のどこにあるのかには、あまり意味がありません。

高次元を2次元に圧縮する方法

高次元を2次元に圧縮して可視化する方法は、2次元データができてしまえば、その後に 2次元散布図 を作る作業は基本的に同じです。 手法の違いは、「高次元を2次元に圧縮」の部分になります。

主成分分析

主成分分析 は、このページの方法の中で一番有名と思います。 主成分分析 を高次元を2次元に圧縮する方法として使う場合、 主成分分析でも2次元まで圧縮できることがありますが、データによっては2次元だけでは無理があります。

多少無理があってでも、高次元データを2次元データに圧縮する方法

多少無理があってでも、高次元データを2次元データに圧縮する方法としては、 多次元尺度構成法自己組織化マップ 、tSNE、LLEがあります。

上記の方法は、すべて2次元マップに 2次元散布図 を使います。 ネットワークグラフ を使うものとしては、 ネットワーク式の多次元尺度構成法 というのが、このサイトにはあります。

高次元を2次元以外に圧縮する方法の使い道

高次元データを2次元データに圧縮する方法は、パラメータを変更すれば、3次元や1次元にも圧縮できるようになっています。 特に指定しなくても使える方法は、デフォルトが「2」になっています。

3次元に圧縮する場合は、次元圧縮としての使い道はあるかもしれませんが、「マップで見る」という使い方には不向きです。

1次元の量的データに圧縮すると、「グループに順番を付ける」という使い道ができそうですが、 なんの指標もなく、高次元を1次元に圧縮したデータは、1次元の値に意味がないので、順番を付ける使い方ができません。 それもあり、1次元への圧縮も積極的に使う用途がないように思っています。

なお、上記は、1次元の量的データに変換する話です。 高次元の量的データを、1次元の質的データに変換する方法としては、 クラスター分析 があります。 1次元にするのなら、質的データの方が使い道があります。

2次元マップの使い方

2次元マップは、マップを見て、サンプルの全体像を分析する方法です。

見た後の動きとして、データをグループに分けて扱いたくても、グループのラベルは手作業で付けることになります。 ラベルを自動的に付ける方法としては、 クラスター分析 があります。

2次元マップと クラスター分析 は、お互いの苦手な事や、できない事を補完し合う使い方ができます。

次元削減や多様体学習の方法として

このページは、高次元を2次元に圧縮して可視化する方法としてまとめたものですが、 このページの手法は、「次元削減」や「多様体学習」の手法として紹介される方が一般的です。

次元削減の方法として

次元削減の手法として使う時は、必ずしも2次元まで圧縮する必要はなく、 中間層 として使って、モデルの計算負荷を減らしたり、モデルをわかりやすくするために使います。

この目的で使う時は、 「多少無理があってでも、高次元データを2次元データに圧縮する方法」よりも、 主成分分析 の方が、使いやすいです。 「高次元を2次元に圧縮して可視化する方法」としては、 主成分分析 よりも、「多少無理があってでも、高次元データを2次元データに圧縮する方法」の方が良いので、優劣が逆転しています。

多様体学習の方法として

多様体学習の手法としては、スイスロールのようなデータを2次元で表現するために使っています。

筆者は、製造業や工場の中のデータを扱うことが多いです。 スイスロールのようになっているデータはあるにはありますが、 多様体学習のような使い方はしないので、多様体学習の手法としては使い道が思いつかないでいます。

各手法の比較

3次元空間に、4つのグループのあるデータについて、 主成分分析 (PCA) 、 多次元尺度構成法 (MDS) 、 自己組織化マップ (SOM)、t-SNE、LLE、 ネットワーク式の多次元尺度構成法 (nMDS)を使った例になります。

4つのグループを明確に分けることを目標とすれば、明確に分かれていて、しかも字が重なっていないnMDSが一番良いです。 LLE、PCA、MDS、SOMについては、字の重なり方を取るか、明確に分かれるかを取るかで分かれますが、大きな差はないようです。 この中で一番良くなかったのはt-SNEで、「4つに分かれるはず」と思って見れば4つに分かれているように見えますが、 3つや2つのグループにも見えます。

t-SNEが一番良い手法のように解説されている事例もあるようですが、このページの事例ではそうなりませんでした。

ちなみに、PCAとMDS以外の手法は、計算するたびに、グループの配置が変わります。 この点が嫌な場合は、一番良い方法は、PCAやMDSということになります。

k-means nMDS LLE PCA MDS SOM tSNE

Rの実施例(t-SNE、LLE)

以下は、t-SNEとLLEの実施例です。 主成分分析多次元尺度構成法自己組織化マップネットワーク式の多次元尺度構成法 は、単純に高次元を2次元に圧縮する方法ではないため、それぞれのページに実施例があります。

R の使用例は下記になります。 (下記は、コピーペーストで、そのまま使えます。 この例では、Cドライブの「Rtest」というフォルダに、 「Data1.csv」という名前でデータが入っている事を想定しています。 このコードの前に、ライブラリのインストールが必要です。

入力データの作成(各手法共通)

表のようなデータがあったとします。サンプルの名前(「Name」)と3次元のデータがあります。 下のコードは、サンプルの名前の列がなくても使えます。

k-means k-means

setwd("C:/Rtest") # 作業用ディレクトリを変更
library(som)
# ライブラリを読み込み
Data1 <- read.csv("Data1.csv", header=T)
# データを読み込み
Data11 <- normalize(Data1[,1:3],byrow=F)
# 標準化する列を指定。この例は1から3列目の場合

出力データを計算するまで(t-SNEの場合)

library(Rtsne) # ライブラリを読み込み
ts <- Rtsne(Data11, perplexity = 3)
# Rtsneの実施
output <- ts$Y
# 得られた2次元データの抽出

perplexityはデフォルトが30になっていて、この実施例のデータでperplexityを何も設定しないとエラーになります。 この実施例では、4以上に設定するとエラーになりました。
上の実施例では、「perplexity = 1」となっています。 点の離れ方が変わります。

出力データを計算するまで(LLEの場合)

library(lle) # ライブラリを読み込み
ts <- lle(Data11, m = 2, k = 2)
# LLEの実施
output <- ts$Y
# 得られた2次元データの抽出

引数のmは、出力データの次元数です。 kは、近傍の点の数です。 kは、「calk_k」という関数で最適値を求めることができるようなのですが、筆者は試していません。

グラフの作り方(各手法共通)

出力データがあれば、グラフはいろいろな作り方ができます。 以下は、 ggplot2 を使う場合です。

Data <- cbind(output, Data1)  # 元データとSOMの結果を合わせる。
Data$Index <-row.names(Data)
# Indexという名前の列を作り、中身は行番号にする
library(ggplot2)
# パッケージの読み込み#
ggplot(Data, aes(x=Data[,1], y=Data[,2],label=Index)) + geom_text()
# Indexを使った言葉の散布図
tsne

Nameの列でも作れます。
ggplot(Data, aes(x=Data[,1], y=Data[,2],label=Name)) + geom_text() # Nameを使った言葉の散布図
tsne

サンプルの分布の仕方だけを見たい時は、 普通の 2次元散布図 の方が良いこともあります。
ggplot(Data, aes(x=Data[,1], y=Data[,2])) + geom_point() # 2次元ジター散布図のみ
tsne

2次元マップをクラスター分析で色分け

上の例で「4つのグループがある」という風に見えるのなら、4色に分けたくなります。 色付けを自動的にする方法として、 クラスター分析 が役に立ちます。

見た後の動きとして、データをグループに分けて扱いたくても、グループのラベルは手作業で付けることになります。 ラベルを自動的に付ける方法としては、 クラスター分析 があります。

2次元マップと クラスター分析 は、お互いの苦手な事や、できない事を補完し合う使い方ができます。 2次元マップをクラスター分析に持ち込むと、さらに、 決定木によるクラスタリングの分析 ができますので、2次元マップで見えているグループが、高次元空間とどのような関係にあるのかが調べられるようになります。

Rの実施例

下のコードは、上のコードの続きになります。 混合分布法というクラスター分析を使うため、mclustというライブラリーのインストールが必要になります。 k-means法はRの標準ライブラリーなので手間が少ないですが、混合分布法の方が、欲しい分かれ方に近くなるようです。

library(mclust) # ライブラリを読み込み
mc <- Mclust(output,4)
# 混合分布で分類。これは4個のグループ分けの場合
output2 <- factor(mc$classification)
# 分類結果の抽出
Data <- cbind(Data, output2) 
# クラスター分析Mの結果を追加
ggplot(Data, aes(x=Data[,1], y=Data[,2],label=Index)) + geom_text(aes(colour=output2))
# Indexを使った言葉の散布図
tsne



参考文献

ALBERT社のブログ
スイスロールのデータを使って、様々な手法を比較した例が載っています。
https://blog.albert2005.co.jp/2014/12/11/%E9%AB%98%E6%AC%A1%E5%85%83%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%AE%E6%89%8B%E6%B3%95%E3%82%92swiss-roll%E3%82%92%E4%BE%8B%E3%81%AB%E8%A6%8B%E3%81%A6%E3%81%BF%E3%82%88/


Pythonではじめる教師なし学習 機械学習の可能性を広げるラベルなしデータの利用」 Ankur A. Patel 著 中田秀基 訳 オライリー・ジャパン 2020
次元削減として、PCA( 主成分分析 )、 特異値分解 、ランダム射影、Isomap、MDS( 多次元尺度構成法 )、LLE(局所線形埋め込み)、t-SNE、辞書学習、ICA( 独立成分分析 )が紹介されています。


順路 次は 自己組織化マップ

Tweet データサイエンス教室