Random Projection

random projection

入力をuRd\bm{u} \in \mathbb{R}^dとする.dkdk個のi.i.d.な確率変数{Ri,j}i=1,j=1d,ki.i.dN(0,1)\{R_{i, j}\}_{i=1, j=1}^{d, k} \overset{i.i.d}{\sim} \mathcal{N}(0, 1)を用意する.そして,これらを成分に持つ行列RRd×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[v2]=u2\mathbb{E}\left[\|\bm{v}\|^2\right] = \|\bm{u}\|^2が成り立つ.これを示す.

E[vj2]=E[(1kj=1dRj,iuj)2]=1kE[(j=1dRj,iuj)2]=1kE[j=1dk=1dRj,iRk,iujuk]=1kj=1dk=1dE[Rj,iRk,i]ujuk=1kj=1d(E[Rj,i2]uj2+kjdE[Rj,iRk,i]ujuk)=1kj=1d(E[Rj,i2]uj2+kjdE[Rj,i]E[Rk,i]ujuk)=1kj=1dE[Rj,i2]uj2=1kj=1duj2=1ku2 \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[v2]=u2\mathbb{E}\left[\|\bm{v}\|^2\right] = \|\bm{u}\|^2
大数の法則を考えると,kkを増やせば(ddは増やせない),v2\|\bm{v}\|^2u2\|\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を増やすとu2\|\bm{u}\|^2に近づいている.これでkkを増やせばノルムを近似できるだろう.現実的にはkkddよりもずっと小さな値にしなければならない.続きは次回.

参考:

Written with StackEdit.

機械学習の問題設定

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