Делает любой знает об эффективном способе сделать несколько линейная регрессия в C#, где количество одновременных уравнений может быть в 1000-х (с 3 или 4 различными исходными данными). После чтения этой статьи о нескольких линейная регрессия я пытался реализовать его с матричным уравнением:
Matrix y = new Matrix(
new double[,]{{745},
{895},
{442},
{440},
{1598}});
Matrix x = new Matrix(
new double[,]{{1, 36, 66},
{1, 37, 68},
{1, 47, 64},
{1, 32, 53},
{1, 1, 101}});
Matrix b = (x.Transpose() * x).Inverse() * x.Transpose() * y;
for (int i = 0; i < b.Rows; i++)
{
Trace.WriteLine("INFO: " + b[i, 0].ToDouble());
}
Однако это не масштабируется хорошо к масштабу 1000-х уравнений из-за матричной операции инверсии. Я могу назвать язык R и использование, что, однако я надеялся, что будет чистое решение .NET, которое масштабируется к этим большим наборам.
Какие-либо предложения?
РЕДАКТИРОВАНИЕ № 1:
Я уладил использование R в настоящее время. При помощи statconn (загруженный здесь) я нашел, что это оба быстро и относительно просто в использовании этот метод. Т.е. вот маленький фрагмент кода, это действительно не много кода вообще для использования R statconn библиотека (примечание: это не весь код!).
_StatConn.EvaluateNoReturn(string.Format("output <- lm({0})", equation));
object intercept = _StatConn.Evaluate("coefficients(output)['(Intercept)']");
parameters[0] = (double)intercept;
for (int i = 0; i < xColCount; i++)
{
object parameter = _StatConn.Evaluate(string.Format("coefficients(output)['x{0}']", i));
parameters[i + 1] = (double)parameter;
}
Попробуйте Meta.Numerics
:
Meta.Numerics - это библиотека для расширенных научных вычислений в .NET Framework. Его можно использовать из C #, Visual Basic, F # или любого другого языка программирования .NET. Библиотека Meta.Numerics полностью объектно-ориентирована и оптимизирована для скорости реализации и выполнения.
Чтобы заполнить матрицу, см. Пример Конструктор ColumnVector (IList
. Он может создавать ColumnVector
из многих упорядоченных наборов вещественных чисел, включая double [] и List.
Размер инвертируемой матрицы НЕ увеличивается с увеличением количества одновременных уравнений (выборок). x.Transpose () * x - квадратная матрица, размерность которой - количество независимых переменных.