将2D高斯拟合到2D数据Matlab

时间:2015-02-05 11:43:43

标签: matlab function gaussian data-fitting

我有两个独立的未知高斯分布绘制的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 个答案:

答案 0 :(得分:1)

一般形式的高斯分布是这样的:

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

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

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

这是一个例子。在这个例子中,一个guassian被拟合成两个随机生成样本的向量,这些样本来自正态分布,参数为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中运行代码。为了清楚起见,我编写了这样的代码,从编程的角度来看,它可以更有效地编写。