吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1349|回复: 6
收起左侧

[Java 原创] java 实现N次多项式回归

[复制链接]
hr7913468520 发表于 2023-8-23 17:45
本帖最后由 hr7913468520 于 2023-8-23 17:48 编辑

使用的类库
org.apache.commons.math3
maven
[XML] 纯文本查看 复制代码
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>

推荐工具
如果只是做学术研究用,不想写代码,这里推荐一个免费的工具 下载  地址:https://welsim.com/download/
QQ截图20230823174412.png


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


java 源码
好了,回归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[i]);
        }

        PolynomialCurveFitter fitter = PolynomialCurveFitter.create(3);

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

        double[] res = new double[Y_data.length];

        for (int i = 0; i < Y_data.length; i++) {
            res[i] = 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[i]);
        }

        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[0] + coeff[1] * x + coeff[2] * x * x + coeff[3] * 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[i] * Math.pow(x, i);
        }
        return res;
    }
}


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

QQ截图20230823174522.png

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

[Java] 纯文本查看 复制代码
double[] coeff = fitter.fit(obs.toList());

代码中  coeff 返回的变量中  就分别是 abcd四个值。

所以 y=coeff[0] + coeff[1] * x + coeff[2] * x * x + coeff[3] * x * x * x;

到这里就很好理解了。

调用示例:
[Java] 纯文本查看 复制代码
double[] heading = Polynomial.getY(list_heading.stream().mapToDouble(o->o).toArray());

double[] heading 就是 做完多项式回归后的值,里面的值是相对比较平滑的,可以直接拿来就用。

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
不清楚是用来做啥的呀

做线性拟合,线性回归用的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 22:07

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表