1. 程式人生 > >Matlab從多維正態分佈中隨機抽取樣本:mvnrnd

Matlab從多維正態分佈中隨機抽取樣本:mvnrnd

原帖地址:http://blog.sina.com.cn/s/blog_955cedd8010130m8.html

R = mvnrnd(MU,SIGMA)——從均值為MU,協方差為SIGMA的正態分佈中抽取n*d的矩陣R(n代表抽取的個數,d代表分佈的維數)。


MU為n*d的矩陣,R中的每一行為以MU中對應的行為均值的正態分佈中抽取的一個樣本。

SIGMA為d*d的對稱半正定矩陣,或者為d*d*n的array。若SIGMA為array,R中的每一行對應的分佈的協方差矩陣為該array對應的一個page。也就是說:R(i,:)由MU(i,:)和SIGMA(:,:,i)產生。
如果協方差矩陣為對角陣,sigma也可用1*d向量或1*d*n的array表示,如果MU是一個1*d的向量,則SIGMA中的n個協方差矩陣共用這個MU。R的行數n由MU的行數n或者SIGMA的page數n決定。

r = mvnrnd(MU,SIGMA,cases)——從均值為MU(1*d),協方差矩陣為SIGMA(d*d)的正態分佈中隨機抽取cases個樣本,返回cases*d的矩陣r。

不使用現成的函式,可以通過一個線性變換來實現:

我們知道,matlab產生的n維正態樣本中的每個分量都是相互獨立的,或者說,它的協方差矩陣是一個數量矩陣mI,如:X = randn(10000,4);產生10000個4維分佈的正態分佈樣本,協方差矩陣就是單位矩陣I

定理 n維隨機變數X服從正態分佈N(u,B),若m維隨機變數YX的線性變換,即Y=XC,其中C是n×m階矩陣,則Y服從m維正態分佈N(uC,C'BC)。

根據這條定理,我們可以通過一個線性變換C

把協方差矩陣為I的n維正態樣本變為協方差矩陣為C'C的n維正態樣本。如果我們要產生協方差矩陣為R的n維正態樣本,由於R為對稱正定矩陣,所以有Cholesky分解: R=C'C

附:matlab程式

function Y = multivrandn(u,R,M)
% this function draws M samples from N(u,R)
% where u is the mean vector(row) and R is the covariance matrix which must be positive definite

n = length(u);              % get the dimension
C = chol(R);                % perform cholesky decomp R = C'C
X = randn(M,n);             % draw M samples from N(0,I)

Y = X*C + ones(M,1)*u;