簡體   English   中英

將2D高斯擬合到2D Data Matlab

[英]Fitting a 2D Gaussian to 2D Data 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中運行代碼。 為了清楚起見,我這樣編寫代碼,從編程角度來看,它可以更高效地編寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM