白色化
ICA(独立成分分析)を行うための前処理として、行います。データの共分散行列が単位行列になるように行列X(大きさn×p)を変形します。初投稿のため, ベクトルやスカラーの表記がごっちゃになってるのでまた直します。
$$X=(x_{ij})=[x_1,x_2,...x_j,...,x_p]$$
- データの中心化
$$ x_j=x_j-\sum_{i=1}^nx_{ij}$$ - 固有値分解
共分散行列 $$V=\frac{1}{n}X^TX$$ として
$$V=K\Lambda K^T$$
と固有値分解できる。ここで$K$は
$$K^TK=I$$
を満たす。つまり直行行列であり,$K^T=K^{-1}$も満たす。 - 変形
$$Z=XK\Lambda^{-\frac{1}{2}}\
$$
と取ると
\begin{align}
\frac{1}{n}Z^TZ &=\frac{1}{n}\Lambda^{-\frac{1}{2}}K^{T}X^{T}XK\Lambda^{-\frac{1}{2}} \\
&= \Lambda^{-\frac{1}{2}}K^{T}VK\Lambda^{-\frac{1}{2}} \\
&= \Lambda^{-\frac{1}{2}}K^{T}K\Lambda K^T K\Lambda^{-\frac{1}{2}} \\
&= \Lambda^{-\frac{1}{2}}\Lambda\Lambda^{-\frac{1}{2}} \\
&= I
\end{align}
となる。pythonのコードです。
def white(X,epsilon=1e-5):
n,p=X.shape
u,v = np.linalg.eig(np.dot(X.T,X)/n) #u固有値 vベクトル
Z=np.dot(X,np.dot(v,np.diag(1/(np.sqrt(u)+epsilon))))
return (Z)