2016-08-02 8 views
2

から条件付きシミュレーション私はxの5000の実現を持っていることを考えると、同じ分布からのyをシミュレートするにはどうすればよいのPython/numpyの:numpyのを使用してmultivatiate分布

mean = [0, 0] 
cov = [[1, 0], [0, 100]] # diagonal covariance 
x, y = np.random.multivariate_normal(mean, cov, 5000).T 

による多変量正規分布から無条件でシミュレートすることができます?私は任意の次元に拡大縮小できる一般化された解を探しています。

+1

これらは独立している(共分散が示唆しています)単変量正規分布(平均= 0、分散= 100)から生成できませんか? – ayhan

+0

確かに。これはあまり書かれていない例です - 完全ランクの共分散行列のケースを扱うことができるようにしたいです –

答えて

1

モート・L.(1983)、イートンを見る。多変量統計:ベクトル空間アプローチ、Iは2つの従属変数(第2)と2つの独立変数(最後の二つ)に許容近いある

import numpy as np 

mean = np.array([1, 2, 3, 4]) 
cov = np.array(
    [[ 1.0, 0.5, 0.3, -0.1], 
    [ 0.5, 1.0, 0.1, -0.2], 
    [ 0.3, 0.1, 1.0, -0.3], 
    [-0.1, -0.2, -0.3, 0.1]]) # diagonal covariance 

c11 = cov[0:2, 0:2] # Covariance matrix of the dependent variables 
c12 = cov[0:2, 2:4] # Custom array only containing covariances, not variances 
c21 = cov[2:4, 0:2] # Same as above 
c22 = cov[2:4, 2:4] # Covariance matrix of independent variables 

m1 = mean[0:2].T # Mu of dependent variables 
m2 = mean[2:4].T # Mu of independent variables 

conditional_data = np.random.multivariate_normal(m2, c22, 1000) 

conditional_mu = m2 + c12.dot(np.linalg.inv(c22)).dot((conditional_data - m2).T).T 
conditional_cov = np.linalg.inv(np.linalg.inv(cov)[0:2, 0:2]) 

dependent_data = np.array([np.random.multivariate_normal(c_mu, conditional_cov, 1)[0] for c_mu in conditional_mu]) 

print np.cov(dependent_data.T, conditional_data.T) 
>> [[ 1.0012233 0.49592165 0.28053086 -0.08822537] 
    [ 0.49592165 0.98853341 0.11168755 -0.22584691] 
    [ 0.28053086 0.11168755 0.91688239 -0.27867207] 
    [-0.08822537 -0.22584691 -0.27867207 0.94908911]] 

と、4 vaiableシステムのための次のサンプル溶液を集め予め定義された共分散行列。 解決策は簡単に説明しますWikipedia

+0

小文字: 'solve'はほとんど常に' inv'に優先されます。 –

+0

本当ですか?ありがとう!非論理的だと思われる –

+0

肩をすくめます。キーワードは安定性です。 –

関連する問題