2

我正在寻找任何脚本(最好是 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.0sd = 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 这样的程序。

4

1 回答 1

2

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

为了解决这个问题,我们必须定义关闭的含义。例如,我们可以选择最小化平方和(yi - f(xi))^2。由此产生的非线性优化问题mu可以sigma使用迭代方法(例如Levenberg-Marquardt )来解决。


如果使用 MatLab,也许可以查看他们的曲线拟合指南,特别是非线性曲线拟合部分lsqnonlinlsqcurvefit示例。如果使用 Python,您可以在 C/C++ 或 Fortran 中找到与 Levenberg–Marquardt 实现的库绑定。

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

另一个相关资源是SciPy 的数据拟合食谱,其中包括关于拟合 2D 高斯的部分。

于 2012-01-05T06:37:38.327 回答