生成三维高斯数据



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

我正在研究numpy的多变量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 = 1。当然,2是指您的坐标(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函数的return语句中的参数,并忽略estimate gaussian函数(尽管归一化函数仍然会提供您想要的东西-实值温度-只要您知道归一化过程-您会这样做:-))。

您可以使用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

它表示给定任何[x,y]的概率(您称之为z)

相关内容

  • 没有找到相关文章

最新更新