【问题标题】:Fitting a 2D Gaussian to 2D Data Matlab将二维高斯拟合到二维数据 Matlab
【发布时间】:2015-04-05 06:06:33
【问题描述】:

我有一个由两个独立的未知高斯分布绘制的 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]);

【问题讨论】:

    标签: matlab function gaussian data-fitting


    【解决方案1】:

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

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

    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 中运行代码。为了清楚起见,我编写了这样的代码,从编程的角度来看,它可以更高效地编写。

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 2019-02-08
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多