You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多元正态分布函数矩阵乘法异常:2D高斯分布峰值位置错误

2D高斯函数峰值跑偏?问题出在这两个地方

为啥你的Gauss_2D会出问题

直接说核心错误:

  1. 没生成真正的2D网格点
    你只是把x轴和y轴的一维数组堆叠起来,根本没生成平面上每个(x,y)的坐标对。正确操作得用np.meshgrid把x和y扩展成二维网格,这样才能覆盖整个2D采样区域的所有点。

  2. 矩阵乘法算错了东西
    你写的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:07:06