Gaussian Curve Fitting - Parameter Estimation - Android/Java -


i have fit gaussian curve noisy set of data , take it's fwhm application. used matlab demo concept, , curve fitting in matlab extremely easy.

however, have translate code java/android. tried looking libraries in android me fit gaussian curve data set, couldn't find anything. consequently, started trying learn math involved manually.

my question: how go estimating 3 parameters (center, width, height) single-term gaussian model? tried looking expectation-maximization algorithm went way on head.

in general, assume have error minimization? i'm having trouble figuring out step-by-step method of fitting gaussian curve data.

edit:

one of things tried involved taking natural log of data, fitting parabola result using lsqr, , transforming back. however, results i'm getting aren't accurate, because method biased in way or another.

if don't know how parameter estimation, have other suggestions of fitting curve data? (remember, has manual since android seems limited on it's statistics libraries)

i did similar thing using apache commons math class, levenberg-marquardt optimizer, curvefitter, , gaussianfunction classes.

the code used data ready like:

    // initialize analyzers     _optimizer = new levenbergmarquardtoptimizer();     _fitter = new curvefitter(_optimizer);      // initialize analysis results     _gaussians = new arraylist<gaussianfunction>();      // load data gaussian fitter     (int = 0; != data.length; i++)         _fitter.addobservedpoint(i, data[i]); 

and perform fit:

public void analyze() {     // calculate mean     double sum_yx = 0.0;     double sum_y = 0.0;     (int = 0; != _data.length; i++) {         sum_yx += _data[i] * (i + 1);         sum_y += _data[i];     }      double mean = sum_yx / sum_y;      // peform gaussian fit      // if no guesses given, fit mean of data     if (_guesses.size() == 0) {         double[] guess = new double[] { 0, 1, mean, 1 };         double ret[];         try {             ret = _fitter.fit(new parametricgaussianfunction(), guess);             _gaussians.add(new gaussianfunction(ret[0], ret[1], ret[2],                     ret[3]));         } catch (exception e) {             e.printstacktrace();         }      }      // if guesses given, fit each 1     else {         try {             (double[] guess : _guesses) {                 double ret[] = _fitter.fit(                         new parametricgaussianfunction(), guess);                 _gaussians.add(new gaussianfunction(ret[0], ret[1], ret[2],                         ret[3]));             }         } catch (exception e) {             e.printstacktrace();             // _gaussian = null;         }     } } 

you mentioned data noisy; included guesses because had fit peaks gaussianish distributions formed gaussian shape themselves. initial condition has accurate. if guesses off few pixels, got fit on entire data set instead of peak. imagine if there's no fallback / larger trend fit to, fail.

gaussianfunction has cryptic parameters a, b, c, , d are, respectively, y offset, amplitude, centroid position, , sigma.

i don't know single thing android, don't know if you'll able use package, found question while looking related 1 (i'm replicating matlab application in java, not fun) , figured if haven't figured out yet, might help!


Comments