9

有谁知道 Java 中有一个直接实现加权线性回归的科学/数学库?类似于函数的东西,它接受 3 个参数并返回相应的系数:

linearRegression(x,y,weights)

这看起来相当简单,所以我想它存在于某个地方。

PS)我试过弗兰尼根的图书馆:http ://www.ee.ucl.ac.uk/~mflanaga/java/Regression.html ,它有正确的想法,但似乎偶尔崩溃并抱怨我的自由度?

4

4 回答 4

15

不是库,但代码已发布: http: //www.codeproject.com/KB/recipes/LinReg.aspx (包括代码的数学解释,这是一个巨大的优势)。此外,这里似乎还有相同算法的另一种实现:http: //sin-memories.blogspot.com/2009/04/weighted-linear-regression-in-java-and.html

最后,新西兰一所大学的一个库似乎已经实现:http ://www.cs.waikato.ac.nz/~ml/weka/ (相当不错的javadocs)。具体方法描述在这里: http ://weka.sourceforge.net/doc/weka/classifiers/functions/LinearRegression.html

于 2011-04-16T04:03:09.217 回答
2

我个人使用了 Apache Math 库的 org.apache.commons.math.stat.regression.SimpleRegression 类。

我还从普林斯顿大学找到了一个更轻量级的课程,但没有测试它:

http://introcs.cs.princeton.edu/java/97data/LinearRegression.java.html

于 2012-07-10T15:16:07.927 回答
0

我也在寻找这个,但我找不到任何东西。原因可能是您可以将问题简化为标准回归,如下所示:

没有残差的加权线性回归可以表示为 diag(sqrt(weights))y = diag(sqrt(weights))Xb其中diag(sqrt(weights))T基本上意味着将 T 矩阵的每一行乘以不同的平方根权重。因此,没有残差的加权和未加权回归之间的转换是微不足道的。

要将有残差y=Xb+u的回归转换为没有残差的回归y=Xb,您需要向 X 添加一个额外的列 - 一个只有 1 个的新列。

现在您知道如何简化问题,您可以使用任何库来解决标准线性回归。

这是一个使用 Apache Commons Math 的示例:

void linearRegression(double[] xUnweighted, double[] yUnweighted, double[] weights) {
    double[] y = new double[yUnweighted.length];
    double[][] x = new double[xUnweighted.length][2];

    for (int i = 0; i < y.length; i++) {
        y[i] = Math.sqrt(weights[i]) * yUnweighted[i];
        x[i][0] = Math.sqrt(weights[i]) * xUnweighted[i];
        x[i][1] = Math.sqrt(weights[i]);
    }

    OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
    regression.setNoIntercept(true);
    regression.newSampleData(y, x);

    double[] regressionParameters = regression.estimateRegressionParameters();
    double slope = regressionParameters[0];
    double intercept = regressionParameters[1];

    System.out.println("y = " + slope + "*x + " + intercept);
}

这可以通过以下事实直观地解释:在 u=0 的线性回归中,如果您取任意点 (x,y) 并将其转换为 (x C,y C),新点的误差也会乘以C. 换句话说,线性回归已经将更高的权重应用于具有更高 x 的点。我们正在最小化平方误差,这就是我们提取权重根的原因。

于 2019-02-28T21:34:40.553 回答
0

这是 Aleadam 答案中第一个链接中用于加权线性回归的 C# 代码的直接 Java 端口:

https://github.com/lukehutch/WeightedLinearRegression.java

于 2019-11-24T11:10:27.183 回答