Решить регрессию наименьших квадратов в java

Я реализую клон pandas DataFrame на Java, и одна из функций, которые мне нужны, - это повторная выборка. Я нашел хороший способ сделать это здесь. По указанной ссылке они используют python, в частности lstsq функция из numpy, которая принимает матрицу A и вектор b точно так же, как в формулах, которые мне нужно реализовать.

Теперь я перехожу на математический веб-сайт Apache Commons, посвященный методу наименьших квадратов. и API кажется совсем не таким, как Least_squares(A, b), а чем-то совершенно другим и, кстати, очень сложным.

Я хотел бы знать, как решить нелинейную регрессию по методу наименьших квадратов в java, только передав матрицу A и вектор b, как в python.


person Santi Peñate-Vera    schedule 04.12.2016    source источник


Ответы (1)


Пакет наименьших квадратов в Apache Commons использует числовые алгоритмы минимизации, такие как Гаусса-Ньютона и Левенберга-Марквардта, для подбора нелинейной кривой (нелинейный метод наименьших квадратов).

numpy.linalg.lstsq, с другой стороны, для аппроксимации линии (линейный метод наименьших квадратов). Эквивалентом lstsq в Apache commons является SimpleRegression.

В обоих случаях у вас есть задача подбора линии y = mx + c, где x и y — известные векторы одинаковой длины, содержащие точки данных (несколько пар скалярных значений x.y). С lstsq вы должны преобразовать задачу в y = Ap, где A = [[x 1]] и p = [[m], [c]]. С SimpleRegression одним из вариантов является объединение x и y в матрицу double[][] с 2 столбцами и 1 точкой данных в строке.

Вот тот же пример, упомянутый в документах lstsq написано для SimpleRegression:

import org.apache.commons.math3.stat.regression.SimpleRegression;

public class StackOverflow {
    public static void main(String[] args) {
        // creating regression object, passing true to have intercept term
        SimpleRegression simpleRegression = new SimpleRegression(true);

        // passing data to the model
        // model will be fitted automatically by the class
        simpleRegression.addData(new double[][]{
                {0, -1},
                {1, 0.2},
                {2, 0.9},
                {3, 2.1}
        });

        // querying for model parameters
        System.out.println("slope = " + simpleRegression.getSlope());
        System.out.println("intercept = " + simpleRegression.getIntercept());
    }
}

И, конечно, вы получите тот же результат

наклон = 1,0
точка пересечения = -0,95

person Manos Nikolaidis    schedule 07.01.2017