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