numpy 多元正态分布函数矩阵乘法行为不符合预期

jgzswidk  于 2024-01-08  发布在  其他
关注(0)|答案(1)|浏览(151)

我已经创建了一个函数,旨在生成一个2D高斯数组,根据公式:


的数据
然而,峰值在参数空间的边缘而不是在均值所在的地方分裂。

def Gauss_2D(x_grid, y_grid, mean=np.array((0, 0)), covariance_matrix=np.array([[1, 0], [0, 1]])):
    x=np.linspace(-3, 3, x_grid)-mean[0]
    y=np.linspace(-3, 3, y_grid)-mean[1]

    xy=np.vstack((x, y))
    inv_cov_matrix = np.linalg.inv(covariance_matrix)

    exponent = -0.5 * (xy.T @ inv_cov_matrix @ xy)
    z = (1 / (2 * np.pi * np.sqrt(np.linalg.det(covariance_matrix)))) * np.exp(exponent)

    return z

字符串
我还想提一下,我确实有一个代码,为子孙后代的缘故,我只是不明白为什么上面的代码不工作。

def Gauss2D(x_grid, y_grid, mean=(0, 0), covariance_matrix=[[1, 0], [0, 1]]):
    x = np.linspace(-3, 3, x_grid)
    y = np.linspace(-3, 3, y_grid)
    x, y = np.meshgrid(x, y)

    xy = np.column_stack((x.flatten(), y.flatten()))
    inv_cov_matrix = np.linalg.inv(covariance_matrix)
    
    exponent = -0.5 * np.sum((xy - mean) @ inv_cov_matrix * (xy - mean), axis=1)
    z = (1 / (2 * np.pi * np.sqrt(np.linalg.det(covariance_matrix)))) * np.exp(exponent)

    return z.reshape(rows, cols)


的输出

g2d= Gauss_2D(100, 100)
plt.imshow(g2d, cmap='viridis', extent=(-3, 3, -3, 3))


产生以左下角和右上角为中心的高斯分布,而不是使用第一个函数时的平均位置。

kmbjn2e3

kmbjn2e31#

一个简单的调试会话应该可以准确地揭示问题所在。

x = np.linspace(-3, 3, x_grid) - mean[0]
y = np.linspace(-3, 3, y_grid) - mean[1]

字符串
这将创建两个数组,大小分别为x_gridy_grid。为了简单起见,我们将两个大小都设置为3,因此当mean为零时,数组变为-3, 0, 3
在工作版本中,您将meshgrid应用于数组。这将创建一个xy值的网格,每个值的大小为y_grid × x_grid。(实际上你使用.flatten,但没有理由复制数据:使用.ravel代替)3x3数组并将它们堆叠在一起成为一个9x2坐标数组。这是您可以从中获得有意义结果的东西。注意,应用meshgrid意味着x_gridy_grid不必大小相同。
在这段被破坏的代码中,你只是将原始数组堆叠在一起,得到一个3x2的坐标数组。如果x_gridy_grid不匹配,这甚至不起作用。而且,你没有将结果整形为y_gridx_grid个(这是你应该在工作代码中使用的,而不是全局变量rowscols),因为这显然对一个数组不起作用,这个数组是必要大小的平方根。

相关问题