我最近使用 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 具有神秘的参数 A、B、C 和 D,它们分别是 y 偏移、幅度、质心位置和 sigma。
我对Android一无所知,所以我不知道你是否可以使用这个包,但我在寻找相关问题时发现了这个问题(我也在用Java复制一个Matlab应用程序,不好玩),如果你还没有弄清楚,这可能会有所帮助!