matlab - Octave:高斯分布的 3D 曲面图

标签 matlab machine-learning octave

我对 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

下面给出的是与我想要的类似的情节:

enter image description here

我的尝试:

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

[X1,Y1]=meshgrid(x1',x2');
[Z]=meshgrid(z');
surf (X,Y,Z)

enter image description here

如果有人帮助我正确获取图表,我会很高兴

谢谢你:)

最佳答案

我假设您想要在给定的 2D 坐标之间进行插值以尝试创建高斯曲面。您需要使用的是 griddata (Octave doc) (MATLAB doc) ,您可以在其中指定 (x,y,z) 点,然后指定形成所需输出曲面的 2D 坐标。为此,您可以使用 meshgrid (Octave doc) 的组合。 (MATLAB doc)linspace (Octave doc) (MATLAB doc)帮助您生成这些积分。

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

言归正传,假设 X1X2Z 都是加载到工作区中的向量,这是用于插值和生成的代码表面:

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');

这是我得到的表面:

enter image description here

这与实际的高斯曲线不同(...更像是一个拙劣的凸起帐篷),其原因是因为您从高斯分布中采样的数据太稀疏并且控制点远离彼此。对于控制点之间的点,您必须进行插值,并且插值不会像来自高斯分布本身的实际点那么准确。

如果您认真构建高斯曲面,您实际上应该根据高斯的数学定义生成点,那么曲面图肯定会看起来准确。

关于matlab - Octave:高斯分布的 3D 曲面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25784363/

相关文章:

machine-learning - 模型并行执行的 tf.Estimator 示例

c++ - mkoct 文件错误

arrays - 从数组中生成坐标

python - 类似于 MATLAB 的 python 切片

machine-learning - 为什么感知器或 SVM 中不使用 0-1 损失函数?

machine-learning - 使用 TensorFlow 对不平衡数据进行训练

Octave 调用一个函数作为另一个函数的变量

matlab - 这两个用于 ML 中正则化 Logistic 回归的 Octave 语句有什么区别

arrays - 沿对角线子集对称矩阵

java - 将两个椭圆拟合到 body 轮廓