python - 生成 3D 高斯数据

标签 python numpy scipy scikit-learn gaussian

<分区>

我正在尝试生成 3D 分布,其中 x, y 表示表面平面,z 是某个值的大小,分布在一个范围内。

我正在查看 numpy's multivariate_normal , 但它只能让我得到一些样本。我希望能够指定一些 x, y 坐标,并返回 z 值应该是什么;这样我就可以查询 gp(x, y) 并取回符合某种均值和协方差的 z 值。

也许是一个更具说明性的(玩具)示例:假设我有一些可以建模为高斯过程的温度分布。所以我在 (0, 0) 处的平均温度可能为 20,并且有一些协方差 [[1, 0], [0, 1]]。我希望能够创建一个模型,然后我可以在不同的 x, y 位置查询以获得该位置的温度(因此,在 (5, 5) 我可能会回到 7 度左右)。

如何最好地实现这一点?

最佳答案

我假设您的数据可以复制到单个 np.array,我将在我的代码中将其称为 X,形状为 X.shape = (n,2) ,其中 n 是您拥有的数据点的数量,如果您希望一次测试一个点,您可以设置 n = 12,当然是指以您的坐标(xy)为底所跨越的二维空间。然后:

def estimate_gaussian(X):
  return X.mean(axis=0), np.cov(X.T)

def mva_gaussian( X, mu, sigma2 ):
  k = len(mu)
  # check if sigma2 is a vector and, if yes, use as the diagonal of the covariance matrix
  if sigma2.ndim == 1 :
    sigma2 = np.diag(sigma2)
  X = X - mu
  return (2 * np.pi)**(-k/2) * np.linalg.det(sigma2)**(-0.5) * \
    np.exp( -0.5 * np.sum( np.multiply( X.dot( np.linalg.inv(sigma2) ), X ), axis=1 ) ).reshape( ( X.shape[0], 1 ) )

会做你想做的事——也就是说,给定数据点你会得到这些点(或单个点)的高斯函数值。这实际上是您需要的通用版本,因为此函数可以描述多元高斯。您似乎对 k = 2 情况和对角协方差矩阵 sigma2 感兴趣。

此外,这也是一个概率分布——你说你不想要。我们没有足够的信息来了解您想要拟合的到底是什么(即您期望高斯函数的三个参数是什么。通常,人们对正态分布感兴趣)。不过,您可以根据需要简单地更改 mva_gaussian 函数的返回语句中的参数,如果您不想要归一化分布,则忽略 estimate gaussian 函数(尽管归一化函数仍会为您提供所需的东西 - 一个真正有值(value)的温度 - 只要你知道归一化过程 - 你会这样做:-))。

关于python - 生成 3D 高斯数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41856078/

相关文章:

python - Pandas:按包含字典的列中字典的键进行分组

python - 通过pyserial控制电脑键盘

python - numpy 替代插入的向量化实现

python - 计算 1/tanh(x) - 1/x 对于非常小的 x

python - 使用 Python 的二维数组(图像)中的像素邻居

python - 从曲线形状中获取均匀分布的点

python - asyncio.run 运行时错误 : Event loop is closed

python - 将 numpy 数组保存到文件中(尽可能小)

python - lil_matrix 行上的按位运算

python - scipy.stats.norm.pdf 用于在 python 中计算 p 值