如何在 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 很容易实现这一点。您需要生成一组XY 点,然后将它们用作具有已知均值和标准偏差的两个高斯函数的输入。完成此操作后,您只需将它们加在一起,然后您可以使用 mesh 将其可视化。回忆一下二维高斯的定义:

来源:Wikipedia


小提示:参考这篇文章的 cmets,Amro 做了一个很好的观察,我们假设给定分布的协方差矩阵是对角的。这意味着您的数据的每个维度不会相互共同变化并且是独立的。如果不是这种情况,那么这将需要更复杂的计算,但可以使用矩阵运算轻松实现:https://en.wikipedia.org/wiki/Multivariate_normal_distribution#Density_function。由于您没有真正向我提供有关数据分布的任何信息,因此我将假设每个维度都不会共同变化,并且您有一个对角协方差矩阵。如果您想了解有关如何绘制 2D 高斯混合图的更详细和更一般的案例,也可以在此处查看他的帖子:https://***.com/a/26070081/97160


x_0y_0xy 方向的平均值,而o_xo_y 表示xy 方向的标准差。 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 是第一个高斯的 xy 方向的均值,x_2, y_2 是第二个高斯的均值,o_x_1, o_y_1 是第一个高斯的标准差xy方向和o_x_2, o_y_2xy方向上第二个高斯的标准差。因此,您的代码真的只需要这样做:

%// 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 可用,可以使用 mvnpdfezsurf 等函数在几行代码中绘制 PDF:***.com/a/26070081/97160 @Amro - 你是对的。我应该更好地阅读那篇***的文章,但话又说回来,OP 并没有真正给我/我们太多的开始。也许他们可以以此为起点,如果不适合他们的目的,则进一步扩展到一般情况。感谢您的链接! 我同意,这个问题有点缺乏细节。 +1 来自我 :) @Amro - 谢谢 :) 我还编辑了我的帖子以参考您在此处的观察,并将 OP 指向您链接的帖子以查看混合 2D 高斯函数的更一般概述在一起。 非常感谢。这是我需要的。

以上是关于如何在 MATLAB 中绘制显示二维高斯函数总和的图像?的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB | 如何绘制高斯混合分布分类区域及边界

MATLAB | 如何绘制高斯混合分布分类区域及边界

MATLAB实现高斯混合分布的EM算法及二维时概率密度曲面置信椭圆绘制

MATLAB实现高斯混合分布的EM算法及二维时概率密度曲面置信椭圆绘制

如何在matlab同一个图形上绘制多条曲线

如何在 MATLAB 中以 2-D 和 3-D 绘制图像 (.jpg)?