The probability density function of the d-dimensional multivariate normal distribution is given by
where x and μ are 1-by-d vectors and Σ is a d-by-d symmetric positive definite matrix. While it is possible to define the multivariate normal for singular Σ, the density cannot be written as above. Only random vector generation is supported for the singular case. Note that while most textbooks define the multivariate normal with x and μ oriented as column vectors, for the purposes of data analysis software, it is more convenient to orient them as row vectors, and Statistics and Machine Learning Toolbox™ software uses that orientation.
The multivariate normal distribution is a generalization of the univariate normal to two or more variables. It is a distribution for random vectors of correlated variables, each element of which has a univariate normal distribution. In the simplest case, there is no correlation among variables, and elements of the vectors are independent univariate normal random variables.
The multivariate normal distribution is parameterized with a mean vector, μ, and a covariance matrix, Σ. These are analogous to the mean μ and variance σ2 parameters of a univariate normal distribution. The diagonal elements of Σ contain the variances for each variable, while the off-diagonal elements of Σ contain the covariances between variables.
The multivariate normal distribution is often used as a model for multivariate data, primarily because it is one of the few multivariate distributions that is tractable to work with.
Compute and plot the pdf of a multivariate normal distribution.
mu = [0 0]; Sigma = [.25 .3; .3 1]; x1 = -3:.2:3; x2 = -3:.2:3; [X1,X2] = meshgrid(x1,x2); F = mvnpdf([X1(:) X2(:)],mu,Sigma); F = reshape(F,length(x2),length(x1)); surf(x1,x2,F); caxis([min(F(:))-.5*range(F(:)),max(F(:))]); axis([-3 3 -3 3 0 .4]) xlabel('x1'); ylabel('x2'); zlabel('Probability Density');
Compute and plot the cdf of a multivariate normal distribution with parameters
mu = [1 -1] and
SIGMA = [.9 .4; .4 .3].
mu = [1 -1]; SIGMA = [.9 .4; .4 .3]; figure; [X1,X2] = meshgrid(linspace(-1,3,25)',linspace(-3,1,25)'); X = [X1(:) X2(:)]; p = mvncdf(X,mu,SIGMA); surf(X1,X2,reshape(p,25,25));
Since the bivariate normal distribution is defined on the plane, you can also compute cumulative probabilities over rectangular regions.
Compute the probability contained within the unit square, and create a contour plot of the results.
mu = [0 0]; Sigma = [.25 .3; .3 1]; x1 = -3:.2:3; x2 = -3:.2:3; [X1,X2] = meshgrid(x1,x2); F = mvnpdf([X1(:) X2(:)],mu,Sigma); F = reshape(F,length(x2),length(x1)); mvncdf([0 0],[1 1],mu,Sigma); contour(x1,x2,F,[.0001 .001 .01 .05:.1:.95 .99 .999 .9999]); xlabel('x'); ylabel('y'); line([0 0 1 1 0],[1 0 0 1 1],'linestyle','--','color','k');
Computing a multivariate cumulative probability requires significantly more work than computing a univariate probability. By default, the
mvncdf function computes values to less than full machine precision, and returns an estimate of the error as an optional second output.
[F,err] = mvncdf([0 0],[1 1],mu,Sigma)
F = 0.2097 err = 1.0000e-08