MATLAB: Multivariate Guassian Distribution

multivariate guassian distribution

Iam expecting this type of plot
Where I am doing mistake?
clear all
clc
% Taking two guassian random variables
x=randn(1000,1);
y=randn(1000,1);
X=[x y];
X=X';
d=size(X,1);
% find means of x,y
mx=mean(x);
my=mean(y);
mumat=[mx my]';
mumat=repmat(mumat,1,size(X,2));
Dif_mat=X-mumat;
% The above step (Dif_mat) is (X-mu) in the formula
cov_mat=cov(X'); % covariance matrix
det_cv=det(cov_mat); % det of cov matrix
inv_cov=inv(cov_mat); % inverse of cov matrix
% scale term before exp in forumala
scale=((2*pi)^(d/2))*sqrt((abs(det_cv)));
scale=inv(scale);
% Mahabolis distance in formula
MB=Dif_mat'*cov_mat*Dif_mat;
% find the final probability
p=scale*exp((-1/2)*MB);
surf(x,y,p)
Answer this question please!

Best Answer

You're really trying to do two things here. The first is, you have some random data and you want to fit it to a multivariate normal distribution. Your approach to this part works, although it can be streamlined:
n = 1000; d=2;
X = randn(n,2);
Get mean and covariance:
mumat=mean(X);
cov_mat=cov(X);
The second part is plotting the resulting distribution. Here you need a regular grid for your variables, not the random values you generated above:
x = -3:.2:3; y = -3:.2:3;
[X,Y] = meshgrid(x,y);
X = X-mumat(1); Y = Y-mumat(2);
Combine X and Y in a way that each row represents one 2D variable.
Z = [X(:) Y(:)];
Now calculate the probabilities.
scale=((2*pi)^(d/2))*sqrt(abs(det(cov_mat)));
p = zeros(length(Z),1);
for ii=1:length(Z)
p(ii) = exp(-Z(ii,:)/cov_mat*Z(ii,:)'/2)/scale;
end
Reshape and plot.
p = reshape(p,length(x),length(y));
surf(x,y,p)
xlabel('x'), ylabel('y')