Множественная линейная регрессия с аккордовым каркасом

Моя проблема

Я не могу получить ожидаемые результаты от расчета множественной линейной регрессии в рамках соглашения и math.net

Я пытаюсь написать небольшую программу для расчета констант регрессии, чтобы предсказать время жизни продукта, предоставляя результаты тестирования с вариантами продукта.

Я не очень хорош в математике за этим, но я пытаюсь архивировать, чтобы получить те же результаты, что я получаю в Microsoft Excel при использовании "Регрессия".

Как я тестирую:

public class RegressionResult
{
    public double weight1 { get; set; }
    public double weight2 { get; set; }
    public double interception { get; set; }

    public override string ToString()
    {
        return weight1 + " - " + weight2 + " - " + interception;
    }
}

public RegressionResult CalcVals(double[][] x, double[] y)
{
    var ols = new OrdinaryLeastSquares()
    {
       UseIntercept = true
    };

    MultipleLinearRegression regressiontest = ols.Learn(x, y);
    double a = regressiontest.Weights[0]; // a = 0
    double b = regressiontest.Weights[1]; // b = 0
    double c = regressiontest.Intercept;  // c = 1

    RegressionResult res = new RegressionResult();
    res.weight1 = a;
    res.weight2 = b;
    res.interception = c;
    return res;
}

Даже когда я пытаюсь использовать пример кода в разделе "Множественная линейная регрессия":
https://github.com/accord-net/framework/wiki/Regression

Мои результаты:
a = 6,63599155010096E-17
b = 1,8129866073473581E-16
с = 0,999999999999999978

После комментария от Джеймса я понял, что это правильно, потому что это 0,0,1.

Почему я проверил пример

Когда я пытаюсь воспроизвести вычисления Excel, я получаю следующие результаты:
(Ввод всегда X Range в Excel, вывод Y)

Работает

double[][] input = { 
new double[] { 1, 4 }, 
new double[] { 2, 5 }, 
new double[] { 3, 2 },
};
double[] output = new double[] { 15, 20, 10 };

Дает мне C#: Вес1: 1,2499, Вес2: 3,7499, Перехват: -1,2499 Аналогичные результаты в Excel

double[][] input = { 
new double[] { 10, 11 }, 
new double[] { 20, 21 }, 
new double[] { 30, 31 },
};
double[] output = new double[] { 15.0002, 20.0002, 25.0002 };

Дает мне вес1: -0,00001 вес2: 0,5 перехват: 9,5 Аналогичные результаты в Excel

Странно

double[][] input = { 
new double[] { 10.0002, 11.0002 }, 
new double[] { 20.0002, 21.0002 }, 
new double[] { 30.0002, 31.0002 },
};
double[] output = new double[] { 15.0002, 20.0002, 25.0002 };

вес1: 0,5 вес2: -3,8064 перехват: 10,0001
Excel дает мне: вес1: -0,00001 вес2: 0,5 перехват: 9,5

double[][] input = { 
new double[] { 10d, 11d }, 
new double[] { 20d, 21d }, 
new double[] { 30d, 31d },
};
double[] output = new double[] { 15d, 20d, 25d };

вес1: -0,4999 вес2: 0,9999, перехват: 9 Excel все еще: вес1: -0,00001 вес2: 0,5 перехват: 9,5

Полностью потерян

Опять к этому расчету:

double[][] input = { 
new double[] { 10, 11 }, 
new double[] { 20, 21 }, 
new double[] { 30, 31 },
};
double[] output = new double[] { 15.0002, 20.0002, 25.0002 };

Отлично, те же результаты в Excel и C# (вес1: -0,00001 вес2: 0,5 перехват: 9,5)
Но сейчас:

double[][] input = { 
new double[] { 10, 11 }, 
new double[] { 20, 21 }, 
new double[] { 30, 31 },
};
double[] output = new double[] { 15.0003, 20.0002, 25.0002 };

Я только что изменил 15.0002 на 15.0003 и теперь я получаю:
вес1: 28147497670,9996 вес2: -28147497670,4996 перехват: 28147497680,5}

Помогите!

Сначала я подумал, что это какая-то проблема с локализацией, но после нескольких часов попыток я не представляю, что я делаю неправильно. Я даже не знаю, ошибся ли Excel или библиотеки.

Я также попробовал:
Math.Net
Fit.MultiDim
MultipleRegression.NormalEquations
MultipleRegression.QR
MultipleRegression.SVD

Краткий пример реальных значений, которые я пытаюсь вычислить!

var xin = new[] { 
  new[] { 2.031d, 1.301d, 2.642d }, 
  new[] { 2.253d, 1.301d, 2.931d }, 
  new[] { 2.031d, 1.301d, 2.642d }, 
  new[] { 2.156d, 1.301d, 2.805d } 
};
var yin = new[] { 5.509d, 5.119d, 5.590d, 5.406d };

0 ответов

Другие вопросы по тегам