Поскольку на прошлой неделе сделал реализацию работу с матрицами на c# — самое время ими воспользоваться. Собственно, пока что сделал только множественную линейную регрессию. Класс для работы с ней находится ВОТ ТУТ.
Для начала создаем объект множественной линейной регрессии:
var mlr = new MultipleLinearRegression();
Создаем матрицу. В примере ниже — берем ее из файла с разделителями табами для столбцов:
Matrix mFromFile = Matrix.GetMatrixFromTXT("data\\regress_data.txt", '\t');
Далее указываем, какие предикторы и зависимую переменную (столбцы) берем. Аналогично для строк (строки — первый аргумент, столбцы — второй). Получаем коэффициенты b-n для линейного уравнения y = b0x0 + b1x1 + b2x2 … + bnxn
int[] rows = Enumerable.Range(0, mFromFile.matrixBase.GetLength(0)) .Select(i => i) .ToArray(); Matrix bVector = mlr.GetBCoefficientsForMatrix(mFromFile.GetMatrixPart(rows, new int[] { 1, 2, 3 }), mFromFile.GetMatrixPart(rows, new int[] { 0 }));
Теперь мы можем получить значение зависимой переменной y по имеющимся x:
double y = mlr.GetYForVectorXs(bVector, new int[] { 1, 81, 259 });
Код реализации самой регрессии очень простой:
/// <summary> /// Get b coefficients vector (Y = b0x0 + b1x1 + b2x2 ... + bnxn) /// </summary> /// <param name="m">Matrix to get b coefficients from</param> /// <returns></returns> public Matrix GetBCoefficientsForMatrix(Matrix m, Matrix yVector) { Matrix vectorRes = null; Matrix transposed = m.Transpose(); Matrix multiplied = Matrix.MultiplyMatrices(transposed, m); Matrix inversed = multiplied.Invert(); Matrix multiplied2 = Matrix.MultiplyMatrices(inversed, transposed); vectorRes = Matrix.MultiplyMatrices(multiplied2, yVector); return vectorRes; } /// <summary> /// Get Y for vector of X's /// </summary> /// <param name="vectB"></param> /// <param name="vectX"></param> /// <returns></returns> public double GetYForVectorXs(Matrix vectB, int[] X) { double y = 0.0; for(int i = 0; i < vectB.matrixBase.GetLength(0); i++) { y += (vectB.matrixBase[i,0] * X[i]); } return y; }
Здесь мы вначале вычисляем произведение исходной матрицы предикторов и ее же транспонированной. Далее инвертируем полученную матрицу и умножаем ее на исходную транспонированную матрицу. Далее переменожаем произведение (матрицу) и вектор значений зависимой переменной (y). Ну а в методе GetYForVectorXs по иксам получаем y, к чему собственно и шли.