tensorflow_probability 分布应该如何用于多维空间?
How should tensorflow_probability distributions be used for multi-dimensional spaces?
我想用张量流创建一个多维高斯概率密度函数(假设是下图中的二维高斯函数)。
对于 1D,它就像一个魅力:
d = tfp.distributions.Normal(loc=5.0, scale=3.0)
x = d.prob(tf.range(0,10, dtype=tf.float32))
但是对于更高的维度,我使用 Normal
或 MultivariateNormalDiag
分布得到 InvalidArgumentError: Incompatible shapes
错误...我错过了什么? prob
方法应该如何输出多维张量上的概率密度函数?
如果我没理解错的话,你可以这样做:
mu = [0,0]
cov = [[1,0],
[0,1]]
mv_normal = np.random.multivariate_normal(mu, cov, size=1000)
mv_normal_mean = np.mean(mv_normal , axis=0)
mv_normal_cov = np.cov(mv_normal , rowvar=0)
mv_normal_diag = np.diag(mv_normal_cov)
mv_normal_stddev = np.sqrt(mv_normal_diag)
mv_normal 就像:
mv_normal
array([[-1.73476374, 0.17578855],
[ 0.11866498, -0.66417069],
[ 1.52000069, -1.3004096 ],
...,
[-1.37625595, -0.46864374],
[ 0.81659449, 0.70524036],
[ 1.12183633, 0.14196896]])
mv_normal_mean
和 mv_normal_cov
等在这里只是数组。它们将用于创建:
mvn = tfd.MultivariateNormalDiag(
loc=mv_normal_mean,
scale_diag=mv_normal_stddev)
值可以看作:
mvn_mean
array([-0.03976356, 0.07387231])
mv_normal_cov
array([[ 1.04138867, -0.00877481],
[-0.00877481, 0.97736496]])
并且可以使用等高线图进行绘图。
x1, x2 = np.meshgrid(mv_normal[:,0], mv_normal[:,1])
data = np.stack((x1.flatten(), x2.flatten()), axis=1)
prob = mvn.prob(data).numpy()
plt.figure(figsize = (12,9))
ax = plt.axes(projection='3d')
ax.plot_surface(x1, x2, prob.reshape(x1.shape), cmap = 'Blues')
plt.show()
将产生如下结果:
我想用张量流创建一个多维高斯概率密度函数(假设是下图中的二维高斯函数)。
对于 1D,它就像一个魅力:
d = tfp.distributions.Normal(loc=5.0, scale=3.0)
x = d.prob(tf.range(0,10, dtype=tf.float32))
但是对于更高的维度,我使用 Normal
或 MultivariateNormalDiag
分布得到 InvalidArgumentError: Incompatible shapes
错误...我错过了什么? prob
方法应该如何输出多维张量上的概率密度函数?
如果我没理解错的话,你可以这样做:
mu = [0,0]
cov = [[1,0],
[0,1]]
mv_normal = np.random.multivariate_normal(mu, cov, size=1000)
mv_normal_mean = np.mean(mv_normal , axis=0)
mv_normal_cov = np.cov(mv_normal , rowvar=0)
mv_normal_diag = np.diag(mv_normal_cov)
mv_normal_stddev = np.sqrt(mv_normal_diag)
mv_normal 就像:
mv_normal
array([[-1.73476374, 0.17578855],
[ 0.11866498, -0.66417069],
[ 1.52000069, -1.3004096 ],
...,
[-1.37625595, -0.46864374],
[ 0.81659449, 0.70524036],
[ 1.12183633, 0.14196896]])
mv_normal_mean
和 mv_normal_cov
等在这里只是数组。它们将用于创建:
mvn = tfd.MultivariateNormalDiag(
loc=mv_normal_mean,
scale_diag=mv_normal_stddev)
值可以看作:
mvn_mean
array([-0.03976356, 0.07387231])
mv_normal_cov
array([[ 1.04138867, -0.00877481],
[-0.00877481, 0.97736496]])
并且可以使用等高线图进行绘图。
x1, x2 = np.meshgrid(mv_normal[:,0], mv_normal[:,1])
data = np.stack((x1.flatten(), x2.flatten()), axis=1)
prob = mvn.prob(data).numpy()
plt.figure(figsize = (12,9))
ax = plt.axes(projection='3d')
ax.plot_surface(x1, x2, prob.reshape(x1.shape), cmap = 'Blues')
plt.show()
将产生如下结果: