如何将正弦曲线拟合到Java中的数据?
我花了几天时间试图在java中运行完全相同的代码: 基于以下答案,我开始整理以下代码:如何将正弦曲线拟合到Java中的数据?,java,least-squares,trigonometry,Java,Least Squares,Trigonometry,我花了几天时间试图在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 fr
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);
}
公共双正弦拟合(双[]当前样本){
double[]half_cycle=Arrays.copyOfRange(当前_样本,175225);
双放大器=3*阵列标准(半周)/数学sqrt(2);
双频=0;
双相=0;
double[]guess=新的双[]{amp,freq,phase};
HarmonicCurveFitter CurveFitter=新的HarmonicCurveFitter(新的LevenbergMarquardTopimizer());
//具有起点的曲线系数(猜测);
对于(int i=0;i
它没有编译,也不是我想要的(即,第一个链接中的内容)
我非常感谢你的帮助。不能在Java中完成我在Python中只用几行就可以完成的事情让我发疯
附言:长期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);
}
double[]half_cycle=Arrays.copyOfRange(当前_样本,175225);
双放大器=3*阵列标准(半周)/数学sqrt(2);
双频=0;
双相=0;
double[]guess=新的双[]{amp,freq,phase};
HarmonicCurveFitter CurveFitter=HarmonicCurveFitter.create();
具有起点的曲线系数(猜测);
列表点=新的ArrayList();
对于(int i=0;iHarmonicCurveFitter
不扩展曲线过滤器
;它扩展了AbstractCurveFilter
,它没有方法addObservedPoint
GaussianFitter
、HarmonicFitter
和PolynomialFitter
是已知的CurveFitter
的扩展器,具有所需的方法。使用HarmonicFitter
见:和
编辑:
由于不推荐使用HarmonicFitter
,因此使用HarmonicCurveFitter
是正确的。由于它没有您需要的方法,请使用fit(收集点)
而不是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);
HarmonicCurveFitter curvefitt=新建HarmonicCurveFitter.create();
列表点=新的ArrayList();
对于(int i=0;i
从文件中:
默认实现使用Levenberg-Marquardt优化器
确保导入org.apache.commons.math3.fitting.WeightedObservedPoint
,org.apache.commons.math3.fittingHarmonicCurveFitter
,java.util.List
和java.util.ArrayList
另外,打印vals
不像Python那样打印每个值,而是打印指向数组的指针。使用for(double val:vals)
并分别显示每个值。问题是您必须使用HarmonicFitter
类和该类的方法-添加观测点
。
类HarmonicCurveFitter
或其父类AbstractCurveFitter
都不包含方法addObservedPoint
,会出现什么错误?-无法解析org.apache.commons.math3.fitting.HarmonicCurveFitter类中的方法addObservedPoint
-构造函数HarmonicCurveFitter无法应用于给定类型;必需:double[],int-find:org.apache.commons.math3.fitting.leastsquares.LevenbergMarquardtOptimizer-类org.apache.commons.math3.fitting.AbstractCurveFilter中的方法fit不能应用于给定类型;必需:找到java.util.Collection:没有参数HarmonicCurveFitter是什么?我似乎在任何地方都找不到这方面的参考import org.apache.commons.math3.fitting.HarmonicCurveFitter
HarmonicFitter
似乎不受欢迎。我应该使用HarmonicCurveFitter
和加权观测点
。我试过了,但也没有走得太远。你是对的,但它将以完全相同的方式工作。我将尝试找到一个未预先确定的等价物。好的,从文档中:从3.3开始。请改用HarmonicCurveFitter和WeightedObservedPoints。
因此,您可以正确使用HarmonicCurveFitter
,但由于它没有所需的方法,您应该使用fit(收集点)
来实现它!那就行了!!!我最后需要计算的是最小二乘法。我用LevenbergMarquardtOptimizer()尝试的是。以及如何获取正弦数组,而不仅仅是参数。