我已经创建了一个函数,旨在生成一个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))
型
产生以左下角和右上角为中心的高斯分布,而不是使用第一个函数时的平均位置。
1条答案
按热度按时间kmbjn2e31#
一个简单的调试会话应该可以准确地揭示问题所在。
字符串
这将创建两个数组,大小分别为
x_grid
和y_grid
。为了简单起见,我们将两个大小都设置为3,因此当mean
为零时,数组变为-3, 0, 3
。在工作版本中,您将
meshgrid
应用于数组。这将创建一个x
和y
值的网格,每个值的大小为y_grid
×x_grid
。(实际上你使用.flatten
,但没有理由复制数据:使用.ravel
代替)3x3数组并将它们堆叠在一起成为一个9x2坐标数组。这是您可以从中获得有意义结果的东西。注意,应用meshgrid
意味着x_grid
和y_grid
不必大小相同。在这段被破坏的代码中,你只是将原始数组堆叠在一起,得到一个3x2的坐标数组。如果
x_grid
和y_grid
不匹配,这甚至不起作用。而且,你没有将结果整形为y_grid
,x_grid
个(这是你应该在工作代码中使用的,而不是全局变量rows
和cols
),因为这显然对一个数组不起作用,这个数组是必要大小的平方根。