public float ComputeCost(IVector th, float lambda)
 {
     using (var h0 = _feature.Multiply(th))
         using (var h1 = h0.Column(0))
             using (var h = h1.Sigmoid())
                 using (var hLog = h.Log())
                     using (var t = _target.Clone()) {
                         var a = _target.DotProduct(hLog);
                         t.Multiply(-1f);
                         t.Add(1f);
                         h.Multiply(-1f);
                         h.Add(1f);
                         var b   = t.DotProduct(hLog);
                         var ret = -(a + b) / _feature.RowCount;
                         if (lambda != 0f)
                         {
                             ret += th.AsIndexable().Values.Skip(1).Select(v => v * v).Sum() * lambda / (2 * _feature.RowCount);
                         }
                         return(ret);
                     }
 }
Beispiel #2
0
        public IVector SolveU(IVector x, bool UseDiagonal)
        {
            //проверка корректности
            if (this.Size != x.Size)
            {
                throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции SolveU");
            }
            IVector result = (IVector)x.Clone();
            int     jCol;
            var     di = this.Diagonal;

            if (this.isSymmetric)
            {
                result = this.SolveLT(x, UseDiagonal);
            }
            else
            {
                for (int i = Size - 1; i >= 0; i--)
                {
                    for (int j = ig[i + 1] - 1; j >= ig[i]; j--)
                    {
                        jCol = jg[j];
                        if (jCol > i)
                        {
                            result[i] -= al[j] * result[jCol];
                        }
                        else
                        {
                            break;
                        }
                    }
                    if (UseDiagonal == true && extraDiagVal == 0)
                    {
                        result[i] /= di[i];
                    }
                }
            }
            return(result);
        }
        public IMatrix Minus(IMatrix rhs)
        {
            Debug.Assert(RowCount == rhs.RowCount);
            Debug.Assert(ColCount == rhs.ColCount);

            HashSet <int> allRows = new HashSet <int>();

            foreach (int k in mInternal.Keys)
            {
                allRows.Add(k);
            }
            foreach (int k in rhs.RowKeys)
            {
                allRows.Add(k);
            }

            IMatrix result = this.Zero(mRowKeys, mColKeys, mDefaultVal);

            foreach (int k in allRows)
            {
                IVector row1 = this[k];
                IVector row2 = rhs[k];
                if (row1 == null)
                {
                    result[k] = row2.Multiply(-1);
                }
                else if (row2 == null)
                {
                    result[k] = row1.Clone();
                }
                else
                {
                    result[k] = row1.Minus(row2);
                }
            }

            return(result);
        }
Beispiel #4
0
        public bool InitMethod(ILinearOperator A, IVector x0, IVector b, bool malloc = false, IFactorization Factorizer = null)
        {
            if (malloc)
            {
                x = new Vector(x0.Size);
            }
            else
            {
                x = x0;
            }

            xk              = x0.Clone();
            this.x0         = x0;
            this.b          = b;
            this.A          = A;
            this.Factorizer = Factorizer;

            At          = A.Transpose;
            norm_b      = b.Norm;
            currentIter = 0;

            if (Factorizer != null)
            {
                r  = Factorizer.UTransposeSolve(At.Multiply(Factorizer.LTransposeSolve(Factorizer.LSolve(b.Add(A.Multiply(x0), -1)))));
                z  = r.Clone();
                xk = Factorizer.UMult(x0);
            }
            else
            {
                r = At.Multiply(b).Add(At.Multiply(A.Multiply(x0)), -1);
                z = r.Clone();
            }


            dotproduct_rr = r.DotProduct(r);
            init          = true;
            return(init);
        }
Beispiel #5
0
        public IVector <T> Minimize(IFunctional <T> objective, IParametricFunction <T> function, IVector <T> initialParameters, IVector <T> minimumParameters = default,
                                    IVector <T> maximumParameters = default)
        {
            var         k     = 0;
            var         la    = LinearAlgebra.Value;
            IVector <T> xPrev = initialParameters.Clone() as IVector <T>;
            IVector <T> xNew  = initialParameters.Clone() as IVector <T>;

            var normalDist = new Normal(Mean, StdDev);
            T   prevValue  = objective.Value(function.Bind(xPrev));

            do
            {
                var t = 20d / Math.Log(k, Math.E);

                for (int i = 0; i < xPrev.Count; i++)
                {
                    var nR = normalDist.Sample() * t;
                    xNew[i] = la.Sum(xPrev[i], la.Cast(nR));
                }

                this.ApplyMinimumAndMaximumValues(minimumParameters, maximumParameters, xNew, la);

                var newValue = objective.Value(function.Bind(xNew));

                var sub = la.Sub(newValue, prevValue);

                if (la.Compare(sub, la.GetZeroValue()) == -1) // || la.Exp(la.Mult(la.Cast(-1/t), sub)) >= rand.NextDouble())
                {
                    prevValue = newValue;
                    xPrev     = xNew.Clone() as IVector <T>;
                }
            } while ((MaxIter.HasValue && MaxIter > k++ && la.Compare(prevValue, Eps) == 1) || (!MaxIter.HasValue && la.Compare(prevValue, Eps) == 1));

            return(xPrev);
        }
        //прямой ход
        public IVector LSolve(IVector vector, bool UseDiagonal)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }
            double sum    = 0;
            var    result = vector.Clone();

            for (int i = 0; i < Size; i++)
            {
                var ia1 = ia[i];
                var ia2 = ia[i + 1];
                int j;
                sum = 0;
                for (; ja[ia1] < i && ia1 < ia2; ia1++)
                {
                    j    = ja[ia1];
                    sum += result[j] * a[ia1];
                }
                if (i == ja[ia1] && ia1 < ia2)
                {
                    result[i] = UseDiagonal ? (result[i] - sum) / a[ia1] : result[i] - sum;
                }
                else
                {
                    throw new ArgumentNullException(nameof(a));
                }
            }
            return(result);
        }
        //обратный ход с транспонированием
        public IVector USolveTranspose(IVector vector, bool UseDiagonal)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }
            var result = vector.Clone();
            var di     = Diagonal;

            for (int i = 0; i < Size; i++)
            {
                var ia1 = ia[i];
                var ia2 = ia[i + 1] - 1;
                int j;
                di[i] = UseDiagonal ? di[i] : 1.0;
                for (; ja[ia2] > i && ia1 < ia2; ia2--)
                {
                    j          = ja[ia2];
                    result[j] -= result[i] * a[ia2] / di[i];
                }
                if (i == ja[ia2] && ia1 <= ia2)
                {
                    result[i] = result[i] / di[i];
                }
                else
                {
                    throw new ArgumentNullException();
                }
            }
            return(result);
        }
        //обратный ход
        public IVector USolve(IVector vector, bool UseDiagonal)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }
            var result = vector.Clone();

            for (int i = Size - 1; i >= 0; i--)
            {
                var    ia1 = ia[i];
                var    ia2 = ia[i + 1] - 1;
                int    j;
                double sum = 0;
                for (j = ja[ia2]; j > i && ia1 < ia2; ia2--)
                {
                    j    = ja[ia2];
                    sum += result[j] * a[ia2];
                }
                j = ja[ia2];
                if (i == j && ia1 <= ia2)
                {
                    result[i] = UseDiagonal ? (result[i] - sum) / a[ia2] : result[i] - sum;
                }
                else
                {
                    throw new ArgumentNullException(nameof(a));
                }
            }
            return(result);
        }
Beispiel #9
0
        public bool InitMethod(ILinearOperator A, IVector x0, IVector b, bool malloc = false)
        {
            if (malloc)
            {
                x = new Vector(x0.Size);
            }
            else
            {
                x = x0;
            }

            xk                 = x0.Clone();
            this.b             = b;
            this.A             = A;
            norm_b             = b.Norm;
            currentIter        = 0;
            r_prev             = A.LSolve(b.Add(A.Multiply(xk), -1), true);
            r0                 = r_prev.Clone();
            z                  = A.USolve(r_prev.Clone(), true);
            dotproduct_rr      = r_prev.DotProduct(r_prev);
            dotproduct_rprevr0 = dotproduct_rr;
            init               = true;
            return(init);
        }
Beispiel #10
0
        //прямой ход с транспонированным нижним треугольником
        public IVector LSolveTranspose(IVector vector, bool UseDiagonal)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }
            var result = vector.Clone();
            var di     = Diagonal;

            for (int i = Size - 1; i >= 0; i--)
            {
                var ia1 = ia[i];
                var ia2 = ia[i + 1];
                int j;
                di[i] = UseDiagonal ? di[i] : 1.0;
                for (; ja[ia1] < i && ia1 < ia2; ia1++)
                {
                    j          = ja[ia1];
                    result[j] -= result[i] * a[ia1] / di[i];
                }
                if (i == ja[ia1] && ia1 < ia2)
                {
                    result[i] = result[i] / di[i];
                }
                else
                {
                    throw new ArgumentNullException("matrix[i,i]=0, i = " + i.ToString(), nameof(a));
                }
            }
            return(result);
        }
