将二维高斯拟合到二维数据Matlab中



我有一个xy坐标的向量,它来自两个独立的未知高斯分布。我想把这些点拟合成三维高斯函数,并在任何xy上评估这个函数。

到目前为止,我发现的唯一方法是使用最大分量为1的高斯混合模型(见下面的代码),并进入ezcontour的句柄,取出X、Y和Z数据。

这种方法的问题首先是它是一种非常丑陋的迂回方式,其次ezcontour命令只给我一个60x60的网格,但我需要更高的分辨率。

有人知道一种更优雅、更有用的方法吗?它可以让我找到潜在的高斯函数,并提取它在任何xy上的值?

代码:

GaussDistribution = fitgmdist([varX varY],1); %Not exactly the intention of fitgmdist, but it gets the job done.
h = ezcontour(@(x,y)pdf(GaussDistributions,[x y]),[-500 -400], [-40 40]);

一般形式的高斯分布如下:

我不允许上传图片,但高斯公式是:

1/((2*pi)^(D/2)*sqrt(det(Sigma)))*exp(-1/2*(x-Mu)*Sigma^-1*(x-Mu)');

其中D是数据维度(对于您来说是2);Sigma是协方差矩阵;Mu是每个数据向量的平均值。

这里有一个例子。在这个例子中,将高斯拟合到两个向量中,这两个向量是从具有参数N1(4,7)和N2(-2,4)的正态分布随机生成的样本:

Data = [random('norm',4,7,30,1),random('norm',-2,4,30,1)];
X = -25:.2:25;
Y = -25:.2:25;
D = length(Data(1,:));
Mu = mean(Data);
Sigma = cov(Data);
P_Gaussian = zeros(length(X),length(Y));
for i=1:length(X)
   for j=1:length(Y)
       x = [X(i),Y(j)];
       P_Gaussian(i,j) = 1/((2*pi)^(D/2)*sqrt(det(Sigma)))...
                    *exp(-1/2*(x-Mu)*Sigma^-1*(x-Mu)');
   end
end
mesh(P_Gaussian)

在matlab中运行代码。为了清晰起见,我写了这样的代码,从编程的角度来看,它可以写得更高效。

最新更新