首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >八度:高斯分布的三维曲面图

八度:高斯分布的三维曲面图
EN

Stack Overflow用户
提问于 2014-09-11 09:53:44
回答 1查看 3.4K关注 0票数 1

我对Octave和Matlab非常陌生,

我试图绘制一个用于高斯分布的表面图,利用数据集的两个特征(x轴和y轴)和高斯值(z轴)来可视化异常检测。

代码语言:javascript
运行
复制
   X1           X2       Z(the Gaussian value )  

0.00000       3.0000          0.0153130  
2.00000       2.8000          0.0457589
2.20000       3.0000          0.0550785
2.30000       2.0000          0.0163526
2.40000       2.2000          0.0252592
2.70000       3.5000          0.0615501
2.70000       4.2000          0.0259381
2.90000       3.0000          0.0695891
4.10000       1.6000          0.0088349
4.40000       3.5000          0.0812291
4.40000       4.5000          0.0179289
4.80000       3.2000          0.0886546
5.90000       3.0000          0.0734376
6.30000       3.0000          0.0658523
5.90000       4.0000          0.0407246
6.40000       4.0000          0.0353848
6.20000       3.0000          0.0678455
6.30000       3.6000          0.0576709
8.20000       3.8000          0.0195292
10.00000      2.7000          0.0054764

下面是我想要的一个类似的情节:

我的尝试:

我试着为每个维度创建一个网格网格,并在矩阵上做了一个超图,但是它不起作用。它给了我一个奇怪的情节,如下所示

代码语言:javascript
运行
复制
[X1,Y1]=meshgrid(x1',x2');
[Z]=meshgrid(z');
surf (X,Y,Z)

如果有人能帮我得到正确的图表,我会很高兴的

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-19 18:08:13

我假设你想要在给定的2D坐标之间插值,尝试创建一个高斯曲面。您需要使用的是griddata (八度文档) (MATLAB doc),在这里指定您的(x,y,z)点,然后指定形成您想要的输出面的2D坐标。为此,您可以使用meshgrid (八度文档) (MATLAB doc)linspace (八度文档) (MATLAB doc)的组合来帮助生成这些点。

我们可以使用linspace为每个轴生成一个从最小到最大的线性点集。默认情况下,linspace会在给定的最小值和最大值之间生成100个点,所以让我们继续使用这些值。然后,使用meshgrid生成你想要你的高斯曲面占据的二维点的最终网格。然后使用griddata,使用输入的(x,y,z)点以及从meshgrid生成的2D点的最终网格来生成最终的曲面。由于高斯曲线的“曲线”,我将指定cubic标志,在定义高斯曲线的控制点以外的区域执行双三次插值。默认情况下,griddata使用双线性插值,但让我们重写并使用双三次插值。

如果X1X2Z都是加载在工作区中的向量,则无需进一步验证,这是用于插值和生成曲面的代码:

代码语言:javascript
运行
复制
limitsX = linspace(min(X1), max(X1));
limitsY = linspace(min(X2), max(X2));
[X1out,X2out] = meshgrid(limitsX, limitsY);
Zout = griddata(X1, X2, Z, X1out, X2out, 'cubic');
surf(X1out, X2out, Zout);
title('Interpolated Gaussian Surface');
xlabel('X1');
ylabel('X2');
zlabel('Z');

这是我得到的表面:

这不像实际的高斯曲线(.更像是一个拙劣的帐篷),原因是你从高斯分布中采样的数据太稀疏了,而且控制点相距很远。对于在控制点之间的点,你必须插值,而且插值不会像高斯分布本身的实际点那样精确。

如果你真的想要建立一个高斯曲面,你实际上应该从高斯的数学定义中生成点,那么曲面图看起来一定是准确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25784363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档