1

我想在 C# 中进行多元线性回归。我正在尝试使用 MathNet.Numerics 来实现这一点,但我不断收到错误消息“矩阵尺寸必须符合 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");
4

1 回答 1

2

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

有两个具体问题导致此失败:

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

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

Fit也许从 v3 中可用的新类开始更容易。例如,让我们用以下样本做一个普通的回归:

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]

这有帮助吗?

于 2014-04-18T02:43:29.380 回答