KL展開の概要については、KL展開 分散最大基準を参照ください。 こちらの記事では分散最大基準で解を求めましたが、今回は平均二乗誤差最小基準のKL展開を確認していきます。
解の導出
分散最大基準では、射影後のデータの分散を最大にする考えて射影方向を計算しました。分散が大きければ、次元圧縮後も元のデータの特徴がより保たれているはずということです。
今回求める平均二乗誤差最小基準では、次元削減後のデータと元のデータの誤差が小さくなるように射影すれば、元の情報を多く保っていることが期待できるはず、という考え方です。この誤差を最小になるような変換を求めることが目的です。変数の文字の設定はKL展開 分散最大基準 解の導出と同様とし、次元から次元へKL展開することを考えます。変換行列を、元のデータを、変換後のデータをとすれば、
です。ここでは次元削減後のベクトルですから、空間上の点と平面上の点の誤差は計算できないように、このままではとの誤差が計算できません。よってを元の次元のベクトルで表すことが必要で、それはと書けます。これととの誤差を計算していきます。なおは、次元を削減したものを元の次元で表現していますから、とはイコールになりません。*1
さて、平均二乗誤差は以下のように書けます。*2
これを転置行列の定理を使いながら計算していきます。
式(6)から式(7)への変換は、行列の内積とトレースの式(11)を使っています。また、KL展開 分散最大基準 解の導出と同様の前提ですから、の関係も使っています。
ここで、
と定義するを導入します。これを自己相関行列と呼びます。これを用いると式(7)は、
と書けます。さて、今回はこれを最小にするを求めることが目的でした。はに依存しませんから、式(9)を最小にすることは、を最大にすることと等しくなります。すると、KL展開 分散最大基準 解の導出と同じ計算により、の固有値の大きいものから個採用し、それに対応する固有ベクトルを並べたものが求めるです。
射影方向の実験
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)あたり