如何将3D数据拟合到2D正态分布函数(优选Python)
我在寻找一个脚本(最好是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 个回答
根据这个一维的例子,我们有一组值 (xi, yi)
,其中 xi
是维度为 n
的向量(n = 1
或 n = 2
),而 yi
是标量值。我们的目标是找到一个高斯函数 f
的均值 mu
和协方差矩阵 sigma
,使得 f(xi)
的值尽量接近 yi
的值。
要解决这个问题,我们需要先定义一下什么是接近。比如,我们可以选择最小化 (yi - f(xi))^2
的平方和。这样就形成了一个关于 mu
和 sigma
的非线性优化问题,可以用一种迭代的方法来解决,比如 Levenberg–Marquardt 算法。
如果你使用的是 MatLab,可以看看他们的 曲线拟合指南,特别是里面的 非线性曲线拟合部分,以及 lsqnonlin
和 lsqcurvefit
的例子。如果你使用的是 Python,可以找到 C/C++ 或 Fortran 中的 Levenberg–Marquardt 实现的库绑定。
无论使用哪种方法,我建议你先在一维的例子上试一下求解器。
另一个相关的资源是 SciPy 的数据拟合手册,里面有一部分专门讲 拟合二维高斯。