多维高斯随机变量
问题
在进行科学研究的时候,可能会涉及到如何采样多维高斯随机变量的问题,即给定随机变量 ξ ∼ N ( 0 , K ) , ξ ∈ R n \xi\sim\mathcal N(\mathbf 0,\mathbf K), \xi\in\mathbb R^n ξ∼N(0,K),ξ∈Rn,得到样本数据 x i , i = 1 , 2 , . . . Q \mathbf x_i, i=1,2,...Q xi,i=1,2,...Q。这里假设高斯随机变量的均值为零,对于非零的均值,只需通过对样本数据添加一个常量即可。多维高斯随机变量的概率密度函数由均值和协方差矩阵唯一确定。
解决思路
- 先采样n维标准正态分布得到数据样本 y i \mathbf y_i yi,这可以通过以下方式实现:采样一维标准正态分布,再将每n个一维样本级联成一个n维样本。
- 对 K \mathbf K K进行cholesky分解,即 K = A A T \mathbf K=\mathbf A\mathbf A^T K=AAT。
- 获得最终的样本 x i = A y i \mathbf x_i=\mathbf A\mathbf y_i xi=Ayi。
Matlab代码实现
function [ X ] = joint_gaussian( K , num)
% sampling the multi-dimensional Gaussian random variablbe
% K is the covariance matrix
% num is the number of the samples
if K'~=K
error('Kz must be symmetry');
end
N=size(K,1);
L=chol(K,'lower');
z=randn(N,num);
X=L*z;
end
扩展
循环对称多维复高斯随机变量
在通信仿真中,常常涉及到循环对称多维复高斯随机变量的采样,这里先解释一下什么是循环对称多维复高斯随机变量?它是多维复高斯随机变量的特例。和多维高斯随机变量不同,多维复随机高斯变量的概率密度函数仅由协方差矩阵
K
z
=
E
[
ξ
ξ
H
]
\mathbf K_z=E[\xi\xi^H]
Kz=E[ξξH]不能完全确定,还需要伪协方差矩阵
M
z
=
E
[
ξ
ξ
T
]
\mathbf M_z=E[\xi\xi^T]
Mz=E[ξξT]共同确定。但如果是循环对称多维复高斯,则其概率密度函数由协方差矩阵完全确定[1]。因为循环对称多维复高斯的伪协方差矩阵为零矩阵。
采样的方法如下所示:
- 将n维的复随机变量 ξ \xi ξ转化为2n维的实随机变量 η = [ R e a l ( ξ ) , I m a g ( ξ ) ] \eta=[Real(\xi),Imag(\xi)] η=[Real(ξ),Imag(ξ)]。
- 计算 η \eta η的协方差矩阵 K η = [ 0.5 R e a l ( K z ) − 0.5 I m a g ( K z ) 0.5 I m a g ( K z ) 0.5 R e a l ( K z ) ] \mathbf K_{\eta}=\left[ \begin{array}{cc} 0.5Real(\mathbf K_z) & -0.5Imag(\mathbf K_z) \\ 0.5Imag(\mathbf K_z) & 0.5Real(\mathbf K_z)\end{array} \right] Kη=[0.5Real(Kz)0.5Imag(Kz)−0.5Imag(Kz)0.5Real(Kz)]
- 使用上一节的采样方法进行采样,再将其组合成复随机变量。
Matlab代码实现
function [ X ] = joint_complex_gaussian( Kz, num )
% sampling the circulary-symmetric Gaussian random vector
% Kz is the covariance matrix
% num is the number of the samples
if Kz'~=Kz
error('Kz must be hermitian');
end
Kv=[0.5*real(Kz),-0.5*imag(Kz);0.5*imag(Kz),0.5*real(Kz)];
N=size(Kv,1);
L=chol(Kv,'lower');
z=randn(N,num);
X=L*z;
X=X(1:N/2,:)+1i*X(N/2+1:end,:);
end
代码测试
对采样到的样本数据计算协方差矩阵,再与理论值进行比较,使用相对误差衡量效果,在样本数据为10万时,相对误差在0.5%左右。
clear all;
n = 6;
num = 100000;
% joint gaussian
K = randn(n,n);
K = K*K';
x = joint_gaussian(K,num);
% validate the covariance matrix by relative error
norm(K-x*x'/num)/norm(K)
% joint complex gaussian
Kz = randn(n,n)+1i*randn(n,n);
Kz = Kz*Kz';
x_complex = joint_complex_gaussian(Kz,num);
% validate the covariance matrix by relative error
norm(Kz-x_complex*x_complex'/num)/norm(Kz)
本文使用的符号
A T \mathbf A^T AT | 矩阵转置 |
A H \mathbf A^H AH | 矩阵共轭转置 |
E [ ] E[] E[] | 数学期望 |
R e a l ( ) Real() Real() | 取复数的实部 |
I m a g ( ) Imag() Imag() | 取复数的虚部 |
参考文献
[1] Gallager R G. Circularly-Symmetric Gaussian random vectors[J]. preprint, 2008:1-9.