랜덤 행렬의 디스크에 분포하는 고유치

7783 단어 하스켈
어떤 랜덤 행렬의 고유치는 원판 형상으로 분포하는 것 같다. 정확히 이렇게

원칙
n × n 실제 정방 행렬 (또는 복소 정방 행렬)에서 각 행렬 요소를 독립적으로 동일 분포로 평균 0 $ E (X_j, k) = 0 $, 분산 $ E (| X_ {j, k} | ^ {2} )=1/n$ 와 같이 규격화하면 행렬의 크기를 매우 크게 해 나가는(n → ∞)에 따라 고유치는 복소 평면상의 단위 원반 상에서 균일하게 분포하게 된다는 것.
인용 소스 : 랜덤 행렬 # 원칙

조속히 실장해 실험 보았다.
사용 언어는 하스켈, 선형 대수 라이브러리는 hmatrix, 시각화 라이브러리에는 Chart을 사용했다.
import Graphics.Rendering.Chart.Easy
import Graphics.Rendering.Chart.Backend.Diagrams
import Numeric.LinearAlgebra

-- | 複素数x+iyを(x, y)型のタプルに変換
toPoint :: Complex a -> (a, a)
toPoint c = (realPart c, imagPart c)

main = do
    let n = 1000 -- 正方行列のサイズ
    m <- (sqrt (1 / fromIntegral n) *) <$> randn n n -- 行列要素が平均値0分散1/nの正規分布に従う行列をサンプリング
    let es = map toPoint . toList . fst $ eig m -- 行列の固有値を求めて[(Double, Double)]型に変換
    toFile (def {_fo_size = (600, 600)}) "output.svg" $ -- プロットしてファイルに書き出す
        plot $ points "Eigenvalues" es

실험에 사용하는 함수는 이상.
hmatrix에서 랜덤 행렬을 계산하는 방법을 설명하면 먼저
randomVector :: Seed          -- シード値
             -> RandDist      -- 値が従う分布
             -> Int           -- 生成するベクトルの長さ
             -> Vector Double

라는 무작위 벡터를 계산하는 함수가 가장 기본적인 함수가 된다.
type Seed = Int

data RandDist = Uniform
              | Gaussian
randomVector는 값이 균일 분포 또는 정규 분포를 따르는 무작위 벡터를 생성 할 수 있음을 보여줍니다.

랜덤 행렬을 생성하는 경우는 randomVector 를 이용한 간편한 함수가 준비되어 있다.
-- | 行列要素が[0,1]区間の一様分布に従うようなランダム行列を生成する
rand :: Int -> Int -> IO (Matrix Double)

-- | 行列要素が標準正規分布に従うようなランダム行列を生成する
randn :: Int -> Int -> IO (Matrix Double)

또한 이러한 행렬을 변형하여보다 일반적인 행렬을 얻을 수있는 함수도 있습니다.
uniformSample :: Seed               -- シード値
              -> Int                -- 行数
              -> [(Double, Double)] -- 各列が従う一様分布の区間
              -> Matrix Double

gaussianSample :: Seed          -- シード値
               -> Int           -- 行数
               -> Vector Double -- 平均値ベクトル
               -> Herm Double   -- 分散共分散行列
               -> Matrix Double
uniformSample 는 [0,1] 구간에 한정되지 않는 균일 분포에 따른 행렬 요소를 가지는 랜덤 행렬, gaussianSample 행렬을 계산한다.

실험



행렬의 크기를 늘리면서 고유치의 동작을 관찰한다.

n=10





n = 100





n = 500





n = 1000





고유치가 깨끗하게 원판 형상으로 분포해 가는 모습을 볼 수 있다. 대단해. 이번에는 실수를 행렬 요소에 가지는 정방 행렬로 실험했으므로, 잘 보면 고유치의 분포가 x축에 대해 선대칭으로 되어 있는 것을 알 수 있다. 원칙의 증명은 Terence Tao, Van Vu "Random Matrices: The circular Law" 에 실려 있는 것 같다.

좋은 웹페이지 즐겨찾기