Множественная линейная регрессия с аккордовым каркасом
Моя проблема
Я не могу получить ожидаемые результаты от расчета множественной линейной регрессии в рамках соглашения и 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 };