Matrix ComputeThetaRegularized(Matrix x, Matrix y, Matrix theta, double lambda, int n)
        {
            var z = x * theta;
            var h = MatrixUtils.Sigmoid(z);
            var l = MatrixUtils.Identity(n).Set(0, 0, 0);

            var gradient = x.Transpose() * (h - y) + (lambda * l * theta);

            var hessian = new Matrix(x.ColumnCount, x.ColumnCount);

            for (int i = 0; i < x.RowCount; i++)
            {
                hessian += h[i, 0] * (1 - h[i, 0]) * x.GetRow(i) * x.GetRow(i).Transpose();
            }

            hessian += hessian + (lambda * l);

            var solver = new SolveEquationByGauss();

            var dTheta = solver.Compute(new SolveEquationByGaussParameter {
                A = hessian, b = -1 * gradient, EPSILON = 10e-12
            });

            return(dTheta + theta);
        }
        Matrix ComputeTetha(Matrix x, Matrix y, Matrix theta)
        {
            var z = x * theta;
            var h = MatrixUtils.Sigmoid(z);

            var gradient = x.Transpose() * (h - y);

            var hessian = new Matrix(x.ColumnCount, x.ColumnCount);

            for (int i = 0; i < x.RowCount; i++)
            {
                hessian += h[i, 0] * (1 - h[i, 0]) * x.GetRow(i) * x.GetRow(i).Transpose();
            }

            var solver = new SolveEquationByGauss();

            var dTheta = solver.Compute(new SolveEquationByGaussParameter {
                A = hessian, b = -1 * gradient, EPSILON = 10e-12
            });

            return(dTheta + theta);
        }