ノイズ掃き出し法 with Python
はじめに
今回は、高次元主成分分析(高次元PCA)の1つである、ノイズ掃き出し法(noise-reduction methodology)を紹介します。
高次元データにおいて従来の主成分分析には問題があることを説明しました。その問題を回避する一つの方法がノイズ掃き出し法です。名前の通り、ノイズの部分を推定して掃き出す方法となっています。
高次元データについて知りたい方はこちらをチェック
高次元データと主成分分析について知りたい方はこちらをチェック
設定
d>nの状況を考える。
平均
ここで、
標本共分散行列
双対標本共分散行列
一般的なPCAは標本共分散行列をもちいて
これより
ノイズ掃き出し法
ノイズ掃き出し法による固有値は
ノイズ掃き出し法による固有ベクトルは
ノイズ掃き出し法による主成分スコア
Pythonコード
import numpy as np
#noise reduction methodology
def NR(X):
d, n = X.shape
# 平均
one_n = np.ones((n, 1))
X_bar = X @ (one_n @ one_n.T) / n
# 標本共分散行列
S = (1/(n-1)) * (X - X_bar) @ (X - X_bar).T
# 双対標本共分散行列
S_D = (1/(n-1)) * (X - X_bar).T @ (X - X_bar)
# S_Dの固有値分解
val, vec = np.linalg.eigh(S_D)
index = np.argsort(val)[::-1]
lam_hat = val[index]
u_hat = vec[:, index]
# h_hatを求める
h_hat = [(X - X_bar) @ u_hat[:, i] / np.sqrt((n-1) * lam_hat[i]) for i in range(min(d,n-2))]
#S_Dのトレース
tr_S_D = np.trace(S_D)
# 固有値
lam_tilde = [lam_hat[i] - (tr_S_D - np.sum(lam_hat[:i+1])) / (n - 2 - i) for i in range(min(d,n-2))]
# 固有ベクトル
h_tilde = [np.sqrt(lam_hat[i] / lam_tilde[i]) * h_hat[i] for i in range(min(d,n-2))]
# 主成分スコア
s_tilde = [u_hat[:, i] * np.sqrt((n-1) * lam_tilde[i]) for i in range(min(d,n-2))]
return lam_tilde, h_tilde, s_tilde
まとめ
高次元データは扱うのが大変ですが、この方法によってかなり扱えるようになりました。
詳しく知りたい方は、参考文献にある高次元の統計学を見てみてください。
参考文献
- 青嶋誠、矢田和善 (2019)「高次元の統計学」
https://www.kyoritsu-pub.co.jp/book/b10003167.html
Discussion