Java算法一:线性回归方程式拟合数据曲线及预测数据

摘要

        在Java中,使用线性回归算法,基于已有的数据拟合出回归方式式趋势图,及预测数据。

        该算法,可通过传入项数的最高次N,来拟合出对应的二元N次方程式。得到方程式以后,可通过传入X数据,来计算出对应的Y轴数据。

package com.unkown.orchestrator.controller;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.math3.fitting.PolynomialCurveFitter;
import org.apache.commons.math3.fitting.WeightedObservedPoints;

import java.lang.reflect.Array;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description: 
 * @author:lvxiaobu
 * @date:2023/8/1 13:06
 */
public class PolynomialRegression {

    private PolynomialCurveFitter fitter; //最高项次数
    private double[] coefficients; // 各项数的常数值

    public PolynomialRegression(int degree) {
        fitter = PolynomialCurveFitter.create(degree);
    }

    public void fit(List<Double> xData, List<Double> yData) {
        WeightedObservedPoints points = new WeightedObservedPoints();
        for (int i = 0; i < xData.size(); i++) {
            points.add(xData.get(i), yData.get(i));
        }

        // 计算各项的常数项,如 y=ax^2 + bx +c 中的a、b、c
        coefficients = fitter.fit(points.toList());

        // 输出拟合后的公式
        String fun = "f(x) = ";
        for (int i = coefficients.length - 1; i >= 0; i--) {
            String add = coefficients[i] > 0 ? "+" : "";
            String x = i > 0 ? "x^" + i : "";
            if (i == coefficients.length - 1) {
                fun += (coefficients[i] + x);
            } else {
                fun += (add + coefficients[i] + x);
            }
        }
        System.out.println("拟合公式为:"+fun);
    }

    /**
     * @Description: 基于方程式 及 传入的X数据,计算对应的Y轴数据
     * @author:lvxiaobu
     * @date:2023/8/1 13:18
     */
    public List<Double> predict(List<Double> preX) {
        DecimalFormat df = new DecimalFormat("#.00");
        List<Double> preY = new ArrayList<>();
        for (int index = 0;index < preX.size(); index++){
            double y = (double) 0;
            for (int i = 0; i < coefficients.length; i++) {
                y += coefficients[i] * Math.pow(preX.get(index), i);
            }
            y = Double.parseDouble(df.format(y));
            preY.add(y);
        }

        return preY;
    }

    public static void main(String[] args) {
        // 提供已有数据
        double[] xData = {2, 4, 6, 8, 10,12,14};
        List<Double> xDatas = Arrays.stream(xData).boxed().collect(Collectors.toList());
        double[] yData = {11.20, 13.40, 17.60, 24.80, 30, 38,49,52};
        List<Double> yDatas = Arrays.stream(yData).boxed().collect(Collectors.toList());

        // 声明生成的线性回归方程式的最高项次数
        PolynomialRegression regression = new PolynomialRegression(2); // 生成
        regression.fit(xDatas, yDatas); // 计算方程式中的各项的常数值.如 y=ax^2 + bx +c 中的a、b、c

        // 提供需要基于方程式计算的x数据
        double[] preXData = {2, 4, 6, 8, 10,12,14,16,18,20};
        List<Double> preXDatas = Arrays.stream(preXData).boxed().collect(Collectors.toList());
        // 预测Y轴对应数据
        List<Double> preY = regression.predict(preXDatas);
        System.out.println(JSONObject.toJSONString(preY));
    }
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一元线性回归是一种用于建立变量之间线性关系的统计模型。为了实现一元线性回归算法决策程序,可以使用Java编写以下步骤: 1. 收集数据:收集一组已知的自变量和因变量的数据,这些数据将用于训练模型。 2. 数据预处理:对数据进行预处理,包括数据清洗、缺失值处理和数据归一化等,确保数据的质量和一致性。 3. 拟合模型:根据收集到的数据,通过最小二乘法拟合出一条最佳拟合直线,即使得自变量和因变量之间误差平方和最小的直线。 4. 模型评估:通过计算相关指标(如均方差、决定系数等)来评估模型的性能和可靠性。 5. 预测未知数据:使用训练好的模型对未知的自变量进行预测,并得到相应的预测结果。 在Java中,可以使用Apache Commons Math库来实现一元线性回归算法。该库提供了LinearRegression类,可以方便地进行线性回归分析。以下是一个简单的示例代码: ```java import org.apache.commons.math3.stat.regression.SimpleRegression; public class LinearRegressionExample { public static void main(String[] args) { // 假设已知的一组自变量和因变量的数据 double[][] data = { {1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6} }; // 创建线性回归对象 SimpleRegression regression = new SimpleRegression(); // 增量式地拟合模型 for (double[] row : data) { double x = row[0]; // 自变量 double y = row[1]; // 因变量 regression.addData(x, y); } // 输出拟合直线的斜率和截距 double slope = regression.getSlope(); // 斜率 double intercept = regression.getIntercept(); // 截距 System.out.println("拟合直线的方程:y = " + slope + "x + " + intercept); // 预测未知数据 double unknownX = 6; // 未知的自变量 double predictedY = regression.predict(unknownX); // 预测的因变量 System.out.println("预测 x=" + unknownX + " 对应的 y:" + predictedY); } } ``` 通过以上代码,可以使用一元线性回归算法对已知数据进行拟合,得到拟合的直线方程,然后使用该方程对未知数据进行预测,得到预测结果。 请注意,对于多元线性回归,可以通过增加自变量的个数来改进模型。具体的实现方法与一元线性回归类似,只是在数据处理、模型拟合预测部分需要进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值