目次(まとめ)
◾️ 次元圧縮とは「高い次元」で表現されたデータを「低い次元」で表現すること
◾️ 「UMAP」は、「主成分分析」や「t-SNE」に並ぶ次元圧縮法の1つ
◾️ 関連記事
こんにちは、みっちゃんです。
今回の記事では、「高い次元」で表現されたデータを「低い次元」で表現するための手法の1つである、UMAP(Uniform Manifold Approximation and Projection)について、Rでの実行方法について紹介します。
次元圧縮とは「高い次元」で表現されたデータを「低い次元」で表現すること
ここでは、説明のために、Rにあらかじめ準備されている車の性能データ(mtcars)を使用します。
したがって、手持ちのファイルから読み込みを行う必要がありません。
以下のように実行することで、"mtcars" の一部を取り出して、データの外観を知ることができます。
> head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
ここでは便宜上、"mtcars" のスケールのばらつきを解消するため、以下のように実行して、"data" という変数に "mtcars" を読み込みます。
> data <- scale(mtcars)
データは、以下のようになっています。
> head(data)
mpg cyl disp hp drat
Mazda RX4 0.1508848 -0.1049878 -0.57061982 -0.5350928 0.5675137
Mazda RX4 Wag 0.1508848 -0.1049878 -0.57061982 -0.5350928 0.5675137
Datsun 710 0.4495434 -1.2248578 -0.99018209 -0.7830405 0.4739996
Hornet 4 Drive 0.2172534 -0.1049878 0.22009369 -0.5350928 -0.9661175
Hornet Sportabout -0.2307345 1.0148821 1.04308123 0.4129422 -0.8351978
Valiant -0.3302874 -0.1049878 -0.04616698 -0.6080186 -1.5646078
:
このように、"data" は、さまざまな車の性能(例えば、mpg, cyl, dispなど)を示すデータになっています。
次元圧縮の手法は、一般的に、"data" のように、高次元の項目からなるデータを、2次元のプロットで可視化します。
「UMAP」は、「主成分分析」や「t-SNE」に並ぶ次元圧縮法の1つ
次元圧縮および可視化は、さまざまなプログラミング言語で行うことができます。
以前の記事では、「主成分分析」や「t-SNE」をRで実行する方法と、それぞれの手法で得られる結果を比較するためのツールを紹介しました。
今回の記事では、「UMAP」をRで実行する方法を紹介します。
Rで「UMAP」を行うためには、以下のように実行します。
## インストールしていなければ実行する箇所 ##
## > install.packages("umap")
## > library(umap)
> umap_score <- umap(data)
> head(umap_score$layout)
[,1] [,2]
Mazda RX4 0.7022630 -1.0665393
Mazda RX4 Wag 0.3696485 -1.4252163
Datsun 710 -0.5330838 -2.5162792
Hornet 4 Drive -1.2338251 -0.6928031
Hornet Sportabout 1.1212045 3.6401369
Valiant -1.0218902 -0.5508367
可視化をするためには、以下のように実行します。
> plot(umap_score$layout[,1], umap_score$layout[,2])
得られた結果は、以前の記事で紹介した「t-SNE」を用いた結果と異なることがわかります。