我无法从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 };