hr7913468520 发表于 2023-8-23 17:45

java 实现N次多项式回归

本帖最后由 hr7913468520 于 2023-8-23 17:48 编辑

使用的类库
org.apache.commons.math3
maven
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>
推荐工具
如果只是做学术研究用,不想写代码,这里推荐一个免费的工具 下载地址:https://welsim.com/download/



用法很简单(1-4点一遍,导入数据格式不清楚的,先随便添加两行,然后导出,在编辑导出的数据,推荐导出excel,好编辑):



java 源码
好了,回归java,话不多说直接上源码:
import com.auv.sonarjsf.bo.PointXY;
import org.apache.commons.math3.fitting.PolynomialCurveFitter;
import org.apache.commons.math3.fitting.WeightedObservedPoints;

import java.util.List;

public class Polynomial {

    public static double[] getY(double[] Y_data)
    {
      WeightedObservedPoints obs = new WeightedObservedPoints();

      for (int i = 0; i < Y_data.length; i++) {
            obs.add(i, Y_data);
      }

      PolynomialCurveFitter fitter = PolynomialCurveFitter.create(3);

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

      double[] res = new double;

      for (int i = 0; i < Y_data.length; i++) {
            res = fun(i, coeff);
      }

      return res;
    }


    public static double getY(double[] Y_data, double x)
    {
      WeightedObservedPoints obs = new WeightedObservedPoints();

      for (int i = 0; i < Y_data.length; i++) {
            obs.add(i, Y_data);
      }

      PolynomialCurveFitter fitter = PolynomialCurveFitter.create(3);

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

      return fun(x, coeff);
    }

    public static double fun3(double[] coeff, double x)
    {
      return coeff + coeff * x + coeff * x * x + coeff * x * x * x;
    }

    public static double fun(double x, double... parameters)
    {
      double res = 0.0;

      for (int i = 0; i < parameters.length; i++) {
            res = res + parameters * Math.pow(x, i);
      }
      return res;
    }
}

代码中 PolynomialCurveFitter.create(3); 的3 就是3次多项式,如下图



那么其实关键是 如果求出abcd这个数字的值。

double[] coeff = fitter.fit(obs.toList());
代码中coeff 返回的变量中就分别是 abcd四个值。

所以 y=coeff + coeff * x + coeff * x * x + coeff * x * x * x;

到这里就很好理解了。

调用示例:
double[] heading = Polynomial.getY(list_heading.stream().mapToDouble(o->o).toArray());
double[] heading 就是 做完多项式回归后的值,里面的值是相对比较平滑的,可以直接拿来就用。

A582168411 发表于 2023-8-23 17:57

谢谢分享

moruye 发表于 2023-8-23 22:22

p4885056000 发表于 2023-8-27 22:57


感谢分享,顺便学习学习

25355 发表于 2023-8-30 22:14

感谢分享,顺便学习学习

为了梦想 发表于 2023-8-31 14:34

不清楚是用来做啥的呀

hr7913468520 发表于 2023-9-1 09:25

为了梦想 发表于 2023-8-31 14:34
不清楚是用来做啥的呀

做线性拟合,线性回归用的
页: [1]
查看完整版本: java 实现N次多项式回归