2012-01-18 8 views
0

Я ищу алгоритмы для подгонки кривой из табличных XY-данных к гауссовой функции (кривая колокола a.k.a.). Прибегая к помощи я могу найти несколько гауссовской подгоночную Algos для Matlab, вот несколько из них:Схема кривой на Lua

https://ccrma.stanford.edu/~jos/sasp/Fitting_Gaussian_Data.html

http://jila.colorado.edu/bec/BEC_for_everyone/matlabfitting.htm

Один, кажется, использует функцию «polyfit» в Matlab для работы.

Любой, кто видел готовый альго для языка Lua (гауссовский или полифитовый)? Если нет, я бы очень признателен за помощь в создании/переносе такого алгоритма, поскольку он, вероятно, будет потреблять один день с моими ограниченными навыками Lua.

ответ

0

Вы можете преобразовать уравнение в линейную форму, а затем использовать методы, описанные в Linear Regression Полом Бурком (чуть ниже страницы).

Если вам нужно, я могу продемонстрировать процесс перегруппировки для вас.

Если у вас действительно необходимо, я могу обеспечить реализацию алгоритма линии наилучшего соответствия в Lua.

+0

Если вы не против, я бы хотел увидеть этот процесс перераспределения. Спасибо. – borges

+0

Спасибо за отзыв! Мне удалось выполнить какую-то реализацию с подходящими функциями GSL. Я оценил это правильно, потребовалось почти целый день, чтобы собрать его вместе, включая настройку gsl-lua, чтобы запустить его под Windows. Я отправлю код здесь. – TeroK

1

Вот моя попытка извлечь гауссовскую форму из шумных данных измерений.

require 'gsl' 
require 'math' 

--x=x coordinates, y=y coordinates 
--clip=relative clip/ignore level 0..1 (i.e 0.1 removes values below 10% of max amplitide) 
--removeoffset=set to true if y data offset should be removed 
function gaussianFit(x, y, clip, removeoffset) 
    local xx = {} 
    local yy = {} 
    local yoffset=0 

    if removeoffset==nil or removeoffset==false then 
    else --remove y data offset 
     yoffset=gsl.Vector(y):min() 
    end 

    local ymax=gsl.Vector(y):max()-yoffset 

    --pick only data points that has y coord larger than clip level 
    for i=1,#x do 
     if (y[i]-yoffset) > (clip*ymax) then 
      table.insert(xx, x[i]) 
      table.insert(yy, math.log(y[i]-yoffset)) 
     end 
    end 

    local xvect = gsl.Vector(xx) 
    local yvect = gsl.Vector(yy) 

    --fit to polynomial 
    local poly3 = gsl.fit.poly(3) -- a third degree polynomial 
    local fit = gsl.lsfit({xvect, poly3}, yvect, nil, "fmulti") -- fits xx and yy with poly3 

    --convert to gauss coeffs 
    local A2=fit:coeffs()[3] 
    local A1=fit:coeffs()[2] 
    local A0=fit:coeffs()[1] 

    local sigma=math.sqrt(-1/(2*A2)) 
    local mu=A1*math.pow(sigma,2) 
    local A=math.exp(A0+math.pow(mu,2)/(2*math.pow(sigma,2))) 

    return sigma, mu, A 
end 

xx={1, 2, 3, 4, 5, 6, 7, 8, 9} 
yy={1, 2, 4, 6, 4, 3, 2, 1, 1} 
sigma,mu,A=gaussianFit(xx,yy,0.1,false) 
print(sigma.." "..mu.." ".. A) 
--prints 2.2829275461334 4.6387484511153 4.201115115886 

 Смежные вопросы

  • Нет связанных вопросов^_^