【发布时间】:2020-07-06 09:28:33
【问题描述】:
我有一个简单的二维高斯分布图。
from scipy.stats import multivariate_normal
from matplotlib import pyplot as plt
means = [ 1.03872615e+00, -2.66927843e-05]
cov_matrix = [[3.88809050e-03, 3.90737359e-06], [3.90737359e-06, 4.28819569e-09]]
# This works
a_lims = [0.7, 1.3]
b_lims = [-5, 5]
# This does not work
a_lims = [0.700006488869478, 1.2849292618191401]
b_lims =[-5.000288311285968, 5.000099437047633]
dist = multivariate_normal(mean=means, cov=cov_matrix)
a_plot, b_plot = np.mgrid[a_lims[0]:a_lims[1]:1e-2, b_lims[0]:b_lims[1]:0.1]
pos = np.empty(a_plot.shape + (2,))
pos[:, :, 0] = a_plot
pos[:, :, 1] = b_plot
z = dist.pdf(pos)
plt.figure()
plt.contourf(a_plot, b_plot, z, cmap='coolwarm', levels=100)
如果我使用标记为“这有效”的限制,我会得到以下图(正确)。
但是,如果我使用相同的限制,但稍作调整,则绘制完全错误,因为定位在不同的值(如下)。
我猜这是mgrid 中的一个错误。有没有人有任何想法?更具体地说,为什么分布的最大值会移动?
【问题讨论】:
-
制作
pos的更简单方法:pos = np.dstack(np.mgrid[a_lims[0]:a_lims[1]:1e-2, b_lims[0]:b_lims[1]:0.1]) -
另外,错误不在
mgrid中,您可以通过显示每次都正确生成网格来验证这一点 -
该错误似乎出现在 PDF 函数中。不是它的实现,而是你的使用。我认为对于该协方差矩阵,您没有看到高斯椭圆中的任何旋转,这有点令人怀疑
-
我也不确定第一个情节是否正确。 x-mean 看起来在 1.0 和 1.1 之间接近 1.1,可能是 1.06 或 1.07,绝对不是 1.038。
-
你的 X 和 Y 被交换了。 A 是行 (y),B 是列 (X)
标签: python numpy matplotlib scipy.stats