生成三维高斯数据

时间:2017-01-25 15:58:32

标签: 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度的东西。

如何最好地完成这项工作?

2 个答案:

答案 0 :(得分:1)

我假设您的数据可以复制到单个np.array,我在代码中将其称为X.shape = (n,2),形状为n,其中n = 1是数字如果您希望一次测试一个点,那么您拥有的数据点数就可以2。当然,x是指您的坐标(ydef 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 ) ) )基础跨越的2D空间。然后:

k = 2

会做你想要的 - 也就是说,给定数据点你会得到那些点(或单点)的高斯函数的值。这实际上是您需要的通用版本,因为此函数可以描述多变量高斯。您似乎对sigma2案例和对角线协方差矩阵mva_gaussian感兴趣。

此外,这也是一个概率分布 - 你说你不想要。我们没有足够的信息来确定你想要适合的是什么(即你期望高斯函数的三个参数是什么。通常,人们对正态分布感兴趣)。不过,您只需根据需要更改estimate gaussian函数的return语句中的参数,如果不需要规范化分布,则忽略{{1}}函数(尽管规范化函数仍会给出你所寻求的 - 一个真正有价值的温度 - 只要你知道正常化过程 - 你做了:-))。

答案 1 :(得分:0)

您可以使用scipy.stats.multivariate_normal创建多变量法线。

>>> import scipy.stats
>>> dist = scipy.stats.multivariate_normal(mean=[2,3], cov=[[1,0],
                                                            [0,1]])

然后,要查找p(x,y),您可以使用pdf

>>> dist.pdf([2,3])
0.15915494309189535
>>> dist.pdf([1,1])
0.013064233284684921

代表任何z

的概率(您称之为[x,y]