Полиномиальная регрессия с Apache Maths 3.6.1

Может кто-нибудь сообщить мне, как я могу выполнить полиномиальную регрессию с помощью Apache Math 3.6.1

Ниже приведены точки данных, которые я использовал для своего тестирования.

60735214881.391304  1520254800000.000000
60697824142.469570  1520258400000.000000
60651182200.208694  1520262000000.000000
60684367132.939130  1520265600000.000000
60676588613.008700  1520269200000.000000
60641816564.869570  1520272800000.000000
60604714824.233510  1520276400000.000000
60580042814.330440  1520280000000.000000
60536134542.469570  1520283600000.000000
60566323732.034780  1520287200000.000000
60578775249.252174  1520290800000.000000
60547382844.104350  1520294400000.000000
60536776546.802160  1520298000000.000000
60474342718.330440  1520301600000.000000
60452725477.286960  1520305200000.000000
60486821569.669560  1520308800000.000000
60247997139.995674  1520312400000.000000
60248432181.426090  1520316000000.000000
60217476247.373920  1520319600000.000000
60170744493.634780  1520323200000.000000

Мой код выглядит следующим образом

private void polynomialFitter(List<List<Double>> pointlist) {
        final PolynomialCurveFitter fitter = PolynomialCurveFitter.create(2);
        final WeightedObservedPoints obs = new WeightedObservedPoints();
        for (List<Double> point : pointlist) {
            obs.add(point.get(1), point.get(0));
        }
        double[] fit = fitter.fit(obs.toList());
        System.out.printf("\nCoefficient %f, %f, %f", fit[0], fit[1], fit[2]);
    }

Коэффициенты сообщаются как

Coefficient 12.910025, 0.000000, 0.000000

Но это кажется не совсем правильным. Если я использую один и тот же набор данных в онлайн-полинимальной регрессии и в арханоидная онлайн-регрессия — оба сообщают то же значение, что и 654623237474.68250993904929103762, 28.75921919628759991574, -0.00000000023885199278

Может кто-нибудь сообщить мне, что происходит не так? Я видел этот вопрос, но это мне не помогает.


person tuk    schedule 12.03.2018    source источник
comment
Обратите внимание, что данные X и Y имеют очень большие смещения и небольшие вариации, поэтому для числовой точности при возведении в квадрат или кубе значений в полиноме лично я сначала вычитал либо среднее значение, либо минимальное значение для каждого столбца. В конечном результате вы можете добавить эти значения обратно.   -  person James Phillips    schedule 13.03.2018


Ответы (2)


Ответ на этот вопрос дан в список рассылки apache-commons

Полиномиальная регрессия — это не то же самое, что подбор кривой. Чтобы выполнить полиномиальную регрессию в Commons Math, используйте класс OLSMultipleLinearRegression, используя X, X^2 и т. д. в качестве независимых переменных (как показано во второй ссылке выше).

Пример кода, как показано ниже

private OLSMultipleLinearRegression getMultipleLinearRegression(List<List<Double>> pointlist) {
    OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
    double y[] = new double[pointlist.size()];
    double x[][] = new double[pointlist.size()][2];
    int c = 0;
    for (List<Double> point : pointlist) {
        y[c] = point.get(0);
        x[c][0] = point.get(1);
        x[c][1] = Math.pow(point.get(1), 2);
        regression.newSampleData(y, x);
        c++;
    }
    System.out.printf("\tR2 = %f", regression.calculateRSquared());
    return regression;
}
person tuk    schedule 13.03.2018

С Commons Math 3.6.1 я получаю почти идентичные параметры при подгонке куба к данным, используя предложение PolynomialCurveFitter и OLSMultipleLinearRegression Тука.

Кривая дает правильную интерполяцию в диапазоне данных, но вы должны быть осторожны с экстраполяцией.

В коде PolynomialCurveFitter было вдвое меньше строк, чем в коде OLSMultipleLinearRegression.

person Tantallion    schedule 15.09.2019