我有一个x
和y
坐标的向量,它来自两个独立的未知高斯分布。我想把这些点拟合成三维高斯函数,并在任何x
和y
上评估这个函数。
到目前为止,我发现的唯一方法是使用最大分量为1的高斯混合模型(见下面的代码),并进入ezcontour
的句柄,取出X、Y和Z数据。
这种方法的问题首先是它是一种非常丑陋的迂回方式,其次ezcontour命令只给我一个60x60的网格,但我需要更高的分辨率。
有人知道一种更优雅、更有用的方法吗?它可以让我找到潜在的高斯函数,并提取它在任何x
和y
上的值?
代码:
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中运行代码。为了清晰起见,我写了这样的代码,从编程的角度来看,它可以写得更高效。