예제 #1
0
        public OneDObjectiveFunc(double[] Xobdata, double[] obdatay, double[] para)//matlab test
        {
            this.Xobdata = Xobdata;
            this.obdatay = obdatay;
            //this.noise = noise;
            this.para = para;

            Y = GPwithMeanfunction.GetfVactor(obdatay);
        }
예제 #2
0
        public OneDObjectiveFunc(double[,] MDXobdata, double[] obdatay, double[] para)
        {
            this.MDXobdata = MDXobdata;
            this.obdatay   = obdatay;
            //   this.noise = noise;
            this.para = para;


            Y = GPwithMeanfunction.GetfVactor(obdatay);
        }
        private static double[] GetcoveriantArray(KeyValuePair <List <double[]>, List <double[, ]> > initialclusture)
        {
            var obdataX = new double[initialclusture.Value.Count, initialclusture.Value[0].GetLength(1) - 1];
            var obdataY = new double[initialclusture.Value.Count];

            for (int i = 0; i < initialclusture.Value.Count; i++)
            {
                obdataY[i] = initialclusture.Value[i][0, initialclusture.Value[0].GetLength(1) - 1];
                for (int j = 0; j < initialclusture.Value[0].GetLength(1) - 1; j++)
                {
                    obdataX[i, j] = initialclusture.Value[i][0, j];
                }
            }
            var cov = GPwithMeanfunction.GetCovMatrix(obdataX, initialclusture.Key[2], true);

            return(cov.Reshape());
        }
        private static void GetCoveriantandInvArray(KeyValuePair <List <double[]>, List <double[, ]> > initialclusture, out double[] covarray, out double[] invarray)
        {
            var obdataX = new double[initialclusture.Value.Count, initialclusture.Value[0].GetLength(1) - 1];
            var obdataY = new double[initialclusture.Value.Count];

            for (int i = 0; i < initialclusture.Value.Count; i++)
            {
                obdataY[i] = initialclusture.Value[i][0, initialclusture.Value[0].GetLength(1) - 1];
                for (int j = 0; j < initialclusture.Value[0].GetLength(1) - 1; j++)
                {
                    obdataX[i, j] = initialclusture.Value[i][0, j];
                }
            }
            var cov = GPwithMeanfunction.GetCovMatrix(obdataX, initialclusture.Key[2], true);

            invarray = cov.inverse().Reshape();
            covarray = cov.Reshape();
        }
        public static List <double> newMDGetMeanAndVar(KeyValuePair <List <double[]>, List <double[, ]> > trainedcluster, double[] testpoint)
        {
            var testpoints = RowtoMatrix(testpoint);

            double[,] MeanStart, Xobdata;
            double[] obdatay;
            GetXfromValues(trainedcluster.Value, out Xobdata, out obdatay);

            var GPpara  = trainedcluster.Key[2];
            var Regpara = trainedcluster.Key[1];
            var mean    = GPwithMeanfunction.GetfVactor(obdatay);
            //  var cov = GPwithMeanfunction.GetCovMatrix(Xobdata, GPpara, true);
            var    cov        = trainedcluster.Key[3].Reshape(obdatay.Length, obdatay.Length, MatrixOrder.CRowMajor);
            var    kInv       = trainedcluster.Key[4].Reshape(obdatay.Length, obdatay.Length, MatrixOrder.CRowMajor);
            var    MeanAndVar = new List <double>();
            var    a          = testpoints.GetLength(0);
            double variance;
            var    h       = RowtoMatrix(CalculatRegression.gety(Xobdata, Regpara));
            var    hstarts = RowtoMatrix(CalculatRegression.gety(testpoints, Regpara));
            int    c       = Xobdata.GetLength(0) - 1;

            for (var i = 0; i <= a - 1; i++)
            {
                var XobAndTestData = GPwithMeanfunction.AddnewPoint(Xobdata, testpoints, i);
                var newcov         = GPwithMeanfunction.GetCovMatrix(XobAndTestData, GPpara, true);
                var kstart         = new double[newcov.GetLength(0) - 1, 1];
                for (var j = 0; j < newcov.GetLength(0) - 1; j++)
                {
                    kstart[j, 0] = newcov[j, newcov.GetLength(0) - 1];
                }
                var kstartT = kstart.transpose();

                //  MeanStart = (kstartT.multiply(kInv)).multiply(mean);
                if (GPpara.Length - Xobdata.GetLength(1) == 2)
                {
                    MeanStart = (kstartT.multiply(kInv)).multiply(mean);
                    var VarStart = (((kstartT.multiply(kInv)).multiply(kstart)).multiply(-1));
                    variance = VarStart[0, 0] + cov[c, c];
                }
                else //with mean fuc
                {
                    var regy = CalculatRegression.gety(testpoints, Regpara);
                    //  var regy = CalculatRegression.gety(testpoints, i, actionname)[0, 0] * GPpara[GPpara.Length - 1];
                    var regym = new double[1, 1];
                    regym[0, 0] = regy[0];
                    var fb = RowtoMatrix(CalculatRegression.gety(Xobdata, Regpara)).transpose().multiply(GPpara[GPpara.Length - 1]);
                    MeanStart = regym.add((kstartT.multiply(kInv)).multiply(mean.subtract(fb)));
                    //var VarStart = (((kstartT.multiply(kInv)).multiply(kstart)).multiply(-1));
                    //var variancestar = VarStart[0, 0] + cov[c, c];
                    var hstart = new double[1, 1];
                    hstart[0, 0] = hstarts[0, i];
                    var r   = hstart.subtract((h.multiply(kInv)).multiply(kstart));
                    var hkk = ((h.multiply(kInv)).multiply(h.transpose())).inverse();

                    //variance = variancestar + (r.transpose().multiply(hkk))[0, 0];
                    variance = cov[c, c] + (r.transpose().multiply(hkk))[0, 0];
                }
                MeanAndVar.Add(MeanStart[0, 0]);
                //
                //double sdpow = Math.Pow(sd, 2);
                double sdabsolute = Math.Sqrt(Math.Abs(variance));
                MeanAndVar.Add(sdabsolute);
            }
            return(MeanAndVar);
        }
