機械学習に詳しくなりたいブログ

機械学習や数学について勉強した内容を中心に書きます。100%趣味です。記事は数学的に厳密でなかったり誤りを含んでいるかもしれません。ご指摘頂ければ幸いです。

KL展開 平均二乗誤差最小基準

これまでに分散最大基準のKL展開を見てきました。今回は平均二乗誤差最小基準のKL展開を確認していきます。

次元削減後のデータと元のデータの誤差が小さくなるように射影すれば、元の情報を多く保っていることが期待できそうです。この誤差を最小になるような変換\mathbf Aを求めることが目的です。変数の文字の設定はKL展開 分散最大基準 解の導出と同様とし、D次元からD^{\prime}次元へKL展開することを考えます。変換行列を\mathbf A、元のデータを\mathbf x、変換後のデータを\mathbf yとすれば、


\mathbf y = \mathbf A^{T} \mathbf x \tag{1}

です。ここで\mathbf yは次元削減後のベクトルですから、このままでは\mathbf xとの誤差が計算できません。よって\mathbf yを元の次元のベクトルで表すことが必要で、それは\mathbf A \mathbf A^{T} \mathbf xと書けます。これと\mathbf xとの誤差を計算していきます。(参考:射影後のデータを元の次元で見る) なお\mathbf A \mathbf A^{T} \mathbf xは、次元を削減したものを元の次元で表現していますから、\mathbf xとはイコールになりません。

さて、平均二乗誤差は以下のように書けます。(参考:線形回帰の最小二乗法の解の導出


\displaystyle E(\mathbf A) = \frac{1}{n} \sum \| \mathbf A \mathbf A^{T} \mathbf x - \mathbf x \|^{2} \tag{2}

これを転置行列の定理を使いながら計算していきます。


\begin{eqnarray*}
\displaystyle  &=& \frac{1}{n} \sum ( \mathbf A \mathbf A^{T} \mathbf x - \mathbf x)^{T} (\mathbf A \mathbf A^{T} \mathbf x - \mathbf x) \tag{3} \\
\displaystyle  &=& \frac{1}{n} \sum ( \mathbf x^{T} \mathbf A \mathbf A^{T}  - \mathbf x^{T}) (\mathbf A \mathbf A^{T} \mathbf x - \mathbf x) \tag{4} \\
\displaystyle  &=& \frac{1}{n} \sum ( \mathbf x^{T} \mathbf x - \mathbf x^{T} \mathbf A \mathbf A^{T} \mathbf x ) \tag{5} \\
\displaystyle  &=& \frac{1}{n} \sum \left\{ \mathbf x^{T} \mathbf x - (\mathbf A^{T} \mathbf x)^{T} \mathbf x^{T} \mathbf A \right\} \tag{6} \\
\displaystyle  &=& \frac{1}{n} \sum (\mathrm{Tr}( \mathbf x \mathbf x^{T})  - \mathrm{Tr}(\mathbf A^{T} \mathbf x \mathbf x^{T} \mathbf A )) \tag{7} \\
\end{eqnarray*}

式(6)から式(7)への変換は、行列の内積とトレースの式(11)を使っています。また、KL展開 分散最大基準 解の導出と同様の前提ですから、\mathbf A^{T} \mathbf A = \mathbf Iの関係も使っています。

ここで、


\displaystyle \mathbf R = \frac{1}{n} \sum \mathbf x \mathbf x^{T} \tag{8}

と定義する\mathbf Rを導入します。これを自己相関行列と呼びます。これを用いると式(7)は、


\displaystyle =  \mathrm{Tr} \mathbf R  - \mathrm{Tr}(\mathbf A^{T} \mathbf R \mathbf A )\tag{9}

と書けます。さて、今回はこれを最小にする\mathbf Aを求めることが目的でした。\mathbf R\mathbf Aに依存しませんから、式(9)を最小にすることは、\mathrm{Tr}(\mathbf A^{T} \mathbf R \mathbf A )を最大にすることと等しくなります。すると、KL展開 分散最大基準 解の導出と同じ計算により、\mathbf Rの固有値の大きいものからD^{\prime}個採用し、それに対応する固有ベクトルを並べたものが求める\mathbf Aです。

KL展開 分散最大基準と同じデータを使って、2次元データを1次元に削減する射影の方向を求めてみました。 f:id:opabinia2:20180624234545p:plain

ちょっとわかりづらいですが、KL展開 分散最大基準で求めた射影の方向と少しずれています。これは、データの重心ではなく、原点を中心として計算するために生じるズレとのことです。まあなんか直感的にもそんな感じはしますよね。2次元データを考えると、射影後の部分空間は原点を通る直線になりますから、データの分布が原点から離れたところにあれば、部分空間に射影したデータとの誤差は期待したものとは違っていそうです。ただ、分類手法にKL展開を用いる場合は、平均二乗誤差最小基準を使うようです。(参考:MNISTをCLAFIC法で識別する)また、データの平均ベクトルが0ベクトルになるように前処理をして計算をすれば、分散最大基準で求められる射影と等しくなるそうです。

今回のコードです。

# 平均二乗誤差最小基準のKL展開
import matplotlib.pyplot as plt
import numpy as np

# データ数
N = 300

# 入力次元数
D = 2

# 削減後の次元数
D2 = 1

# ランダムシードを固定
np.random.seed(0)

# データを作成
mean = np.array([1, 0.5])
cov = [[1.0, 0.5], [0.5, 1.0]]
x = np.random.multivariate_normal(mean, cov, N)

# 自己相関行列
R = np.dot(x.T, x)/N

# 固有値と固有ベクトルを求める
lam, v = np.linalg.eig(R)

# 最大固有に対応する固有ベクトルが求めるw
v = v[:, np.argsort(lam)[::-1]]
w = v[:, 0:D2]

plt.xlim(-5, 5)
plt.ylim(-5, 5)
plt.axes().set_aspect('equal')
plt.scatter(x[:, 0], x[:, 1], color="blue", alpha=0.5)
plt.quiver(0, 0, -w[1], w[0], angles="xy", units="xy", color="black", scale=0.5)
plt.show()