[英]Octave: 3D Surface plot for Gaussian distribution
我是Octave和Matlab的新手,
我正在尝试绘制高斯分布的表面图,以使用数据集的两个特征(x轴和y轴)和高斯值(z轴)可视化异常检测。
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
下面给出的是与我想要的图相似的图:
我的尝试:
我尝试为每个维度创建一个网格网格,并在矩阵上做一个曲面图,但是没有用。 它给了我一个怪异的情节,如下所示
[X1,Y1]=meshgrid(x1',x2');
[Z]=meshgrid(z');
surf (X,Y,Z)
如果有人帮助我正确获取图表,我会很高兴
谢谢 :)
我假设您想在给定的2D坐标之间进行插值,以尝试创建高斯曲面。 您需要使用的是griddata
(Octave doc) (MATLAB doc) ,您可以在其中指定(x,y,z)
点,然后指定形成所需输出表面的2D坐标。 为此,您可以结合使用meshgrid
(Octave doc) (MATLAB doc)和linspace
(Octave doc) (MATLAB doc)来帮助您生成这些点。
我们可以使用linspace
为每个轴从每个轴的最小到最大生成线性的点集。 默认情况下, linspace
会在给定的最小值和最大值之间生成100个点,因此我们坚持使用这些点。 之后,使用meshgrid
生成您希望高斯曲面占据的2D点的最终网格。 然后,使用griddata
使用输入(x,y,z)
点以及从生成的二维点的最终网格meshgrid
以产生最终表面。 由于高斯曲线的“弯曲度”,我将指定cubic
标记以在定义高斯曲线的控制点之外的区域中执行双三次插值。 默认情况下, griddata
使用双线性插值,但让我们重写并使用双三次插值。
事不宜迟,假设X1
, X2
和Z
都是在工作空间中加载的所有矢量,这是内插并生成曲面的代码:
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');
这是我得到的表面:
这与实际的高斯曲线不一样(...更像是一个倾斜的高架帐篷),其原因是因为从高斯分布中采样的数据太稀疏,并且控制点之间的距离很远。 对于控制点之间的点,您必须进行插值,插值的精度将不及高斯分布本身的实际值。
如果您对构建高斯曲面很认真,则实际上应该从高斯的数学定义中生成点,那么曲面图肯定会看起来很准确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.