如何将3D数据拟合到2D正态分布函数(优选Python)

2 投票
1 回答
1096 浏览
提问于 2025-04-17 09:34

我在寻找一个脚本(最好是Python)来计算一组三维数据的二维正态分布函数。如果没有这样的脚本,我也很感激能提供任何代码或伪代码的人。

输入将是一个三元组的列表,像这样:

[[x1, y1, z1], [x2, y2, z2], [x3, y3, z3],..., [xn, yn, zn]]

我需要的是最能代表这些数据的二维正态分布的均值和标准差/方差,这样我就可以对其进行操作,并且在之后能够重新生成它。

举个例子

为了简单起见,我将使用一维正态函数。如果我有以下这些二维数据点:

[
    [-4, 0.0001],
    [-3, 0.0044],
    [-2, 0.054 ],
    [-1, 0.242 ],
    [0 , 0.3989],
    [1 , 0.242 ],
    [2 , 0.054 ],
    [3 , 0.0044],
    [4 , 0.0001]
]

我希望脚本输出:

mean = 0.0
standard deviation = 1.0
variance = 1.0

这样,如果我想把标准差从 sd = 1.0 改成 sd = 2.0,我就可以修改曲线,重新生成它,采样点 -4...4,并像这样把值写回数据中。

[
    [-4, 0.027 ],
    [-3, 0.0648],
    [-2, 0.121 ],
    [-1, 0.176 ],
    [0 , 0.1995],
    [1 , 0.176 ],
    [2 , 0.121 ],
    [3 , 0.0648],
    [4 , 0.027 ]
]

现在我的问题是:如何用一组三维点来表示一个接近二维正态分布的数据呢?


我更倾向于用Python来做,或者调用一个shell脚本。不过,我也不反对使用像MatLab或Maple这样的程序。

1 个回答

2

根据这个一维的例子,我们有一组值 (xi, yi),其中 xi 是维度为 n 的向量(n = 1n = 2),而 yi 是标量值。我们的目标是找到一个高斯函数 f 的均值 mu 和协方差矩阵 sigma,使得 f(xi) 的值尽量接近 yi 的值。

要解决这个问题,我们需要先定义一下什么是接近。比如,我们可以选择最小化 (yi - f(xi))^2 的平方和。这样就形成了一个关于 musigma 的非线性优化问题,可以用一种迭代的方法来解决,比如 Levenberg–Marquardt 算法


如果你使用的是 MatLab,可以看看他们的 曲线拟合指南,特别是里面的 非线性曲线拟合部分,以及 lsqnonlinlsqcurvefit 的例子。如果你使用的是 Python,可以找到 C/C++ 或 Fortran 中的 Levenberg–Marquardt 实现的库绑定。

无论使用哪种方法,我建议你先在一维的例子上试一下求解器。

另一个相关的资源是 SciPy 的数据拟合手册,里面有一部分专门讲 拟合二维高斯

撰写回答