Java 最小二乘法直线拟合

最小二乘法(Least Squares Method)是一种广泛应用于数据分析和回归分析的数学方法。它通过最小化误差的平方和来找到数据的最佳拟合线。这种方法在科学研究、经济学、工程学及各类数据分析中都有着重要的应用。

本文将介绍如何在 Java 中实现最小二乘法直线拟合,并提供代码示例,帮助读者更好理解这一方法。

最小二乘法原理

假设我们有一组数据点 (x1, y1), (x2, y2), ..., (xn, yn),我们希望找到一条直线 y = mx + b 来最小化以下平方误差:

[ S = \sum_{i=1}^{n} (y_i - (mx_i + b))^2 ]

通过对 S 关于 m 和 b 分别求偏导数并设为零,可以得到以下公式来计算 m 和 b:

[ m = \frac{n(\sum_{i=1}^n x_i y_i) - (\sum_{i=1}^n x_i)(\sum_{i=1}^n y_i)}{n(\sum_{i=1}^n x_i^2) - (\sum_{i=1}^n x_i)^2} ]

[ b = \frac{(\sum_{i=1}^n y_i) - m(\sum_{i=1}^n x_i)}{n} ]

Java 代码实例

接下来,我们将在 Java 中实现上述算法。以下是完整的代码:

public class LeastSquaresRegression {

    private double m; // 斜率
    private double b; // 截距

    public void fit(double[] x, double[] y) {
        int n = x.length;

        double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;

        for (int i = 0; i < n; i++) {
            sumX += x[i];
            sumY += y[i];
            sumXY += x[i] * y[i];
            sumX2 += x[i] * x[i];
        }

        m = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
        b = (sumY - m * sumX) / n;
    }

    public double predict(double x) {
        return m * x + b;
    }

    public double getSlope() {
        return m;
    }

    public double getIntercept() {
        return b;
    }

    public static void main(String[] args) {
        double[] x = {1, 2, 3, 4, 5};
        double[] y = {2, 3, 5, 7, 11};

        LeastSquaresRegression lsr = new LeastSquaresRegression();
        lsr.fit(x, y);

        System.out.println("Slope (m): " + lsr.getSlope());
        System.out.println("Intercept (b): " + lsr.getIntercept());

        // 预测一个新值
        double newValue = 6;
        System.out.println("Prediction for x = " + newValue + ": " + lsr.predict(newValue));
    }
}

可视化

通过可视化,我们可以更好地理解拟合的效果。下面是描述数据分析过程和拟合结果的序列图和饼状图。

sequenceDiagram
    participant User
    participant Data
    participant Model
    participant Prediction

    User->>Data: 提供数据点
    Data->>Model: 转换数据
    Model->>User: 计算斜率和截距
    User->>Prediction: 进行预测
    Prediction-->>User: 输出预测结果

饼状图展示了数据集在计算过程中的构成。

pie
    title 数据分布
    "X值": 30
    "Y值": 70

结论

通过上述的 Java 实现,我们可以轻松应用最小二乘法进行直线拟合。最小二乘法不仅可以用于线性回归,也可以扩展到多项式回归和更复杂的模型。希望这篇文章能够帮助你了解最小二乘法的基本原理,并激励你在实际应用中运用这一方法进行数据分析与预测。