符合框架的多元线性回归

时间:2019-08-24 09:49:22

标签: c# regression linear-regression accord.net math.net

我的问题

我无法从Accord Framework和math.net的多元线性回归计算中获得预期结果

我正在尝试编写一个小程序来计算回归常数,以通过提供带有产品变体的测试结果来预测产品的寿命。

我不是很擅长于此背后的数学运算,但是我要归档的结果是获得相同的结果,然后使用"Regression"时就可以在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
c = 0.99999999999999978

詹姆斯发表评论后,我意识到这是正确的,因为它是0,0,1。

为什么我要检查示例

当我尝试重现excel计算时,我得到以下结果:
(输入始终是Excel中的X范围,输出是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:-38064截距:10,0001
Excel给了我:weight1:-0,00001 weight2: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 };

weight1:-0,4999 weight2:0,9999,截距:9 Excel静止:weight1:-0,00001 weight2: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 个答案:

没有答案