私は最近、Apache Commons の数学クラス、具体的には Levenberg-Marquardt Optimizer、CurveFitter、および GaussianFunction クラスを使用して同様のことを行いました。
データの準備に使用したコードは次のようなものでした。
// 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;
}
}
}
あなたのデータはノイズが多いとおっしゃいました。ガウス形状自体を形成するガウス分布のピークに適合させる必要があったため、推測を含めました。初期条件は非常に正確でなければなりません。私の推測が数ピクセルずれていたとしても、ピークだけでなく、データセット全体に当てはまりました。フォールバックや適合するより大きなトレンドがなければ、失敗するだけだと思います。
GaussianFunction には、それぞれ y オフセット、振幅、重心位置、およびシグマである不可解なパラメーター A、B、C、および D があります。
Androidについては何も知らないので、このパッケージを使用できるかどうかはわかりませんが、関連する質問を探しているときにこの質問を見つけました(MatlabアプリケーションをJavaで複製しています、面白くない) そして、まだ理解していない場合は、これが役立つかもしれません!