Множественная линейная регрессия на C#

Поскольку на прошлой неделе сделал реализацию работу с матрицами на 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, к чему собственно и шли.

Добавить комментарий