matlab - 如何将高斯拟合到 matlab/octave 中的数据?

标签 matlab octave curve-fitting gaussian

我有一组带峰值的频率数据,我需要将其拟合为高斯曲线,然后从中获取半峰全宽。我可以做的 FWHM 部分,我已经有一个代码,但我在编写适合高斯的代码时遇到了问题。

有谁知道任何可以为我做这件事的功能,或者可以为我指明正确方向的功能吗? (我可以对直线和多项式进行最小二乘拟合,但我不能让它对高斯函数起作用)

另外,如果它与 Octave 和 Matlab 兼容,那将会很有帮助,因为我现在有 Octave,但要到下周才能访问 Matlab。

如有任何帮助,我们将不胜感激!

最佳答案

直接拟合单个一维高斯是一个非线性拟合问题。您会找到现成的实现 here , 或 here , 或 here for 2D , 或 here (如果你有统计工具箱)(你听说过 Google 吗?:)

无论如何,可能有更简单的解决方案。如果您确定您的数据 y 将被高斯很好地描述,并且在整个 x 范围内合理分布,您可以将问题线性化(这些是方程式,不是陈述):

   y = 1/(σ·√(2π)) · exp( -½ ( (x-μ)/σ )² )
ln y = ln( 1/(σ·√(2π)) ) - ½ ( (x-μ)/σ )²
     = Px² + Qx + R         

替换的地方

P = -1/(2σ²)
Q = +2μ/(2σ²)    
R = ln( 1/(σ·√(2π)) ) - ½(μ/σ)²

已完成。现在,用(这些是 Matlab 语句)求解线性系统 Ax=b:

% design matrix for least squares fit
xdata = xdata(:);
A = [xdata.^2,  xdata,  ones(size(xdata))]; 

% log of your data 
b = log(y(:));                  

% least-squares solution for x
x = A\b;                    

您以这种方式找到的向量 x 将等于

x == [P Q R]

然后您必须对其进行逆向工程以找到平均值 μ 和标准差 σ:

mu    = -x(2)/x(1)/2;
sigma = sqrt( -1/2/x(1) );

您可以使用 x(3) == R 进行交叉检查(应该只有差异)。

关于matlab - 如何将高斯拟合到 matlab/octave 中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13290508/

相关文章:

python - 随机数重新排序的总和组合成重复值

matlab - 转换数据以适应正态分布

linux - GNU Octave,将数字四舍五入到单位精度

audio - 鸡尾酒会-音源分离

arrays - 通过在元素之间包含零来对向量进行上采样

Python:计算非线性拟合的置信区间

matlab - 按升序排序,但最后保留零

machine-learning - 如何使用机器学习从音频剪辑中提取人声?

matlab - 生成围绕散点图上的点的曲线

matlab - 在 Matlab 中查找行中的最小值并计算每列中最小值的总数