次元削減とその詳細

はじめに

この記事では主成分分析から最新のUMAPまで、比較とそのアルゴリズムの詳細を説明します。

なぜ次元削減するか

次元削減というのは次元を削減するものというよりも高次元のデータ、例えば1万次元のデータはそのままでは見ることができません。ですが、次元を3次元または2次元にするとデータを直接見ることができます。(可視化することができます。)

その他にもニューラルネットのパラメータの調整などにも利用されることがあります。

主成分分析(Primcipal Component Analisys)とは

あえて、詳細な説明をせずにひとことで言うと、データを高い次元から低い次元へ写す手法です。
これだけでは、意味が分からないので例を交えて説明します。

痩せているのか太っているのかを表すのに、体重と身長からBMIを計算することがあります。

BMIも一種の次元削減と考えることができます。(体重と身長という2次元でーからBMIという1次元のデータへという次元削減)
PCAもアルゴリズムは違えど、次元削減という目線では同じと見ることもできるでしょう。

では具体的にPCAの説明をしていきます。

PCAは情報をより保った部分空間を抽出することが目的となります。

具体的には

N次元実ユークリッド空間に値をとる確率変数 X が確率密度関数 q(x)に従うとし、
kを1以上N未満の自然数とする。N×N行列Aで

条件「 rank A ≦ k 」を満たすものに対して

この数式を最小にするAを求めるのが主成分分析となります。

数学的には高度な知識(射影、直和分解、特異値分解)が要求されますので、詳しくは参考のページをご覧ください。
他には分散で理解する方法もあります。

https://qiita.com/NoriakiOshita/items/460247bb57c22973a5f

T-SNEとは

アルゴリズムについてはこちらをご覧下さい
https://qiita.com/stfate/items/8988d01aad9596f9d586

原著
http://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf

UMAPとは

UMAPの論文を翻訳したものは以下となります。

https://whispon.com/2018/03/26/879/

データの比較

データはwineデータセットを利用します。

データは13クラスから構成されています。その内訳は

1) Alcohol
2) Malic acid
3) Ash
4) Alcalinity of ash
5) Magnesium
6) Total phenols
7) Flavanoids
8) Nonflavanoid phenols
9) Proanthocyanins
10)Color intensity
11)Hue
12)OD280/OD315 of diluted wines
13)Proline

上から順に主成分分析、T-SNE、UMAPの結果となっております。

結果を見るとPCAとT-SNEのは同じようにデータが射影されてますが、UMAPの場合はイモムシのような結果になっており、結果を解釈するまでもなく良くない射影(ワインデータの場合は)になっていると言えると思います。

次はT-SNEのパラメータを弄って再描画してみた結果です。

渦巻き状にデータが配置されました。
パラメータは以下のとおりです。

from sklearn.manifold import TSNE
X_embedded = TSNE(n_components=3,learning_rate=70,n_iter=2000).fit_transform(wine.data)

UMAPもパラメータを変えてもう一度再描画してみます。

T-SNEと同じような結果になりました。UMAPとT-SNEはパラメータの調整しだいという感じですね。
パラメータは以下のとおりです。

import umap
embedding = umap.UMAP(n_components=3,n_neighbors=20,
                      min_dist=0.6,
                      metric='correlation').fit_transform(wine.data)

パラメータを調整するとT-SNEとUMAPはPCAよりもデータが分離されてより解釈しやすい形になることがわかりました。

結果の正しさについて

結果の正しさを考えるのは数学的に高度な問題です。
射影されたデータの意味についてはデータそのものの知識を持っていることが前提となります。

参考

渡辺澄夫先生のページから
http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/dataan201704.pdf

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
from matplotlib import animation

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

from sklearn.datasets import load_wine
wine = load_wine()

y = wine.target
target_names = wine.target_names
colors = ['navy', 'turquoise', 'darkorange']
lw = 2

from sklearn.decomposition import PCA
X = PCA(n_components=3).fit(wine.data).transform(wine.data)
def init():
    for color, i, target_name in zip(colors, [0, 1, 2], target_names):
      ax.scatter(X[y == i, 0], X[y == i, 1], X[y == i, 2],color=color, alpha=.8, lw=lw, label=target_name)
    return fig,
def animate(i):
    ax.view_init(elev=10., azim=i)
    return fig,

# Animate
anim = animation.FuncAnimation(fig, animate, init_func=init, 
                               frames=360, interval=20, blit=True)
# Save
anim.save('pca_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])

PCA以外のT-SNE, UMAPも書き方は同じなので省略します。

自己符号化器(オートエンコーダ)も次元削減アルゴリズムの一種です。
その自己符号化器を説明します。

自己符号化器(Autoencoder)

自己符号化器はニューラルネットであり、学習方法は誤差関数を確率的勾配降下法で最小化することによって学習します。具体的には誤差関数を最小化することによって、重みとバイアスを決定します。

自己符号化器の目的はデータの次元を減らすことであり、それは主成分分析よりも優れていることが知られています。

数式ではあえて説明しませんので図を示しときます。
AutoencoderはHintonらが2006年に発表しました。
「Reducing the Dimensionality of Data with Neural Networks」
https://www.cs.toronto.edu/~hinton/science.pdf

画像における自己符号化器の仕組みを次に示します。(上の論文から。一部和訳)
ニューラルネットの形が対照的なので、砂時計型ニューラルネットとも呼ばれます。

実際の自己符号化器についてはこちらを参考にすると良いでしょう。
「Auto Encoders」
https://reyhaneaskari.github.io/AE.htm


さて、AIQでは、私達と東京か札幌で一緒に働ける仲間を募集しています。
詳しくはこちら

私達と一緒にを様々な業界の未来を変えていきませんか?