Random Projection

random projection

入力をu∈Rd\bm{u} \in \mathbb{R}^dとする.dkdk個のi.i.d.な確率変数{Ri,j}i=1,j=1d,k∼i.i.dN(0,1)\{R_{i, j}\}_{i=1, j=1}^{d, k} \overset{i.i.d}{\sim} \mathcal{N}(0, 1)を用意する.そして,これらを成分に持つ行列R∈Rd×k\bm{R} \in \mathbb{R}^{d \times k}を 作る.R\bm{R}を用いて,入力u\bm{u}をkk次元空間にv=1kRTu\bm{v} = \frac{1}{\sqrt{k}} \bm{R}^T \bm{u}と射影する.この時,E[∥v∥2]=∥u∥2\mathbb{E}\left[\|\bm{v}\|^2\right] = \|\bm{u}\|^2が成り立つ.これを示す.

E[vj2]=E[(1k∑j=1dRj,iuj)2]=1kE[(∑j=1dRj,iuj)2]=1kE[∑j=1d∑k=1dRj,iRk,iujuk]=1k∑j=1d∑k=1dE[Rj,iRk,i]ujuk=1k∑j=1d(E[Rj,i2]uj2+∑k≠jdE[Rj,iRk,i]ujuk)=1k∑j=1d(E[Rj,i2]uj2+∑k≠jdE[Rj,i]E[Rk,i]ujuk)=1k∑j=1dE[Rj,i2]uj2=1k∑j=1duj2=1k∥u∥2 \begin{aligned} \mathbb{E}\left[v_j^2\right] &= \mathbb{E}\left[\left(\frac{1}{\sqrt{k}} \sum_{j=1}^d R_{j, i} u_j\right)^2\right] \\ &= \frac{1}{k} \mathbb{E}\left[\left(\sum_{j=1}^d R_{j, i} u_j\right)^2\right] \\ &= \frac{1}{k} \mathbb{E}\left[\sum_{j=1}^d \sum_{k=1}^d R_{j, i} R_{k, i} u_j u_k\right] \\ &= \frac{1}{k} \sum_{j=1}^d \sum_{k=1}^d \mathbb{E}\left[R_{j, i} R_{k, i}\right] u_j u_k \\ &= \frac{1}{k} \sum_{j=1}^d \left(\mathbb{E}\left[R_{j, i}^2\right] u_j^2 + \sum_{k \neq j}^d \mathbb{E}\left[R_{j, i} R_{k, i}\right] u_j u_k \right)\\ &= \frac{1}{k} \sum_{j=1}^d \left(\mathbb{E}\left[R_{j, i}^2\right] u_j^2 + \sum_{k \neq j}^d \mathbb{E}\left[R_{j, i}\right] \mathbb{E}\left[R_{k, i}\right] u_j u_k \right)\\ &= \frac{1}{k} \sum_{j=1}^d \mathbb{E}\left[R_{j, i}^2\right] u_j^2 \\ &= \frac{1}{k} \sum_{j=1}^d u_j^2 \\ &= \frac{1}{k} \|\bm{u}\|^2 \\ \end{aligned}

よって,E[∥v∥2]=∥u∥2\mathbb{E}\left[\|\bm{v}\|^2\right] = \|\bm{u}\|^2.
大数の法則を考えると,kkを増やせば(ddは増やせない),∥v∥2\|\bm{v}\|^2は∥u∥2\|\bm{u}\|^2に近づいていきそう.ちょっとやってみよう.以下のようなコードで実験してみた.

import numpy as np
import numpy.linalg as la
import matplotlib.pyplot as plt

random_state = 0
rnd = np.random.RandomState(random_state)

d = 8
u = rnd.multivariate_normal(np.zeros(d), np.identity(d))

ks = 2 ** np.arange(1, 10)
norms = np.zeros_like(ks)
for i, k in enumerate(ks):
    rnd = np.random.RandomState(random_state)
    R = rnd.normal(0, 1, size=(d, k))
    v = R.T.dot(u) / np.sqrt(k)
    norms[i] = la.norm(v) ** 2

plt.plot(ks, norms)
plt.plot(ks, np.repeat(la.norm(u) ** 2, len(ks)))
plt.xlabel('$k$')
plt.ylabel('norm')

結果は以下のようになった.予想通り,kkを増やすと∥u∥2\|\bm{u}\|^2に近づいている.これでkkを増やせばノルムを近似できるだろう.現実的にはkkはddよりもずっと小さな値にしなければならない.続きは次回.

参考:

Written with StackEdit.

0 件のコメント:

コメントを投稿

機械学習の問題設定

機械学習の問題設定 機械学習の問題設定を見直したのでメモ. ( Ω , F , P ) (\Omega, \mathcal{F}, P) ( Ω , F , P ) : ベースとなる確率空間 ( X , F X ) (\mathcal...