Excel求解器:C#中等效的非线性最小二乘法

我正在处理一个基于观测数据报告的表单应用程序。 在开发应用程序之前,使用Excel电子表格与excel求解器一起进行非线性最小二乘回归。 我已经离开了大学一段时间,最终我可能会写一个,我怀疑客户想等几个月,而我想出了一个合适的替代excel的sovler。

所以我的问题是这个。 有没有Excel求解器的非线性最小二乘回归函数的C#等价物? 我观察到的数据和一些初步的猜测基于观察到的数据,所以input不是一个问题。 地狱,甚至所用方程的名称将是一个很好的起点。

我看了alglib,但我不知道哪一个会是适当的。

提前致谢。

您可以使用MathDotNet铱星库来做到这一点。

这里是ac#类的例子:

using MathNet.Numerics.LinearAlgebra; namespace StackOverflow.Examples { public class PolynomialRegression { readonly Vector _xData; readonly Vector _yData; readonly Vector _coef; readonly int _order; public PolynomialRegression(Vector xData, Vector yData, int order) { if (xData.Length != yData.Length) { throw new IndexOutOfRangeException(); } _xData = xData; _yData = yData; _order = order; var n = xData.Length; var a = new Matrix(n, order + 1); for (var i = 0; i < n; i++) a.SetRowVector(VandermondeRow(xData[i]), i); // Least Squares |y=A(x)*c| ... tr(A)*y = tr(A)*A*c ... inv(tr(A)*A)*tr(A)*y = c // http://en.wikipedia.org/wiki/Total_least_squares var at = Matrix.Transpose(a); var y2 = new Matrix(yData, n); _coef = (at * a).Solve(at * y2).GetColumnVector(0); } Vector VandermondeRow(double x) { var row = new double[_order + 1]; for (var i = 0; i <= _order; i++) row[i] = Math.Pow(x, i); return new Vector(row); } public double Fit(double x) { return Vector.ScalarProduct(VandermondeRow(x), _coef); } public int Order { get { return _order; } } public Vector Coefficients { get { return _coef; } } public Vector XData { get { return _xData; } } public Vector YData { get { return _yData; } } } } 

这里是一个示例用法:

  var xVector = new Vector(new double[] { 1, 2, 3, 4, 5 }); var yVector = new Vector(new double[] { 10, 20, 30, 40, 50 }); var order = 2; _poly = new PolynomialRegression(xVector, yVector, order); 

你有一个select就是简单地使用C#程序中的Excel。 这样的计算是由Excel完成的,你的程序可以做任何Excel可以做的事情。 请参阅如何从Microsoft Visual C#.NET自动化Microsoft Excel

另一个select是使用许多可用的math库之一,正如Michael所指出的那样。 有很多图书馆可用。 当然你会想validation你得到的答案是否与Excel匹配;-)

所以我最终咬了子弹,并与alglib。 lsfit软件包最终做了我想要的东西,不过,由于它不是一个非math家可以读懂的东西,所以我花了很长时间。

我会把这个留在这里,让任何有同样问题的人都能find这个。