我正在寻找任何脚本(最好是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这样的程序。
答案 0 :(得分:2)
根据一维示例,我们得到一系列值(xi, yi)
,其中xi
值是维度n
(n = 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部分以及mu
和sigma
示例。如果使用Python,您可以在C / C ++或Fortran中找到Levenberg-Marquardt实现的库绑定。
无论使用何种方法,我建议首先在1D示例中尝试求解器。
另一个相关资源是SciPy's data fitting cookbook,其中包含fitting a 2D gaussian部分。