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

时间:2011-12-21 18:34:32

标签: c# excel math

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

所以我的问题是这个; Excel解算器的非线性最小二乘回归函数是否等效?我根据观察到的数据观察了数据和一些初步猜测,因此输入不是问题。地狱,即使是所用方程的名称也是一个很好的起点。

我看过alglib,但我不确定哪一个是合适的。

提前致谢。

3 个答案:

答案 0 :(得分:4)

您可以使用MathDotNet Iridium库执行此操作。

这是一个c#类示例:

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);

答案 1 :(得分:3)

您可以选择使用C#程序中的Excel。这样计算由Excel完成,您的程序可以执行Excel可以执行的任何操作。见How to automate Microsoft Excel from Microsoft Visual C#.NET

另一个选择是使用许多可用数学库中的一个,正如迈克尔指出的那样。有许多图书馆可供使用。当然,您需要验证您获得的答案是否与Excel匹配; - )

答案 2 :(得分:1)

所以我最终咬了一口子弹和alglib一起去了。 lsfit包最终做了我想做的事,虽然它花了很长时间,因为它不是非数学家可读的。

我将此保留在此处,以便任何有相同问题的人都可以找到它。