多元正态分布函数矩阵乘法异常:2D高斯分布峰值位置错误
2D高斯函数峰值跑偏?问题出在这两个地方
为啥你的Gauss_2D会出问题
直接说核心错误:
没生成真正的2D网格点
你只是把x轴和y轴的一维数组堆叠起来,根本没生成平面上每个(x,y)的坐标对。正确操作得用np.meshgrid把x和y扩展成二维网格,这样才能覆盖整个2D采样区域的所有点。矩阵乘法算错了东西
你写的xy.T @ inv_cov_matrix @ xy,算出来的不是每个点到均值的马氏距离平方,而是任意两个点之间的关联值。拿单位协方差矩阵举例,这个结果是个N×N的矩阵,元素是x_i*x_j + y_i*y_j,最大值自然出现在x、y同时取最大或最小的位置——也就是左下角和右上角,这就是错误峰值的来源。
修复后的代码
把这两个问题改了,函数就正常了:
import numpy as np def Gauss_2D(x_grid, y_grid, mean=np.array((0, 0)), covariance_matrix=np.array([[1, 0], [0, 1]])): # 生成二维网格,覆盖所有(x,y)采样点 x = np.linspace(-3, 3, x_grid) y = np.linspace(-3, 3, y_grid) x_mesh, y_mesh = np.meshgrid(x, y) # 把网格点转成(N², 2)的数组,每行对应一个坐标对 xy = np.column_stack((x_mesh.flatten(), y_mesh.flatten())) # 每个点减去均值,得到相对于中心的偏移 xy_centered = xy - mean inv_cov_matrix = np.linalg.inv(covariance_matrix) # 计算每个点的马氏距离平方,这才是高斯公式里的指数项 exponent = -0.5 * np.sum(xy_centered @ inv_cov_matrix * xy_centered, axis=1) # 归一化系数 norm_factor = 1 / (2 * np.pi * np.sqrt(np.linalg.det(covariance_matrix))) z = norm_factor * np.exp(exponent) # 把结果转回网格形状 return z.reshape(y_grid, x_grid)
验证一下
调用后用matplotlib显示,峰值就会在中心位置了:
import matplotlib.pyplot as plt g2d = Gauss_2D(100, 100) plt.imshow(g2d, cmap='viridis', origin='lower') plt.colorbar() plt.show()
内容的提问来源于stack exchange,提问作者D. Illouz
相关产品推荐
相关产品推荐

