簡體   English   中英

Java 中的加權線性回歸

[英]Weighted Linear Regression in Java

有誰知道 Java 中的科學/數學庫可以直接實現加權線性回歸? 類似於帶有 3 個參數並返回相應系數的函數:

linearRegression(x,y,weights)

這看起來相當簡單,所以我想它存在於某個地方。

PS)我試過 Flannigan 的圖書館: http ://www.ee.ucl.ac.uk/~mflanaga/java/Regression.html ,它有正確的想法,但似乎偶爾崩潰並抱怨我的自由度?

不是庫,但代碼已發布: 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

我個人使用了 Apache Math 庫的 org.apache.commons.math.stat.regression.SimpleRegression 類。

我還從普林斯頓大學找到了一個更輕量級的課程,但沒有測試它:

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

我也在尋找這個,但我找不到任何東西。 原因可能是您可以將問題簡化為標准回歸,如下所示:

沒有殘差的加權線性回歸可以表示為diag(sqrt(weights))y = diag(sqrt(weights))Xb其中diag(sqrt(weights))T基本上意味着將 T 矩陣的每一行乘以不同的平方根重量。 因此,沒有殘差的加權和未加權回歸之間的轉換是微不足道的。

要將具有殘差y=Xb+u的回歸轉換為沒有殘差y=Xb的回歸,您需要向 X 添加一列 - 一個只有一列的新列。

現在您知道如何簡化問題,您可以使用任何庫來解決標准線性回歸。

這是一個使用 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 的點應用了更高的權重。 我們正在最小化平方誤差,這就是我們提取權重根的原因。

這是來自 Aleadam 答案中第一個鏈接的加權線性回歸的 C# 代碼的直接 Java 端口:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM