我想在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");
答案 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]
这有帮助吗?