Python 生成三维高斯数据
我试图生成一个三维分布,其中Python 生成三维高斯数据,python,numpy,scipy,scikit-learn,gaussian,Python,Numpy,Scipy,Scikit Learn,Gaussian,我试图生成一个三维分布,其中x,y表示曲面,而z是某个值的大小,分布在一个范围内 我在看,但它只能让我得到一些样品。我希望能够指定一些x,y坐标,并返回z值应该是什么;所以我可以查询gp(x,y),并返回一个z值,该值遵循某种均值和协方差 也许是一个更具说明性的(玩具)例子:假设我有一些温度分布,可以建模为高斯过程。所以我可能在(0,0)时的平均温度为20,还有一些协方差[[1,0],[0,1]。我希望能够创建一个模型,然后我可以在不同的x,y位置查询,以获得该位置的温度(因此,在(5,5)处,
x,y
表示曲面,而z
是某个值的大小,分布在一个范围内
我在看,但它只能让我得到一些样品。我希望能够指定一些x,y
坐标,并返回z
值应该是什么;所以我可以查询gp(x,y)
,并返回一个z
值,该值遵循某种均值和协方差
也许是一个更具说明性的(玩具)例子:假设我有一些温度分布,可以建模为高斯过程。所以我可能在(0,0)
时的平均温度为20,还有一些协方差[[1,0],[0,1]
。我希望能够创建一个模型,然后我可以在不同的x,y
位置查询,以获得该位置的温度(因此,在(5,5)
处,我可能会得到大约7度)
如何最好地实现这一点?我假设您的数据可以复制到单个np.array,在我的代码中我将其称为
X
,shapeX.shape=(n,2)
,其中n
是您拥有的数据点的数量,如果您希望一次测试一个点,您可以拥有n=1
<当然,code>2是指由坐标(x
和y
)基所跨越的二维空间。然后:
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
函数返回语句中的参数,如果您不希望标准化分布,则可以忽略估计gaussian
函数(尽管一个标准化函数仍然会给你你想要的——一个实值温度——只要你知道标准化过程——你知道:-) 您可以使用scipy.stats.multivariable\u 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]
,所以你想要概率密度函数而不是样本?所以,这可能是我缺乏理解:PDF似乎与我正在寻找的相似,但不是x,y的0-1概率,我想要一些高斯曲线样的函数/曲面,我可以采样以获得实际的数据点。我编辑了我的答案,以更好地满足您的需要。虽然不可能知道你想要适应什么-这就是为什么我写了一个标准化分布函数。但是,现在您可以更改函数中的参数以适应您的温度分布。