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

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

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

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とはイコールになりません。*1

さて、平均二乗誤差は以下のように書けます。*2


\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 E(\mathbf A)=  \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次元に削減する射影の方向を求めてみました。

ちょっとわかりづらいですが、KL展開 分散最大基準で求めた射影の方向と少しずれています。これは、データの重心ではなく、原点を中心として計算するために生じるズレとのことです。ただ、分類手法に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()

*1:この次元削減した後のデータを、再び元の次元に戻すという処理がイメージ湧きづらかったので実験してみました。:射影後のデータを元の次元で見る

*2:参考:線形回帰の最小二乗法の解の導出の式(5)あたり