randomgen.generator.ExtendedGenerator.multivariate_complex_normal

ExtendedGenerator.multivariate_complex_normal(loc, gamma=None, relation=None, size=None, *, check_valid='warn', tol=1e-8, method='svd')

Draw random samples from a multivariate complex normal (Gaussian) distribution.

Parameters:
locarray_like of complex

Mean of the distribution. Must have shape (m1, m2, …, mk, N) where (m1, m2, …, mk) would broadcast with (g1, g2, …, gj) and (r1, r2, …, rq).

gammaarray_like of float or complex, optional

Covariance of the real component of the distribution. Must have shape (g1, g2, …, gj, N, N) where (g1, g2, …, gj) would broadcast with (m1, m2, …, mk) and (r1, r2, …, rq). If not provided, an identity matrix is used which produces the circularly-symmetric complex normal when relation is an array of 0.

relationarray_like of float or complex, optional

Relation between the two component normals. (r1, r2, …, rq, N, N) where (r1, r2, …, rq, N, N) would broadcast with (m1, m2, …, mk) and (g1, g2, …, gj). If not provided, set to zero which produces the circularly-symmetric complex normal when gamma is an identify matrix.

sizeint or tuple of ints, optional

Given a shape of, for example, (m,n,k), m*n*k samples are generated, and packed in an m-by-n-by-k arrangement. Because each sample is N-dimensional, the output shape is (m,n,k,N). If no shape is specified, a single (N-D) sample is returned.

check_valid{‘warn’, ‘raise’, ‘ignore’ }, optional

Behavior when the covariance matrix implied by gamma and relation is not positive semidefinite.

tolfloat, optional

Tolerance when checking the singular values in the covariance matrix implied by gamma and relation.

method{‘svd’, ‘eigh’, ‘cholesky’}, optional

The cov input is used to compute a factor matrix A such that A @ A.T = cov. This argument is used to select the method used to compute the factor matrix A for the covariance implied by gamma and relation. The default method ‘svd’ is the slowest, while ‘cholesky’ is the fastest but less robust than the slowest method. The method eigh uses eigen decomposition to compute A and is faster than svd but slower than cholesky.

Returns:
outndarray

Drawn samples from the parameterized complex normal distributions.

See also

numpy.random.Generator.normal

random values from a real-valued normal distribution

randomgen.generator.ExtendedGenerator.complex_normal

random values from a scalar complex-valued normal distribution

randomgen.generator.ExtendedGenerator.multivariate_normal

random values from a scalar complex-valued normal distribution

Notes

Complex normals are generated from a multivariate normal where the covariance matrix of the real and imaginary components is

\[\begin{split}\begin{array}{c} X\\ Y \end{array}\sim N\left(\left[\begin{array}{c} \mathrm{Re\left[\mu\right]}\\ \mathrm{Im\left[\mu\right]} \end{array}\right],\frac{1}{2}\left[\begin{array}{cc} \mathrm{Re}\left[\Gamma+C\right] & \mathrm{Im}\left[C-\Gamma\right]\\ \mathrm{Im}\left[\Gamma+C\right] & \mathrm{Re}\left[\Gamma-C\right] \end{array}\right]\right)\end{split}\]

The complex normals are then

\[Z = X + iY\]

If the implied covariance matrix is not positive semi-definite a warning or exception may be raised depending on the value check_valid.

References

[1]

Wikipedia, “Complex normal distribution”, https://en.wikipedia.org/wiki/Complex_normal_distribution

[2]

Leigh J. Halliwell, “Complex Random Variables” in “Casualty Actuarial Society E-Forum”, Fall 2015.

Examples

Draw samples from the standard multivariate complex normal

>>> from randomgen import ExtendedGenerator
>>> eg = ExtendedGenerator()
>>> loc = np.zeros(3)
>>> eg.multivariate_complex_normal(loc, size=2)
array([[ 0.42551611+0.44163456j,
        -0.18366146+0.88380663j,
        -0.3035725 -1.19754723j],
       [-0.86649667-0.88447445j,
        -0.04913229-0.04674949j,
        -0.28145563+1.04682163j]])

Draw samples a trivariate centered circularly symmetric complex normal

>>> rho = 0.7
>>> gamma = rho * np.eye(3) + (1-rho) * np.diag(np.ones(3))
>>> eg.multivariate_complex_normal(loc, gamma, size=3)
array([[ 0.32699266-0.57787275j,  0.46716898-0.06687298j,
        -0.31483301+0.17233599j],
       [ 0.28036548-0.56994348j,  0.18011468-0.50539209j,
         0.35185607-0.15184288j],
       [-0.1866397 +1.2701576j , -0.18419364-0.06912343j,
        -0.66462037+0.73939778j]])

Draw samples from a bivariate distribution with correlation between the real and imaginary components

>>> loc = np.array([3-7j, 2+4j])
>>> gamma = np.array([[2, 0 + 1.0j], [-0 - 1.0j, 2]])
>>> rel = np.array([[-1.8, 0 + 0.1j], [0 + 0.1j, -1.8]])
>>> eg.multivariate_complex_normal(loc, gamma, size=3)
array([[2.97279918-5.64185732j, 2.32361134+3.23587346j],
       [1.91476019-7.91802901j, 1.76788821+3.84832672j],
       [4.44740101-7.93782402j, 1.59809459+1.35360097j]])