Excel Solver: нелинейный эквивалент наименьших квадратов в C # - PullRequest
4 голосов
/ 21 декабря 2011

Я работаю над приложением форм, которое сообщает на основе данных наблюдений.До разработки приложения электронные таблицы Excel использовались наряду с решателем side excel для нелинейной регрессии наименьших квадратов.Я некоторое время не учился в университете, и я могу написать его в конце концов, я сомневаюсь, что клиент хочет подождать несколько месяцев, пока я найду подходящую замену для sovler в Excel.

Так что мойвопрос в этом;Есть ли в C # эквивалент регрессионной функции нелинейных наименьших квадратов в решателе Excel?Я наблюдал данные и некоторые первоначальные предположения, основанные на наблюдаемых данных, поэтому ввод не является проблемой.Черт, даже название используемого уравнения будет хорошей отправной точкой.

Я взглянул на alglib, но не уверен, какое из них подойдет.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 21 декабря 2011

Это можно сделать с помощью библиотеки MathDotNet Iridium.

Вот пример класса 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);
3 голосов
/ 21 декабря 2011

Один из вариантов - просто использовать Excel из вашей программы на C #.Таким образом, вычисления выполняются Excel, и ваша программа может делать все, что может делать Excel.См. Как автоматизировать Microsoft Excel из Microsoft Visual C # .NET

Другой вариант - использовать одну из многих доступных библиотек математики, как указал Майкл.Есть много доступных библиотек.Конечно, вы захотите убедиться, что полученные ответы соответствуют Excel; -)

1 голос
/ 11 января 2012

Так что я в итоге укусил пулю и пошел с alglib.Пакет lsfit, в конце концов, сделал то, что я хотел, хотя это заняло у меня чертовски много времени, потому что он не читается нематематиком.

Я оставлю это здесь, чтобы любой, у кого была такая же проблема, мог найти это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...