我是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
下面给出的是与我想要的类似的情节:
我的尝试:
我尝试为每个维度创建一个网格,并在矩阵上做了一个surfplot,但它没有用。它给了我一个奇怪的情节,如下所示
[X1,Y1]=meshgrid(x1',x2');
[Z]=meshgrid(z');
surf (X,Y,Z)
我很高兴如果有人帮我正确地获取图表
谢谢你:)
答案 0 :(得分:1)
我假设您想要在给定的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)
生成的2D点的最终网格来使用meshgrid
来生成最终曲面。由于高斯曲线的“曲率”,我会指定cubic
标志,以在定义高斯曲线的控制点之外的区域中执行双三次插值。 griddata
默认使用双线性插值,但让我们覆盖并使用bicubic。
不用多说,假设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');
这是我得到的表面:
这与实际的高斯曲线不同(...更像是一个拙劣的凸起的帐篷),原因是你从高斯分布中采样的数据太稀疏而且控制点远离彼此。对于控制点之间的点,您必须进行插值,并且插值不会像来自高斯分布本身的实际点那样准确。
如果你真的想要构建高斯曲面,你应该从高斯的数学定义中生成点,然后曲面图看起来肯定是准确的。