【问题标题】:How do I fit a sine curve to my data in Java?如何将正弦曲线拟合到 Java 中的数据?
【发布时间】:2017-09-28 10:02:04
【问题描述】:

我花了几天时间试图让这个完全相同的代码在 java 中运行:How do I fit a sine curve to my data with pylab and numpy?

基于这个答案:Sine Wave Curve Fitting in Java,我已经开始整理这段代码:

public double sine_fit(double[] current_sample){
        double[] half_cycle = Arrays.copyOfRange(current_sample, 175, 225);
        double amp = 3*ArrayUtils.std(half_cycle)/Math.sqrt(2);
        double freq = 0;
        double phase = 0;
        double[] guess = new double[]{amp, freq, phase};
        HarmonicCurveFitter curveFit = new HarmonicCurveFitter(new LevenbergMarquardtOptimizer());
        //curveFit.withStartPoint(guess);
        for (int i=0; i < half_cycle.length; i++) {
            curveFit.addObservedPoint(i, half_cycle[i]);
        }
        double[] vals = curveFit.fit();
        System.out.println(vals);
    }

它无法编译,也不是我想要的(即,与第一个链接中的内容完全相同)

非常感谢一些帮助。无法在 Java 中完成我在 Python 中只用几行代码就能完成的事情,这让我发疯了。

P.S.:长期 Python 编码员,新手 Java 程序员。

更新

基于@17slim 的回答:

    double[] half_cycle = Arrays.copyOfRange(current_sample, 175, 225);
    double amp = 3*ArrayUtils.std(half_cycle)/Math.sqrt(2);
    double freq = 0;
    double phase = 0;
    double[] guess = new double[]{amp, freq, phase};
    HarmonicCurveFitter curveFit = HarmonicCurveFitter.create();
    curveFit.withStartPoint(guess);
    List<WeightedObservedPoint> points = new ArrayList<WeightedObservedPoint>();
    for (int i=0; i < half_cycle.length; i++) {
        points.add(new WeightedObservedPoint(1.0, i, half_cycle[i]));
    }
    double[] vals = curveFit.fit(points);
    for (double val: vals){
        System.out.println(val);
    }

【问题讨论】:

  • 你得到什么错误?
  • - 无法解析方法 addObservedPoint - 类 org.apache.commons.math3.fitting.HarmonicCurveFitter 中的构造函数 HarmonicCurveFitter 不能应用于给定类型;必需:double[],int 找到:org.apache.commons.math3.fitting.leastsquares.LevenbergMarquardtOptimizer - 类 org.apache.commons.math3.fitting.AbstractCurveFitter 中的方法拟合不能应用于给定类型;必需:java.util.Collection 找到:无参数
  • 什么是 HarmonicCurveFitter?我似乎无法在任何地方找到参考
  • import org.apache.commons.math3.fitting.HarmonicCurveFitter;

标签: java least-squares trigonometry


【解决方案1】:

HarmonicCurveFitter 不扩展CurveFitter;它扩展了AbstractCurveFitter,它没有方法addObservedPointGaussianFitterHarmonicFitterPolynomialFitterCurveFitter 的已知扩展程序,具有所需的方法。使用HarmonicFitter

请参阅:CurveFitterHarmonicCurveFitter

编辑: 由于不推荐使用HarmonicFitter,因此使用HarmonicCurveFitter 是正确的。由于它没有您需要的方法,请使用fit(Collection&lt;WeightedObservedPoint&gt; points) 而不是addObservedPoint

改为:

HarmonicCurveFitter curveFit = new HarmonicCurveFitter.create();
List<WeightedObservedPoint> points = new ArrayList<WeightedObservedPoint>();
for (int i=0; i < half_cycle.length; i++) {
    points.add(new WeightedObservedPoint(1.0, i, half_cycle[i]));
}
double[] vals = curveFit.fit(points);

来自文档:

默认实现使用 Levenberg-Marquardt 优化器。

确保导入org.apache.commons.math3.fitting.WeightedObservedPointorg.apache.commons.math3.fittingHarmonicCurveFitterjava.util.Listjava.util.ArrayList

此外,打印vals 不会像在 Python 中那样打印每个值,它会打印指向数组的指针。使用for (double val: vals) 并单独显示每个值。

【讨论】:

  • HarmonicFitter 似乎已被弃用。我应该使用HarmonicCurveFitterWeightedObservedPoints。我试过了,也没有走得太远。
  • 你是对的,但它的工作方式完全相同。我会尝试找到一个未弃用的等价物。
  • 好的,来自文档:As of 3.3. Please use HarmonicCurveFitter and WeightedObservedPoints instead.
  • 所以,你使用HarmonicCurveFitter是正确的,但是由于它没有所需的方法,你应该用fit(Collection&lt;WeightedObservedPoint&gt; points)来实现它
  • 太棒了!这样可行!!!最后认为我需要弄清楚的是最小二乘步骤。我正在尝试使用LevenbergMarquardtOptimizer()。以及如何取回正弦数组,而不仅仅是参数。
【解决方案2】:

问题是您必须使用HarmonicFitter 类和该类的方法 - addObservedPoint。 类HarmonicCurveFitter 和他的父类AbstractCurveFitter 都不包含方法addObservedPoint

【讨论】:

    猜你喜欢
    • 2019-09-04
    • 2014-01-23
    • 2019-04-05
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多