POETとは?
はじめに
POET(Principal Orthogonal complEment Thresholding)について解説します。POETは”詩人”ではないので注意です。笑
簡単に説明すると、高次元共分散行列の推定において疎な共分散行列分離させてその疎な共分散行列に対して閾値処理をすることで精度の高い推定をしています。
POET
共分散行列
まずデータ行列を
とかける。ここで
ここで
閾値処理はいくつもありますが、適応型閾値処理を考える。
ここで
Cが十分に大きいと対角化される。Cは多重交差検証で推定することもできる。
とした時、
ちなみに以前高次元主成分分析で解説したノイズ掃き出し法やクロスデータ行列法を用いればより精度の高い推定量が得られる。
Pythonコード
def th(M, t):
return np.multiply(M, (np.abs(M) >= t).astype(int))
def poet(X, m):
p, n = X.shape # X : p × n
C = 1 # この値は論文や状況に応じて調整すること
# BB^Tの推定
val, vec = np.linalg.eigh(np.cov(X))
index = np.argsort(val)[::-1][:m]
hat_lam = val[index]
hat_h = vec[:, index]
hat_BBT = hat_h @ np.diag(hat_lam) @ hat_h.T
# w_j の計算
hat_w = np.array([(np.eye(p) - hat_h @ hat_h.T) @ x_j for x_j in X.T]).T
# S_epsilon の推定
hat_S_eps = hat_w @ hat_w.T / (n-1)
# t_ij の計算
hat_theta = np.zeros((p, p)) # 初期化
sum = np.dot(hat_w, hat_w.T) / n # すべてのペアワイズの和を計算
squared_sum = np.outer(np.sum(hat_w, axis=1), np.sum(hat_w, axis=1)) / n**2 # 外積を利用して二乗和を計算
hat_theta = sum - squared_sum # 差を計算
np.fill_diagonal(hat_theta, 0) # 対角成分を0に設定
t_ij = C * np.sqrt(hat_theta) * (p**(-1/2) + np.sqrt(np.log(p)/n))
# Sigma の推定
hat_Sigma = hat_BBT + th(hat_S_eps, t_ij)
return hat_Sigma
まとめ
POETは疎な共分散行列を推定するのに適した推定法である。閾値処理で出てくるCの推定が厄介だと感じた。
参考文献
- Jianqing Fan, Yuan Liao and Martina Mincheva. (2013) Large Covariance Estimation by Thresholding Principal Orthogonal Complements. https://arxiv.org/pdf/1201.0175.pdf
Discussion