如何将3D数据列表拟合到2D正态分布函数(最好是Python)

时间:2012-01-05 01:59:10

标签: python math normal-distribution

我正在寻找任何脚本(最好是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 个答案:

答案 0 :(得分:2)

根据一维示例,我们得到一系列值(xi, yi),其中xi值是维度nn = 1或{{1}的向量}),n = 2值是标量。对于维yi的高斯函数mu,我们希望找到均值sigma和协方差矩阵f,以使n值接近{{1}值。

要解决此问题,我们必须定义 close 的含义。例如,我们可以选择最小化平方和f(xi)的总和。 yi(yi - f(xi))^2中产生的非线性优化问题可以使用Levenberg–Marquardt等迭代方法求解。


如果使用MatLab,可能会看到他们的Curve Fitting Guide,特别是Nonlinear Curve Fitting部分以及musigma示例。如果使用Python,您可以在C / C ++或Fortran中找到Levenberg-Marquardt实现的库绑定。

无论使用何种方法,我建议首先在1D示例中尝试求解器。

另一个相关资源是SciPy's data fitting cookbook,其中包含fitting a 2D gaussian部分。