生成 3D 高斯数据
Generating 3D Gaussian Data
我正在尝试生成 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 = 1
。 2
当然是指由您的坐标(x
和 y
)基跨越的 2D space。那么:
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 语句中的参数,如果您不想要归一化分布(尽管归一化功能仍然会给你你想要的东西 - 一个真正有价值的温度 - 只要你知道标准化过程 - 你做的:-))。
您可以使用 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
)
我正在尝试生成 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 = 1
。 2
当然是指由您的坐标(x
和 y
)基跨越的 2D space。那么:
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 语句中的参数,如果您不想要归一化分布(尽管归一化功能仍然会给你你想要的东西 - 一个真正有价值的温度 - 只要你知道标准化过程 - 你做的:-))。
您可以使用 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
)