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

use*_*676 10 matlab gaussian octave curve-fitting

我有一组带有峰值的频率数据,我需要拟合一条高斯曲线,然后从中得到半峰全宽.我可以做的FWHM部分,我已经有了一个代码,但我在编写代码以适应高斯时遇到了麻烦.

有没有人知道任何能为我做这件事的功能,或者能指出我正确的方向?(我可以对线和多项式进行最小二乘拟合,但我不能让它适用于高斯人)

如果它与Octave和Matlab兼容,那将是有帮助的,因为我现在有Octave但是直到下周才能访问Matlab.

任何帮助将不胜感激!

Rod*_*uis 20

直接拟合单个1D高斯是一个非线性拟合问题.你会发现现成的实现在这里,或这里,或这里2D,或者在这里(如果你有统计工具箱)(你有没有听说过谷歌的?:)

无论如何,可能有一个更简单的解决方案.如果你确定你的数据y将被高斯描述得很好,并且在整个范围内分布得相当均匀x,你可以将问题线性化(这些是方程,而不是语句):

   y = 1/(?·?(2?)) · exp( -½ ( (x-?)/? )² )
ln y = ln( 1/(?·?(2?)) ) - ½ ( (x-?)/? )²
     = Px² + Qx + R         
Run Code Online (Sandbox Code Playgroud)

换人的地方

P = -1/(2?²)
Q = +2?/(2?²)    
R = ln( 1/(?·?(2?)) ) - ½(?/?)²
Run Code Online (Sandbox Code Playgroud)

已经成了.现在,解决线性系统Ax=b(这些是Matlab语句):

% 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;                    
Run Code Online (Sandbox Code Playgroud)

x你用这种方式找到的矢量将是相同的

x == [P Q R]
Run Code Online (Sandbox Code Playgroud)

然后你必须进行逆向工程以找到平均μ和标准偏差σ:

mu    = -x(2)/x(1)/2;
sigma = sqrt( -1/2/x(1) );
Run Code Online (Sandbox Code Playgroud)

您可以与之交叉核对x(3) == R(应该只有很小的差异).