【问题标题】:Multiple Linear Regression in C#C# 中的多元线性回归
【发布时间】:2014-04-17 23:49:19
【问题描述】:

我想在 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");

【问题讨论】:

  • 嗯...ydata 中的 5 个值与 xdata 中的 6 (2x3) 个值不匹配?

标签: c# linear-regression math.net mathnet-numerics


【解决方案1】:

在这种情况下异常文本非常糟糕,我们应该修复它。

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

  • 具有 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]

这有帮助吗?

【讨论】:

  • 完美。谢谢。有一个小错字:“A.QR().Solve(b);”正确的?它就是这样工作的。
  • 在 v2 上,您需要明确选择 QR 分解,是的。在 v3 中,有一个新的 Matrix.Solve 方法可以自动选择一个 - 在这种情况下,它会选择更快的 LU 分解,因为矩阵是方形的。
猜你喜欢
  • 1970-01-01
  • 2010-11-23
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 2014-05-20
相关资源
最近更新 更多