Beispiel #11
0
        /// <summary>
        /// Решение СЛАУ стабилизированным методом бисопряжённых градиентов
        /// </summary>
        /// <param name="A">Матрица СЛАУ</param>
        /// <param name="b">Ветор правой части</param>
        /// <param name="Initial">Ветор начального приближения</param>
        /// <param name="Precision">Точность</param>
        /// <param name="Maxiter">Максимальное число итераций</param>
        /// <returns>Вектор x - решение СЛАУ Ax=b с заданной точностью</returns>

        public IVector Solve(IPreconditioner Preconditioner, IMatrix A, IVector b, IVector Initial, double Precision, int Maxiter, ILogger Logger)
        {
            Logger.WriteNameSolution("BSGstab", Preconditioner.getName());
            string start = DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff");

            Logger.setMaxIter(Maxiter);
            IVector x = (IVector)Initial.Clone();

            IVector r  = b.Add(A.Mult(Initial), 1, -1);
            IVector r0 = r.Clone() as IVector;

            double opo = 1, po = 1, alpha = 1, w = 1, beta, normR;

            IVector p = new SimpleVector(b.Size);
            IVector v = new SimpleVector(b.Size);
            IVector y, h, s, z, t;

            normR = r.Norm / b.Norm;

            for (int iter = 0; iter < Maxiter && normR > Precision; iter++)
            {
                po    = r0.ScalarMult(r);
                beta  = (po / opo) * (alpha / w);
                p     = r.Add(p.Add(v, 1, -w), 1, beta);
                y     = Preconditioner.SolveL(Preconditioner.SolveU(p));
                v     = A.Mult(y);
                alpha = po / r0.ScalarMult(v);
                h     = x.Add(y, 1, alpha);

                s     = r.Add(v, 1, -alpha);
                z     = Preconditioner.SolveL(Preconditioner.SolveU(s));
                t     = A.Mult(z);
                w     = (Preconditioner.SolveL(t).ScalarMult(Preconditioner.SolveL(s))) / (Preconditioner.SolveL(t).ScalarMult(Preconditioner.SolveL(t)));
                x     = h.Add(z, 1, w);
                r     = s.Add(t, 1, -w);
                opo   = po;
                normR = r.Norm / b.Norm;
                Factory.Residual.Add(normR);
                Logger.WriteIteration(iter, normR);
                if (double.IsNaN(normR) || double.IsInfinity(normR))
                {
                    Logger.WriteSolution(x, Maxiter, b.Add(A.Mult(x), -1, 1).Norm);
                    Logger.WriteTime(start, DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff"));
                    throw new CantSolveException();
                }
            }
            Logger.WriteSolution(x, Maxiter, b.Add(A.Mult(x), -1, 1).Norm);
            Logger.WriteTime(start, DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff"));
            return(x);

            /*
             * if (b.Norm == 0)
             *  return x;
             *
             * double alpha = 0.0, beta = 0.0, gamma = 0.0;
             *
             * IVector r0 = b.Add(A.Mult(Initial), 1, -1); //r_0 = f - Ax_0
             * r0 = Preconditioner.SolveL(r0);//r_0 = L(-1)(f - Ax_0)
             *
             * IVector z = Preconditioner.SolveU(r0);//z_0 = U(-1)r_0
             *
             * IVector r = (IVector)r0.Clone(); // r = r_0
             *
             * IVector p = new SimpleVector(b.Size);
             * IVector LAUz = new SimpleVector(b.Size);
             * IVector LAUp = new SimpleVector(b.Size);
             *
             * double r_r = 0.0, r_r_1 = 0.0;
             *
             * double normR = r.Norm / b.Norm;
             *
             * for (int iter = 0; iter < Maxiter && normR > Precision; iter++)
             * {
             *  r_r = r0.ScalarMult(r);//(r(k-1),r0)
             *
             *  LAUz = Preconditioner.SolveL(A.Mult(Preconditioner.SolveU(z)));//L(-1)AU(-1)z(k-1)
             *
             *  alpha = r_r / r0.ScalarMult(LAUz);//alpha = (r(k-1),r0)/(r0,L(-1)AU(-1)z(k-1))
             *
             *  p = r.Add(LAUz, 1, -alpha);//pk = r(k-1) - alpha * L(-1)AU(-1)z(k-1)
             *
             *  LAUp = Preconditioner.SolveL(A.Mult(Preconditioner.SolveU(p)));//L(-1)AU(-1)p(k)
             *
             *  gamma = p.ScalarMult(LAUp) / LAUp.ScalarMult(LAUp);//gamma = (p(k),L(-1)AU(-1)p(k))/(L(-1)AU(-1)p(k),L(-1)AU(-1)p(k))
             *
             *  x.Add(z, 1, alpha, true);//xk = x(k-1) + alpha(k) * z(k-1)
             *  x.Add(p, 1, gamma, true);//xk = x(k-1) + gamma(k) * p(k)
             *
             *  r_r_1 = r0.ScalarMult(r);//(r(k-1),r0)
             *
             *  r = p.Add(LAUp, 1, -gamma);//rk = p(k) - gamma(k) * L(-1)AU(-1)p(k)
             *
             *  r_r = r0.ScalarMult(r);//(r(k), r0)
             *
             *  beta = (r_r * alpha) / (r_r_1 * gamma);//beta = ((r(k),r0) * alpha(k))/((r(k-1),r0) * omega(k-1))
             *
             *  z = r.Add(z, 1, beta);//z(k) = r(k) + beta(k) * z(k-1)
             *  z.Add(LAUz, 1, -beta * gamma, true);//z(k) = z(k) - beta(k) * gamma(k) * L(-1)AU(-1)z(k-1)
             *
             *  normR = r.Norm / b.Norm;
             *
             *  Factory.Residual.Add(normR);
             *  Logger.WriteIteration(iter, normR);
             * }
             * x = Preconditioner.SolveU(x);//x = U(-1)x
             * Logger.WriteSolution(x, Maxiter);
             * Logger.WriteTime(start, DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff"));
             * return x;
             */
        }
Beispiel #12
0
        /// <summary>
        /// Решение СЛАУ методом локально-оптимальной схемы
        /// </summary>
        /// <param name="preconditioner">Матрица СЛАУ</param>
        /// <param name="b">Ветор правой части</param>
        /// <param name="Initial">Ветор начального приближения</param>
        /// <param name="Precision">Точность</param>
        /// <param name="Maxiter">Максимальное число итераций</param>
        /// <returns>Вектор x - решение СЛАУ Ax=b с заданной точностью</returns>
        public IVector Solve(IPreconditioner preconditioner, IMatrix A, IVector b, IVector Initial, double Precision, int Maxiter, ILogger Logger)
        {
            Logger.WriteNameSolution("LOS", preconditioner.getName());
            string start = DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff");

            Logger.setMaxIter(Maxiter);
            IVector x = Initial.Clone() as IVector;

            double alpha = 0.0, beta = 0.0;

            IVector r = b.Add(A.Mult(Initial), 1, -1);    //r_0 = f - Ax_0

            r = preconditioner.SolveL(r);                 // r_0 = L^-1 * (f - Ax_0)

            IVector Ar, z = preconditioner.SolveU(r);     // z_0 = U^-1 * r_0
            IVector p = preconditioner.SolveL(A.Mult(z)); // p_0 = L^-1 * Az_0

            double p_r = 0.0, p_p = 0.0;

            double scalRR = r.ScalarMult(r);
            double normR  = Math.Sqrt(scalRR) / b.Norm;

            for (int iter = 0; iter < Maxiter && normR > Precision; iter++)
            //for (int iter = 0; iter < Maxiter && ; iter++)
            {
                p_r   = p.ScalarMult(r); //(p_k-1,r_k-1)
                p_p   = p.ScalarMult(p); //(p_k-1,p_k-1)
                alpha = p_r / p_p;

                x.Add(z, 1, alpha, true);                                     // x_k = x_k-1 + alfa_k*z_k-1

                r.Add(p, 1, -alpha, true);                                    // r_k = r_k-1 - alfa_k*p_k-1

                Ar = preconditioner.SolveL(A.Mult(preconditioner.SolveU(r))); //Ar_k = L^-1 * A * U^-1 * r_k
                //Ar = A.SolveU(r);
                //Ar = AA.Mult(Ar);
                //Ar = A.SolveL(Ar);

                beta = -(p.ScalarMult(Ar) / p_p);

                z = preconditioner.SolveU(r).Add(z, 1, beta); //z_k = U^-1 * r_k + beta_k*z_k-1
                p = Ar.Add(p, 1, beta);                       // p_k = L^-1 * A * U^-1 * r_k + beta_k*p_k-1

                if (scalRR == 0)
                {
                    Logger.WriteSolution(x, Maxiter, b.Add(A.Mult(x), -1, 1).Norm);
                    Logger.WriteTime(start, DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff"));
                    throw new DivideByZeroException("Division by 0");
                }
                scalRR = r.ScalarMult(r);

                normR = Math.Sqrt(scalRR) / b.Norm;
                Factory.Residual.Add(normR);
                Logger.WriteIteration(iter, normR);

                if (double.IsNaN(normR) || double.IsInfinity(normR))
                {
                    Logger.WriteSolution(x, Maxiter, b.Add(A.Mult(x), -1, 1).Norm);
                    Logger.WriteTime(start, DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff"));
                    throw new CantSolveException();
                }
            }
            Logger.WriteSolution(x, Maxiter, b.Add(A.Mult(x), -1, 1).Norm);
            Logger.WriteTime(start, DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff"));
            return(x);
        }
Beispiel #13
0
 public Centroid(IVector data)
 {
     _data.Add(data);
     Center = data.Clone();
 }
Beispiel #14
0
 public Size(IVector vector)
 {
     Vector = vector.Clone();
 }
Beispiel #15
0
 IVector IPreconditioner.SolveU(IVector v) => v.Clone() as IVector;
Beispiel #16
0
 IVector IPreconditioner.MultU(IVector v) => v.Clone() as IVector;
Beispiel #17
0
 public IVector SolveU(IVector x) => x.Clone() as IVector;
Beispiel #18
0
 public IVector MultU(IVector x) => x.Clone() as IVector;
Beispiel #19
0
 public Position(IVector vector)
 {
     Vector = vector.Clone();
 }
Beispiel #20
0
        /// <summary>
        /// Решение СЛАУ методом сопряженных градиентов
        /// </summary>
        /// <param name="A">Матрица СЛАУ</param>
        /// <param name="b">Ветор правой части</param>
        /// <param name="Initial">Ветор начального приближения</param>
        /// <param name="Precision">Точность</param>
        /// <param name="Maxiter">Максимальное число итераций</param>
        /// <returns>Вектор x - решение СЛАУ Ax=b с заданной точностью</returns>
        public IVector Solve(IPreconditioner Preconditioner, IMatrix A, IVector b, IVector Initial, double Precision, int Maxiter, ILogger Logger)
        {
            Logger.WriteNameSolution("MSG", Preconditioner.getName());
            string start = DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff");

            Logger.setMaxIter(Maxiter);
            IVector x = Preconditioner.MultU(Initial);

            double scalAzZ, scalRR, alpha, beta = 1.0;

            IVector r = b.Add(A.Mult(Initial), 1, -1);

            r = Preconditioner.T.SolveL(Preconditioner.SolveL(r));
            IVector Az, Atz, z = A.Transpose.Mult(r);

            z = Preconditioner.T.SolveU(z);

            r      = z.Clone() as IVector;
            scalRR = r.ScalarMult(r);
            double normR = Math.Sqrt(scalRR) / b.Norm;

            for (int iter = 0; iter < Maxiter && normR > Precision && beta > 0; iter++)
            {
                Az = Preconditioner.SolveU(z);

                Atz = A.Mult(Az);
                Atz = Preconditioner.T.SolveL(Preconditioner.SolveL(Atz));
                Az  = A.Transpose.Mult(Atz);
                Az  = Preconditioner.T.SolveU(Az);

                scalAzZ = Az.ScalarMult(z);

                if (scalAzZ == 0)
                {
                    Logger.WriteSolution(x, Maxiter, b.Add(A.Mult(x), -1, 1).Norm);
                    Logger.WriteTime(start, DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff"));
                    throw new DivideByZeroException("Division by 0");
                }

                alpha = scalRR / scalAzZ;

                x.Add(z, 1, alpha, true);
                r.Add(Az, 1, -alpha, true);

                beta = scalRR;
                if (scalRR == 0)
                {
                    Logger.WriteSolution(x, Maxiter, b.Add(A.Mult(x), -1, 1).Norm);
                    Logger.WriteTime(start, DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff"));
                    throw new DivideByZeroException("Division by 0");
                }
                scalRR = r.ScalarMult(r);
                beta   = scalRR / beta;

                z     = r.Add(z, 1, beta);
                normR = Math.Sqrt(scalRR) / b.Norm;
                Factory.Residual.Add(normR);
                Logger.WriteIteration(iter, normR);

                if (double.IsNaN(normR) || double.IsInfinity(normR))
                {
                    x = Preconditioner.SolveU(x);
                    Logger.WriteSolution(x, Maxiter, b.Add(A.Mult(x), -1, 1).Norm);
                    Logger.WriteTime(start, DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff"));
                    throw new CantSolveException();
                }
            }
            ;
            x = Preconditioner.SolveU(x);
            Logger.WriteSolution(x, Maxiter, b.Add(A.Mult(x), -1, 1).Norm);
            Logger.WriteTime(start, DateTime.Now.ToString("dd.MM.yyyy hh:mm:ss:fff"));
            return(x);
        }