Пример #1
0
        public GPOut Compute(Matrix <double> mTr, Matrix <double> mTeTr, Vector <double> vTrY)
        {
            var Mtr = (mTr).RowCount;

            var gpOut = new GPOut();

            var Kte = _kernel.Main(DistanceMatrix.Instance.Matrix, _length);

            if (Mtr > 0)
            {
                var Kxx_p_noise = _kernel.Main(mTr, _length);
                for (int i = 0; i < Mtr; i++)
                {
                    Kxx_p_noise[i, i] += _noise;
                }

                var svd1 = Kxx_p_noise.Svd();

                for (int i = 0; i < Mtr; i++)
                {
                    svd1.S[i] = svd1.S[i] > Double.Epsilon ? 1.0 / svd1.S[i] : 0;
                }

                var tmp = _kernel.Main(mTeTr, _length) * svd1.U;

                gpOut.mu = tmp * (svd1.S.PointwiseMultiply(svd1.U.Transpose() * (vTrY)));
                var cov = tmp * Matrix <double> .Build.DenseOfDiagonalVector(svd1.S.PointwiseSqrt());

                cov = cov * cov.Transpose();
                cov = Kte /*.SubMatrix(0,100,0,100) */ - cov;
                var svd2 = cov.Svd();
                for (int i = 0; i < Mte; i++)
                {
                    if (svd2.S[i] < Double.Epsilon)
                    {
                        svd2.S[i] = 0.0;
                    }
                }
                gpOut.proj = svd2.U * Matrix <double> .Build.DenseOfDiagonalVector(svd2.S.PointwiseSqrt());

                gpOut.sd95 = 1.98 * (gpOut.proj * gpOut.proj.Transpose()).Diagonal().PointwiseSqrt();
            }
            else
            {
                gpOut.sd95 = 1.98 * (Kte.Diagonal()).PointwiseSqrt();
                var svd = Kte.Svd();
                gpOut.proj = svd.U * Matrix <double> .Build.DenseOfDiagonalVector(svd.S.PointwiseSqrt());

                gpOut.mu = Vector <double> .Build.DenseOfArray(Enumerable.Range(0, Mte).Select(_ => 0d).ToArray());
            }


            return(gpOut);
        }
Пример #2
0
        public Svd <double> GetDefaultSvd()
        {
            Matrix <double> dmTr = MathHelper.ComputeDistanceMatrix(new[] { 0d }, new[] { 0d });

            Vector <double> v = Vector <double> .Build.DenseOfArray(new[] { 0d });

            var Kxx_p_noise = kernel.Main(dmTr, length);

            for (int i = 0; i < 1; i++)
            {
                Kxx_p_noise[i, i] += noise;
            }

            return(Kxx_p_noise.Svd());
        }
Пример #3
0
 public GP(IMatrixkernel kernel, double length, double noise)
 {
     this._kernel = kernel;
     this._length = length;
     this._noise  = noise;
     this._Kte    = kernel.Main(DistanceMatrix.Instance.Matrix, length);
 }
Пример #4
0
        public GPOut Predict(double[] trainingPointsX, double[] trainingPointsY, params double[] TestPointsX)
        {
            if (TestPointsX.Count() == 1)
            {
                Kte = kernel.Main(Matrix <double> .Build.Dense(1, 1), length);
            }
            else
            {
                Kte = kernel.Main(DistanceMatrix.Instance.Matrix.SubMatrix(0, TestPointsX.Count(), 0, TestPointsX.Count()), length);
            }
            var svd1 = Task.Run(() =>
                                trainingPointsX.Length > 0 ? Update(trainingPointsX, trainingPointsY) : GetDefaultSvd());

            var          gpOut = new GPOut();
            Svd <double> svd;

            (gpOut.mu, svd) = Task.Run(() =>
            {
                if (trainingPointsX.Count() > 0)
                {
                    return(Evaluate(TestPointsX, trainingPointsX.ToArray(), trainingPointsY.ToArray(), kernel, length, svd1.Result, Kte));
                }
                else
                {
                    return(Vector <double> .Build.DenseOfArray(Enumerable.Range(0, TestPointsX.Count()).Select(_ => 0d).ToArray()), Kte.Svd());
                    //gpOut.sd95 = 1.98 * (Kte.Diagonal()).PointwiseSqrt();
                }
            }).Result;

            gpOut.proj = svd.U * Matrix <double> .Build.DenseOfDiagonalVector(svd.S.PointwiseSqrt());

            gpOut.sd95 = 1.98 * (gpOut.proj * gpOut.proj.Transpose()).Diagonal().PointwiseSqrt();
            gpOut.X    = TestPointsX;

            return(gpOut);
        }
Пример #5
0
        public static (Vector <double>, Svd <double>) Evaluate(double[] testPointsX, double[] trainingPointsX, double[] trainingPointsY, IMatrixkernel kernel, double length, Svd <double> svd1, Matrix <double> Kte)
        {
            var          gpOut = new GPOut();
            Svd <double> svd;

            var             dmTeTr = MathHelper.ComputeDistanceMatrix(testPointsX, trainingPointsX.ToArray());
            var             tmp    = kernel.Main(dmTeTr, length) * svd1.U;
            Vector <double> v      = Vector <double> .Build.DenseOfEnumerable(trainingPointsY);

            var mu  = tmp * (svd1.S.PointwiseMultiply(svd1.U.Transpose() * v));
            var cov = tmp * Matrix <double> .Build.DenseOfDiagonalVector(svd1.S.PointwiseSqrt());

            cov = cov * cov.Transpose();
            cov = Kte - cov;
            svd = cov.Svd();
            for (int i = 0; i < svd.S.Count; i++)
            {
                svd.S[i] = svd.S[i] < Double.Epsilon ? 0 : svd.S[i];
            }

            return(mu, svd);
        }