我有一组带峰值的频率数据,我需要将其拟合为高斯曲线,然后从中获取半峰全宽。我可以做的 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/