[英]Fitting a 2D Gaussian to 2D Data Matlab
我有一個從兩個單獨的未知高斯分布中得出的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中運行代碼。 為了清楚起見,我這樣編寫代碼,從編程角度來看,它可以更高效地編寫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.