如何在 MATLAB 中绘制显示二维高斯函数总和的图像?
Posted
技术标签:
【中文标题】如何在 MATLAB 中绘制显示二维高斯函数总和的图像?【英文标题】:How do I plot an image showing a summation of 2D Gaussian functions in MATLAB? 【发布时间】:2014-12-17 04:30:21 【问题描述】:我需要在同一个 2D 域中生成两个高斯函数,然后将这两个函数在两个域上的值相加以生成高斯混合。在图像中的所有像素位置,我们需要两个高斯函数的总和,这可以很好地近似全局分布。
我怎样才能在 MATLAB 中做到这一点?
【问题讨论】:
您可以使用imshow
进行可视化,也可以使用mesh
。
相关:***.com/a/18945262/97160
【参考方案1】:
使用meshgrid
很容易实现这一点。您需要生成一组X
和Y
点,然后将它们用作具有已知均值和标准偏差的两个高斯函数的输入。完成此操作后,您只需将它们加在一起,然后您可以使用 mesh
将其可视化。回忆一下二维高斯的定义:
来源:Wikipedia
小提示:参考这篇文章的 cmets,Amro 做了一个很好的观察,我们假设给定分布的协方差矩阵是对角的。这意味着您的数据的每个维度不会相互共同变化并且是独立的。如果不是这种情况,那么这将需要更复杂的计算,但可以使用矩阵运算轻松实现:https://en.wikipedia.org/wiki/Multivariate_normal_distribution#Density_function。由于您没有真正向我提供有关数据分布的任何信息,因此我将假设每个维度都不会共同变化,并且您有一个对角协方差矩阵。如果您想了解有关如何绘制 2D 高斯混合图的更详细和更一般的案例,也可以在此处查看他的帖子:https://***.com/a/26070081/97160
x_0
和y_0
是x
和y
方向的平均值,而o_x
和o_y
表示x
和y
方向的标准差。 A
是一个归一化常数,为简单起见,通常为 1。您只需要生成一个跨越一些已知维度的坐标网格,然后指定 2 对均值和标准差,对每个参数运行此表达式,然后在将两者相加后显示结果。假设网格跨越-10 <= (x,y) <= 10
。另外,假设我们的平均值和标准差在这个例子中如下:
x_1 = 2
x_2 = 2
y_1 = -1
y_2 = -1
o_x_1 = 1
o_y_1 = 2
o_x_2 = 2
o_y_2 = 1
因此,x_1, y_1
是第一个高斯的 x
和 y
方向的均值,x_2, y_2
是第二个高斯的均值,o_x_1, o_y_1
是第一个高斯的标准差x
和y
方向和o_x_2, o_y_2
是x
和y
方向上第二个高斯的标准差。因此,您的代码真的只需要这样做:
%// Define grid of points
[X,Y] = meshgrid(-10:0.01:10, -10:0.01:10);
%// Define parameters for each Gaussian
x_1 = 2;
y_1 = 2;
x_2 = -1;
y_2 = -1;
o_x_1 = 1;
o_y_1 = 2;
o_x_2 = 2;
o_y_2 = 1;
%// Define constant A... let's just assume 1 for both
A = 1;
%// Generate Gaussian values for both Gaussians
f1 = A*exp( -( ((X - x_1).^2 / (2*o_x_1^2)) + ((Y - y_1).^2 / (2*o_y_1^2)) ) );
f2 = A*exp( -( ((X - x_2).^2 / (2*o_x_2^2)) + ((Y - y_2).^2 / (2*o_y_2^2)) ) );
%// Add them up
f = f1 + f2;
%// Show the results
mesh(X, Y, f);
%// Label the axes
xlabel('x');
ylabel('y');
zlabel('z');
view(-130,50); %// For a better view
colorbar; %// Add a colour bar for good measure
这是我得到的图,一旦我调整了观察相机以获得更好的视角,并在图的右侧显示一个颜色条来说明图高度的可视化表示。
要了解这两者是如何混合的,让我们将相机直接指向上方。您可以通过以下方式调整视角以将相机直接移动到绘图上方:
view(0, 90);
这是我得到的:
有了上图,我们在做什么就更明显了。您可以看到高斯人的中心位置。具体来说,(x,y) = (2,2)
用于第一个高斯,(x,y) = (-1,-1)
用于第二个高斯。
您还可以看到它们合并,因为每个高斯上都有最终相互接触的尾巴,当您将它们相加时,您会看到这种合并效果。此外,高斯的一般形状是我们所期望的。对于以(x,y) = (2,2)
为中心的第一个,我将水平标准差设为 1 而垂直标准差设为 2,因此相对于y
方向它自然会更高。同样,对于以(x,y) = (-1,-1)
为中心的第二个,我翻转了标准差,因此我们希望它相对于x
方向更宽。
这是你可以开始的。我真的不知道你的最终应用程序是什么,但也许这段代码可以帮助你。鉴于您的问题描述,我已尽力而为。
玩得开心!
【讨论】:
您使用的2D gaussian 的定义是协方差矩阵是对角线的特殊情况。通用公式有一个额外的交互项x*y
来解释两个维度如何共同变化(这也可以在matrix notations 中很好地表达)。顺便说一句,如果 Statistics Toolbox 可用,可以使用 mvnpdf
和 ezsurf
等函数在几行代码中绘制 PDF:***.com/a/26070081/97160
@Amro - 你是对的。我应该更好地阅读那篇***的文章,但话又说回来,OP 并没有真正给我/我们太多的开始。也许他们可以以此为起点,如果不适合他们的目的,则进一步扩展到一般情况。感谢您的链接!
我同意,这个问题有点缺乏细节。 +1 来自我 :)
@Amro - 谢谢 :) 我还编辑了我的帖子以参考您在此处的观察,并将 OP 指向您链接的帖子以查看混合 2D 高斯函数的更一般概述在一起。
非常感谢。这是我需要的。以上是关于如何在 MATLAB 中绘制显示二维高斯函数总和的图像?的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB实现高斯混合分布的EM算法及二维时概率密度曲面置信椭圆绘制