我对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)
如果有人能帮我得到正确的图表,我会很高兴的
谢谢:)
发布于 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
使用双线性插值,但让我们重写并使用双三次插值。
如果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');
这是我得到的表面:
这不像实际的高斯曲线(.更像是一个拙劣的帐篷),原因是你从高斯分布中采样的数据太稀疏了,而且控制点相距很远。对于在控制点之间的点,你必须插值,而且插值不会像高斯分布本身的实际点那样精确。
如果你真的想要建立一个高斯曲面,你实际上应该从高斯的数学定义中生成点,那么曲面图看起来一定是准确的。
https://stackoverflow.com/questions/25784363
复制相似问题