C# 数学.Net数值计算中的多元回归

C# 数学.Net数值计算中的多元回归,c#,linear-regression,math.net,mathnet-numerics,C#,Linear Regression,Math.net,Mathnet Numerics,我使用math.net回归方法实现了简单的单一回归,如下所示: var xdata = new double[] { 10, 20, 30, 40, 50 }; var ydata = new double[] { 15, 20, 25, 55, 95 }; var X = DenseMatrix.CreateFromColumns(new[] { new DenseVector(xdata.Length, 1), new DenseVector(xdata) }); var y = new

我使用math.net回归方法实现了简单的单一回归,如下所示:

var xdata = new double[] { 10, 20, 30, 40, 50 };
var ydata = new double[] { 15, 20, 25, 55, 95 }; 

var X = DenseMatrix.CreateFromColumns(new[] { new DenseVector(xdata.Length, 1), new DenseVector(xdata) });
var y = new DenseVector(ydata);

var p = X.QR().Solve(y);
var a = p[0];
var b = p[1];

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

问题是:我可以用这种方法应用多元回归吗?因此,我还有
zdata
数组,我想用它来进行多元回归。

如中所介绍的,这种形式在技术上已经是多元线性回归了

假设您有数据点
((uj,vj),yj)
而不是
(xj,yj)
,则在构建x矩阵时可以相应地将
x
映射到元组
u,v
。因此,单元格
X[i,j]
将被计算为
fi(uj,vj)
,而不是
fi(xj)

例如,对于由
y=a+b*u+c*v
给出的空间线的线性回归,您将得到:

  • p1=a
    f1:u,v->1
  • p2=b
    f2:u,v->u
  • p3=c
    f3:u,v->v
因此,整个系统:

|y1|   |1  u1  v1|   |a|
|y2| = |1  u2  v2| * |b|
|..|   |.. ..  ..|   |c|
|yM|   |1  uM  vM|

如果不清楚这在实际代码中是如何工作的,或者不是您想要的,请留下评论。

@christoph ruegg感谢您关于线性回归的帖子,它帮助我开始学习Math.NET。
@team16sah@g-pickardou如果您可以访问Math.NET库,我建议您使用该方法。我发现它比仅仅使用线性回归更可靠、更灵活。
在上面的例子中,代码如下所示:

        var xdata = new double[] { 10, 20, 30, 40, 50 };
        var ydata = new double[] { 15, 20, 25, 55, 95 };

        double[] p = Fit.Polynomial(xdata, ydata, 1);
        var a = p[0];
        var b = p[1];

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

然后您可以更改多项式顺序(多项式函数的第三个参数)以获得更高的精度。

Christoph,您能帮我写几行C代码吗?我想我理解这里的概念是xj不是一个标量,而是一个向量本身(如您所写的tuple),但我无法理解实际准备输入数据的方式。ThxSure。你能选择一个我应该在示例代码中使用的目标函数吗?可能类似于
y:(u,v)->a+b*sin(u)+c*cos(v)
?克里斯托夫,谢谢你的反馈。与此同时,我已经设法解决了这个多重情况,我不得不说Math.NET很酷!。