예제 #6
0
        public double calculate(double[] x)//matlab test
        {
            var matlab = true;
            var md     = true;

            double[,] k;

            if (matlab && !md)
            {
                k = GPwithMeanfunction.SEKernel(Xobdata, x, true);
            }
            else if (matlab && md)
            {
                k = GPwithMeanfunction.SEKernel(MDXobdata, x, true);
            }
            else if (x.GetLength(0) == 2)
            {
                k = GPwithMeanfunction.SEKernel(Xobdata, x, noise);
            }
            else
            {
                k = GPwithMeanfunction.SEKernel(MDXobdata, x, noise, true);
            }


            var liknoise = Math.Exp(2 * para[3]);                                                  //MD
            var l        = Cholesky(k.divide(liknoise).add(CreatImatrix(MDXobdata.GetLength(0)))); //MD


            //var liknoise = Math.Exp(2 * para[2]);//1D
            //var l = Cholesky(k.divide(liknoise).add(CreatImatrix(Xobdata.GetLength(0))));//1D


            var y  = l.inverse();
            var l1 = y.multiply(obdatay);

            l = l.transpose();
            l = l.inverse();

            var alpha = l.multiply(l1).divide(liknoise);


            l = Cholesky(k.divide(liknoise).add(CreatImatrix(MDXobdata.GetLength(0))));//MD
            // l = Cholesky(k.divide(liknoise).add(CreatImatrix(Xobdata.GetLength(0))));//1D
            var f       = alpha.multiply(Y);
            var firstp  = f[0] / 2;
            var secondp = sumlogl(l);
            var thrdp   = l.GetLength(0) * Math.Log(2 * Math.PI * liknoise) / 2;
            var total   = firstp + secondp + thrdp;

            //if (x.Any(a => a.CompareTo(0) == -1)//0 is sf, 1 is L
            if (x[0] < 0 || x[1] < 0 ||
                x[2] < 0 ||
                x[3] > 1
                )


            {
                return(10000000);
            }
            if (total == 100000)
            {
                int xx = 1;
            }
            return(total);



            ///OLD log likelihoold
            //var firspart = -0.5 * VecToDouble((Y.transpose()).multiply(StarMath.inverse(k)).multiply(Y));
            //var kt = StarMath.CholeskyDecomposition(k);
            //var kkt = k.determinant();
            //var secondpart = -0.5 * Math.Log(k.determinant());
            //if (x.Any(a => a.CompareTo(0) == -1)//0 is sf, 1 is L
            //    //|| x[0] > 0.5
            //    // || x[1] < 0.1
            //    //|| x[2] > 1.1
            //    //|| x[3] > 1.1
            //    //|| x[2] < 0.8
            //    //|| x[3] < 0.8
            //    )
            //{
            //    return 10000000;
            //}
            ////else if (-(firspart + secondpart) < -1000)
            ////{
            ////    var a = -(firspart + secondpart);
            ////    return 10000000;
            ////}
            //var re = -(firspart + secondpart);
            //  return -(firspart + secondpart);
        }