半円則

Johnson-Lindenstrauss Lemmaというのを知る。
見た資料はこれ。
http://www-personal.umich.edu/~romanv/slides/2011-Edmonton/2011-Edmonton.pdf

Octaveで適当にSemiCircular Law, Circular Lawを確認する為のコードを書いた。多分matlabでも使えると思う。

実行するとこんな感じ。

f:id:jam_system:20130417053841p:plain

これは要素数が1000の場合。この要素数でも綺麗に形が現れているのが分かる。下の方に要素数が2000,3000の時も載せておく。尚、スケーリングとかそこら辺は適当なので詳細は論文等を読んで下さい。

 

 

面白いのは行列に手を加えた時。以下のコードのように、対角要素に値を加えた時

matrix_size=4000,divide_size=3

f:id:jam_system:20130417061736p:plain
matrix_size=4000,divide_size=4

f:id:jam_system:20130417061739p:plain

個人的にはこういう操作が可視化できて面白い気がする

 

後は、例えばA(i,i) += 100*j;の部分を
・A(i,i) += 1000*j  or  A(i,i) += 10*j
・A(i,i) += 100*randn();

 にするとどうなるか、とか遊んでみるのも楽しいかもです

 

要素数=2000
f:id:jam_system:20130417053846p:plain

要素数=3000
f:id:jam_system:20130417053849p:plain