random projection
入力をu∈Rdとする.dk個のi.i.d.な確率変数{Ri,j}i=1,j=1d,k∼i.i.dN(0,1)を用意する.そして,これらを成分に持つ行列R∈Rd×kを 作る.Rを用いて,入力uをk次元空間にv=k1RTuと射影する.この時,E[∥v∥2]=∥u∥2が成り立つ.これを示す.
E[vj2]=E⎣⎡(k1j=1∑dRj,iuj)2⎦⎤=k1E⎣⎡(j=1∑dRj,iuj)2⎦⎤=k1E[j=1∑dk=1∑dRj,iRk,iujuk]=k1j=1∑dk=1∑dE[Rj,iRk,i]ujuk=k1j=1∑d⎝⎛E[Rj,i2]uj2+k̸=j∑dE[Rj,iRk,i]ujuk⎠⎞=k1j=1∑d⎝⎛E[Rj,i2]uj2+k̸=j∑dE[Rj,i]E[Rk,i]ujuk⎠⎞=k1j=1∑dE[Rj,i2]uj2=k1j=1∑duj2=k1∥u∥2
よって,E[∥v∥2]=∥u∥2.
大数の法則を考えると,kを増やせば(dは増やせない),∥v∥2は∥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')
結果は以下のようになった.予想通り,kを増やすと∥u∥2に近づいている.これでkを増やせばノルムを近似できるだろう.現実的にはkはdよりもずっと小さな値にしなければならない.続きは次回.

参考:
Written with StackEdit.