C#中的多元线性回归

时间:2014-04-17 23:49:19

标签: c# math linear-regression mathnet

我想在C#中进行多元线性回归。我试图用MathNet.Numerics实现这一点,但我不断收到错误“Matrix维度必须达成2x3”。

/*****************************************************
    * MathNet.Numerics Multiple linear regression test *
    ****************************************************/

var ydata = new double[] { 15, 20, 25, 55, 95 };
var xdata = new[] { new[] { 1.0, 4.0 }, new[] { 2.0, 5.0 }, new[] { 3.0, 6.0 } };

var x = DenseMatrix.OfColumns(2, 3, xdata);
var y = new DenseVector(ydata);

var p = x.QR().Solve(y); // error: matrix dimensions must agree 2x3
var a = p[0];
var b = p[1];

MessageBox.Show(a.ToString(), "Test");
MessageBox.Show(b.ToString(), "Test");

1 个答案:

答案 0 :(得分:2)

在这种情况下异常文本非常糟糕,我们应该解决这个问题。

导致此失败的原因有两个:

  • 具有3个未知数但只有2个方程/样本(2x3矩阵)的系统定义不明确;对这样的问题应用回归实际上没有任何意义,因为存在无数个精确解。

  • 对于这两个样本/方程式,右侧y实际上有5个值(而不是2个,以匹配每个样本)

使用v3中提供的新Fit类可能更容易。例如,让我们使用以下示例进行普通回归:

a    b         y
1.0, 4.0  -->  15.0
2.0, 5.0  -->  20.0
3.0, 2.0  -->  10.0

找到u,v和w的问题,使

中的这些样本的误差最小化
y ~= u + a*v + b*w

使用Fit类,如下所示:

double[] p = Fit.MultiDim(
    new[] {new[] { 1.0, 4.0 }, new[] { 2.0, 5.0 }, new[] { 3.0, 2.0 }},
    new[] { 15.0, 20, 10 },
    intercept: true);
// p = [u,v,w] = [-1.25,1.25,3.75], hence y ~= -1.25 + 1.25*a + 3.75*b

使用线性代数和矩阵分解,它们看起来像:

var A = DenseMatrix.OfArray(new[,] {
           { 1.0, 1.0, 4.0 },
           { 1.0, 2.0, 5.0 },
           { 1.0, 3.0, 2.0 }});
var b = new DenseVector(new[] { 15.0, 20, 10 });
var p2 = A.Solve(b);
// p = [-1.25,1.25,3.75]

这有帮助吗?