2013-07-11 2 views
1

잡음이 많은 데이터 세트에 가우스 곡선을 맞춰야하고 특정 애플리케이션에 대해 FWHM을 사용해야합니다. 개념을 데모하기 위해 MATLAB을 사용했고 MATLAB에서 커브 피팅은 매우 쉽습니다.가우스 곡선 피팅 - 매개 변수 추정 - Android/Java

그러나 결국 Java/Android로 코드를 변환해야합니다. 안드로이드에서 Gaussian 곡선을 데이터 세트에 맞추는 데 도움이되는 라이브러리를 찾으려고했지만 아무 것도 찾을 수 없었습니다. 결과적으로 저는 수학을 수작업으로 할 수 있도록 모든 수학을 배우기 시작했습니다.

내 질문 : 단일 용어 가우시안 모델의 세 가지 매개 변수 (중심, 폭, 높이)를 계산하려면 어떻게해야합니까? Expectation-Maximization 알고리즘을 살펴 보았지만 그것이 내 머리 위로 이어졌다.

일반적으로 오류 최소화와 관련이 있다고 가정합니다. 나는 데이터에 가우스 곡선을 맞추는 단계별 방법을 알아내는 데 어려움을 겪고있다.

편집 : 내가하려고하는 일의

하나는 이미 LSQR를 사용하여 결과에 포물선을 피팅, 내 데이터의 자연 로그를 복용 한 후 다시 변환하고있었습니다. 그러나, 내가 얻는 결과는 정확하지 않습니다. 아마도이 방법이 어떤 식 으로든 편향되어 있기 때문일 것입니다.

매개 변수 계산 방법을 모르는 경우 데이터에 곡선을 맞추는 다른 제안이 있습니까? 내가 최근에 아파치 코 몬즈 수학 클래스를 사용하여 비슷한 일, 특히 개의 Levenberg-마르카토 최적화, CurveFitter 및 GaussianFunction 클래스를했다

+0

이것은 주제와 관련이 없습니다. 그래서 프로그래밍 질문을위한 것이지 수학 질문이 아닙니다. [MathematicsSE] (http://math.stackexchange.com/)를 확인하십시오. –

+0

하지만 그것은 프로그래밍 문제입니다, 하하. –

답변

2

(안드로이드 상당히 그것의 통계 라이브러리에 제한 될 것으로 보인다 이후 수동이어야한다 기억). 다음

// Initialize analyzers 
    _optimizer = new LevenbergMarquardtOptimizer(); 
    _fitter = new CurveFitter(_optimizer); 

    // Initialize the analysis results 
    _gaussians = new ArrayList<GaussianFunction>(); 

    // Load the data into the gaussian fitter 
    for (int i = 0; i != data.length; i++) 
     _fitter.addObservedPoint(i, data[i]); 

실제로 맞게 수행 :

내가 데이터를 준비하는 데 사용되는 코드는 같은 것을했다 당신은 당신의 데이터에 잡음이 언급

public void analyze() { 
    // Calculate Mean 
    double sum_yx = 0.0; 
    double sum_y = 0.0; 
    for (int i = 0; i != _data.length; i++) { 
     sum_yx += _data[i] * (i + 1); 
     sum_y += _data[i]; 
    } 

    double mean = sum_yx/sum_y; 

    // Peform the gaussian fit 

    // If no guesses given, fit to the mean of the 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 are given, fit to each one 
    else { 
     try { 
      for (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; 
     } 
    } 
} 

을; 추측을 포함 시켰습니다. Gaussian 분포를 가진 봉우리에 맞추어야했기 때문입니다. 초기 조건은 매우 정확해야합니다. 추측이 몇 픽셀 정도 벗어난 경우 피크가 아닌 전체 데이터 세트에 적합합니다. 나는 fallback/greater trend가 맞지 않는다면, 실패 할 것입니다.

GaussianFunction에는 각각 y 오프셋, 진폭, 중심 위치 및 시그마 인 암호 매개 변수 A, B, C 및 D가 있습니다.

안드로이드에 대한 한 가지 사실을 모르기 때문에이 패키지를 사용할 수 있는지 모르겠지만 관련 패키지를 찾는 동안이 질문을 발견했습니다. (또한 Java의 Matlab 응용 프로그램, 재미 없어). 아직 이해하지 못했다면이 방법이 도움이 될 것입니다. org.apache.commons.math3의 3.3 버전으로

2

는 GaussianCurveFitter 사용하는 경우에도 쉽게 :

 GaussianCurveFitter fitter = GaussianCurveFitter.create(); 

     WeightedObservedPoints obs = new WeightedObservedPoints(); 

     for (int index = 0; index < data.length; index++) { 
      obs.add(data[i].x, data[i].y); 
     } 

     double[] bestFit = fitter.fit(obs.toList()); 

결과는 규범이 당신의 진폭이 될 것입니다 규범, 의미, 시그마 될 것입니다.

관련 문제