Beispiel #1
0
 private void SetLinearStructuredParameter(SRMData data, double shape)
 {
     double[] alpha = new double[ndim];
     double[] rate  = new double[ndim];
     SetLinearStructuredParameter(data.MaxTime / 2.0, shape, alpha, rate);
     param.Update(data.TotalFaults, alpha, rate);
 }
Beispiel #2
0
        public override void Fit(SRMData data)
        {
            if (status == ModelStatus.NotIntialized)
            {
                hsrm.InitAll(data, conf, msg);
                status = ModelStatus.Initialized;
            }
            status = ModelStatus.Processing;
            hsrm.FitAll(data, conf, msg);
            switch (conf.Status)
            {
            case SRATS.Status.CONVERGENCE:
                status = ModelStatus.Convergence;
                break;

            case SRATS.Status.MAXITERATION:
                status = ModelStatus.MaxIteration;
                break;

            case SRATS.Status.NUMERICALERROR:
                status = ModelStatus.NumericalError;
                break;

            default:
                status = ModelStatus.Unknown;
                break;
            }
            result = srm.Calc(data);
            PlotMVF(data);
        }
Beispiel #3
0
        public double Emstep(SRMData data)
        {
            double llf = Estep(data);

            Mstep();
            return(llf);
        }
Beispiel #4
0
        private SRMData SetDataThreeColumn(Object[,] dataCells, bool cumulative)
        {
            int dsize = dataCells.GetUpperBound(0) - dataCells.GetLowerBound(0) + 1;

            double[] time  = new double[dsize];
            int[]    fault = new int[dsize];
            int[]    type  = new int[dsize];
            double   prev  = 0;

            for (int i = 0, j = dataCells.GetLowerBound(0); i < dsize; i++, j++)
            {
                double tmp = System.Convert.ToDouble(dataCells[j, 1]);
                if (cumulative)
                {
                    time[i] = tmp - prev;
                    prev    = tmp;
                }
                else
                {
                    time[i] = tmp;
                }
                fault[i] = System.Convert.ToInt32(dataCells[j, 2]);
                type[i]  = System.Convert.ToInt32(dataCells[j, 3]);
            }
            SRMData fdat = new SRMData();

            fdat.SetData(time, fault, type);
            return(fdat);
        }
Beispiel #5
0
 public override void Initialize(SRMData data)
 {
     hsrm.InitAll(data, conf, msg);
     status = ModelStatus.Initialized;
     result = srm.Calc(data);
     PlotMVF(data);
 }
Beispiel #6
0
 public override void Initialize(SRMData data)
 {
     em.Initialize(data);
     status = ModelStatus.Initialized;
     result = srm.Calc(data);
     PlotMVF(data);
 }
Beispiel #7
0
        public void Initialize(SRMData data)
        {
            Alloc(data);
            double[] p = { 2.0, 4.0, 8.0, 16.0, 32.0, 64.0 };
            SetPowerStructuredParameter(data, p[0]);
            double   maxllf   = DoEstimation(data, 5);
            CPHParam maxparam = param.Create() as CPHParam;

            param.CopyTo(maxparam);
            for (int i = 1; i < p.Length; i++)
            {
                SetPowerStructuredParameter(data, p[i]);
                double llf = DoEstimation(data, 5);
                if (maxllf < llf)
                {
                    maxllf = llf;
                    param.CopyTo(maxparam);
                }
            }
            for (int i = 0; i < p.Length; i++)
            {
                SetLinearStructuredParameter(data, p[i]);
                double llf = DoEstimation(data, 5);
                if (maxllf < llf)
                {
                    maxllf = llf;
                    param.CopyTo(maxparam);
                }
            }
            maxparam.CopyTo(param);
            CPHDist cph = dist as CPHDist;

            cph.ClearCache();
        }
Beispiel #8
0
 public void InitAll(SRMData data, EMConf emconf, IMessage msg)
 {
     foreach (HErlangEMSRM model in allmodels)
     {
         EM em = new EM(model, emconf, msg);
         em.Initialize(data);
         maxmodel = model;
     }
 }
Beispiel #9
0
        private double DoEstimation(SRMData data, int u)
        {
            double llf = 0.0;

            for (int k = 0; k < u; k++)
            {
                llf = Emstep(data);
            }
            return(llf);
        }
Beispiel #10
0
 public void PlotMVF(SRMData data, double tmax = 1.5)
 {
     if (data != null)
     {
         mvf = srm.MvfData(PlotPoint.MakeSeq(0, data.TotalTime * tmax));
     }
     else
     {
         mvf = null;
     }
 }
Beispiel #11
0
        private void Alloc(SRMData data)
        {
            int dsize = data.Size;

            //vb = new double[dsize + 2][ndim];
            //vb2 = new double[dsize + 2][ndim];
            vb  = Array2.Create(dsize + 2, ndim);
            vb2 = Array2.Create(dsize + 2, ndim);

            blf  = new double[dsize + 2];
            blf2 = new double[dsize + 2];
        }
Beispiel #12
0
 public void FitAll(SRMData data, EMConf emconf, IMessage msg)
 {
     maxllf = double.MinValue;
     foreach (HErlangEMSRM model in allmodels)
     {
         EM em = new EM(model, emconf, msg);
         em.Fit(data);
         if (emconf.Llf > maxllf)
         {
             maxllf   = emconf.Llf;
             maxmodel = model;
             maxconf.Set(emconf);
         }
     }
     emconf.Set(maxconf);
 }
Beispiel #13
0
        public void Initialize(SRMData data)
        {
            Random rnd = new Random();

            param.Omega = data.TotalFaults;
            double[] tmp = new double[param.M];
            double   sum = 0.0;

            for (int i = 0; i < param.M; i++)
            {
                sum          += tmp[i] = rnd.NextDouble();
                param.Rate[i] = param.Shape[i] / data.TotalTime;
            }
            for (int i = 0; i < param.M; i++)
            {
                param.Alpha[i] = tmp[i] / sum;
            }
        }
Beispiel #14
0
 public void Initialize(SRMData data)
 {
     param.Omega = 1.0;
     param.Mu    = 0.0;
     param.Phi   = data.TotalTime / 2.0;
 }
Beispiel #15
0
        private double Estep(SRMData data)
        {
            int dsize = data.Size;

            double[] time = data.Time;
            int[]    num  = data.Fault;
            int[]    type = data.Type;

            int    j;
            int    x;
            double t, y;
            double tmp1, tmp2, tmp3;
            double llf;
            double g00, g01, g02;
            double g10, g11, g12;

            // E-step
            t   = time[0];
            x   = num[0];
            y   = NMath.Exp((NMath.Log(t) - param.Mu) / param.Phi);
            en1 = 0.0;
            en2 = 0.0;
            en3 = 0.0;
            llf = 0.0;
            g00 = 1.0;
            g01 = 0.5;
            g02 = 1.0;
            g10 = 1.0 / (1.0 + y);
            g11 = 1.0 / (2.0 * (1.0 + y) * (1.0 + y));
            g12 = (1.0 + (1.0 + NMath.Log(y)) * y) / ((1.0 + y) * (1.0 + y));
            if (x != 0)
            {
                tmp1 = g00 - g10;
                tmp2 = g01 - g11;
                tmp3 = g02 - g12;
                en1 += x;
                en2 += x * tmp2 / tmp1;
                en3 += x * tmp3 / tmp1;
                llf += x * NMath.Log(tmp1) - NMath.Lgamma(x + 1.0);
            }
            if (type[0] != 0)
            {
                en1 += 1.0;
                en2 += 1.0 / (1.0 + y);
                en3 += (y - 1.0) * NMath.Log(y) / (1.0 + y);
                llf += NMath.Log(dist.Pdf(t));
            }
            for (j = 1; j < dsize; j++)
            {
                x = num[j];
                if (time[j] != 0.0)
                {
                    t  += time[j];
                    y   = NMath.Exp((NMath.Log(t) - param.Mu) / param.Phi);
                    g00 = g10;
                    g01 = g11;
                    g02 = g12;
                    g10 = 1.0 / (1.0 + y);
                    g11 = 1.0 / (2.0 * (1.0 + y) * (1.0 + y));
                    g12 = (1.0 + (1.0 + NMath.Log(y)) * y) / ((1.0 + y) * (1.0 + y));
                }
                if (x != 0)
                {
                    tmp1 = g00 - g10;
                    tmp2 = g01 - g11;
                    tmp3 = g02 - g12;
                    en1 += x;
                    en2 += x * tmp2 / tmp1;
                    en3 += x * tmp3 / tmp1;
                    llf += x * NMath.Log(tmp1) - NMath.Lgamma(x + 1.0);
                }
                if (type[j] != 0)
                {
                    en1 += 1.0;
                    en2 += 1.0 / (1.0 + y);
                    en3 += (y - 1.0) * NMath.Log(y) / (1.0 + y);
                    llf += NMath.Log(dist.Pdf(t));
                }
            }
            llf += NMath.Log(param.Omega) * en1;
            en1 += param.Omega * g10;
            en2 += param.Omega * g11;
            en3 += param.Omega * g12;
            llf += -param.Omega * (1.0 - g10);

            return(llf);
        }
Beispiel #16
0
 public void Initialize(SRMData data)
 {
     param.Omega = 1.0;
     param.Mu    = 1.0;
     param.Phi   = NMath.Log(data.TotalTime / 2.0);
 }
Beispiel #17
0
        private double Estep(SRMData data)
        {
            int dsize = data.Size;

            double[] time = data.Time;
            int[]    num  = data.Fault;
            int[]    type = data.Type;

            int    j;
            double t0;
            int    x1;
            double t1;
            double tmp1, tmp2, llf;

            // E-step
            t0  = 0.0;
            t1  = time[0];
            x1  = num[0];
            en1 = 0.0;
            en2 = 0.0;
            llf = 0.0;
            if (x1 != 0)
            {
                tmp1 = 1 - NMath.Exp(-param.Lambda * t1);
                tmp2 = 1.0 / param.Lambda - (t1 + 1 / param.Lambda) * NMath.Exp(-param.Lambda * t1);
                en1  = x1;
                en2  = x1 * tmp2 / tmp1;
                llf  = x1 * NMath.Log(tmp1) - NMath.Lgamma(x1 + 1.0);
            }
            if (type[0] != 0)
            {
                en1 += 1.0;
                en2 += t1;
                llf += NMath.Log(param.Lambda) - param.Lambda * t1;
            }
            for (j = 1; j < dsize; j++)
            {
                if (time[j] != 0.0)
                {
                    t0 = t1;
                    t1 = t0 + time[j];
                }
                x1 = num[j];
                if (x1 != 0)
                {
                    tmp1 = NMath.Exp(-param.Lambda * t0) - NMath.Exp(-param.Lambda * t1);
                    tmp2 = (t0 + 1.0 / param.Lambda) * NMath.Exp(-param.Lambda * t0)
                           - (t1 + 1.0 / param.Lambda) * NMath.Exp(-param.Lambda * t1);
                    en1 += x1;
                    en2 += x1 * tmp2 / tmp1;
                    llf += x1 * NMath.Log(tmp1) - NMath.Lgamma(x1 + 1.0);
                }
                if (type[j] != 0)
                {
                    en1 += 1.0;
                    en2 += t1;
                    llf += NMath.Log(param.Lambda) - param.Lambda * t1;
                }
            }
            llf += NMath.Log(param.Omega) * en1;                                            // en1 is total number of faults
            en1 += param.Omega * NMath.Exp(-param.Lambda * t1);                             // t1 is the last time
            en2 += param.Omega * (t1 + 1.0 / param.Lambda) * NMath.Exp(-param.Lambda * t1); // t1 is the last time
            llf += -param.Omega * (1.0 - NMath.Exp(-param.Lambda * t1));

            return(llf);
        }
Beispiel #18
0
 public void Initialize(SRMData data)
 {
     param.Omega  = data.TotalFaults;
     param.Lambda = 2.0 / data.TotalTime;
 }
Beispiel #19
0
        private double Estep(SRMData data)
        {
            int dsize = data.Size;

            double[] time = data.Time;
            int[]    num  = data.Fault;
            int[]    type = data.Type;

            int    j;
            int    x;
            double t;
            double tmp1, tmp2, tmp3;
            double llf;
            double g00, g01, g02;
            double g10, g11, g12;

            // E-step
            t = time[0];
            x = num[0];

            en1 = 0.0;
            en2 = 0.0;
            en3 = 0.0;
            llf = 0.0;
            g00 = 1.0;
            g01 = param.A / param.C;
            g02 = NMath.Psi(param.A) - NMath.Log(param.C);
            g10 = dist.Ccdf(t);
            g11 = param.A / (param.C + t) * g10;
            g12 = (NMath.Psi(param.A) - NMath.Log(param.C + t)) * g10;
            if (x != 0)
            {
                tmp1 = g00 - g10;
                tmp2 = g01 - g11;
                tmp3 = g02 - g12;
                en1 += x;
                en2 += x * tmp2 / tmp1;
                en3 += x * tmp3 / tmp1;
                llf += x * NMath.Log(tmp1) - NMath.Lgamma(x + 1.0);
            }
            if (type[0] != 0)
            {
                en1 += 1.0;
                en2 += (param.A + 1.0) / (param.C + t);
                en3 += NMath.Psi(param.A + 1.0) - NMath.Log(param.C + t);
                llf += NMath.Log(dist.Pdf(t));
            }
            for (j = 1; j < dsize; j++)
            {
                x = num[j];
                if (time[j] != 0.0)
                {
                    t  += time[j];
                    g00 = g10;
                    g01 = g11;
                    g02 = g12;
                    g10 = dist.Ccdf(t);
                    g11 = param.A / (param.C + t) * g10;
                    g12 = (NMath.Psi(param.A) - NMath.Log(param.C + t)) * g10;
                }
                if (x != 0)
                {
                    tmp1 = g00 - g10;
                    tmp2 = g01 - g11;
                    tmp3 = g02 - g12;
                    en1 += x;
                    en2 += x * tmp2 / tmp1;
                    en3 += x * tmp3 / tmp1;
                    llf += x * NMath.Log(tmp1) - NMath.Lgamma(x + 1.0);
                }
                if (type[j] != 0)
                {
                    en1 += 1.0;
                    en2 += (param.A + 1.0) / (param.C + t);
                    en3 += NMath.Psi(param.A + 1.0) - NMath.Log(param.C + t);
                    llf += NMath.Log(dist.Pdf(t));
                }
            }
            llf += NMath.Log(param.Omega) * en1;
            en1 += param.Omega * g10;
            en2 += param.Omega * g11;
            en3 += param.Omega * g12;
            llf += -param.Omega * (1.0 - g10);

            return(llf);
        }
Beispiel #20
0
 public void Initialize(SRMData data)
 {
     param.Omega = 1.0;
     param.A     = 1.0;
     param.C     = 1.0;
 }
Beispiel #21
0
        public double Emstep(SRMData data)
        {
            int dsize = data.Size;

            double[] time = data.Time;
            int[]    num  = data.Fault;
            int[]    type = data.Type;

            int    x1;
            double t1;
            double llf, tmp1sum;

            // E-step
            // initialize
            for (int i = 0; i < param.M; i++)
            {
                a0[i] = NMath.Lgamma(param.Shape[i]);
                a1[i] = NMath.Lgamma(param.Shape[i] + 1.0);
            }
            en1 = 0.0;
            for (int i = 0; i < param.M; i++)
            {
                en2[i] = 0.0;
                en3[i] = 0.0;
            }
            llf = 0.0;

            t1 = time[0];            //dat.getTime(1);
            x1 = num[0];             //dat.getNumber(1);
            for (int i = 0; i < param.M; i++)
            {
                gam10[i] = NMath.Q_gamma(param.Shape[i], param.Rate[i] * t1, a0[i]);
                gam11[i] = NMath.Q_gamma(param.Shape[i] + 1, param.Rate[i] * t1, a1[i]);
            }
            if (x1 != 0)
            {
                tmp1sum = 0.0;
                for (int i = 0; i < param.M; i++)
                {
                    tmp1[i]  = 1.0 - gam10[i];
                    tmp1sum += param.Alpha[i] * tmp1[i];
                    tmp2[i]  = param.Shape[i] / param.Rate[i] * (1.0 - gam11[i]);
                }
                en1 += x1;
                for (int i = 0; i < param.M; i++)
                {
                    en2[i] += x1 * param.Alpha[i] * tmp1[i] / tmp1sum;
                    en3[i] += x1 * param.Alpha[i] * tmp2[i] / tmp1sum;
                }
                llf = x1 * NMath.Log(param.Omega * tmp1sum) - NMath.Lgamma(x1 + 1.0);
            }
            if (type[0] == 1)             // dat.getType(1) == 1)
            {
                tmp1sum = 0.0;
                for (int i = 0; i < param.M; i++)
                {
                    tmp1[i]  = Ipdf(i, t1);
                    tmp1sum += param.Alpha[i] * tmp1[i];
                }
                en1 += 1.0;
                for (int i = 0; i < param.M; i++)
                {
                    en2[i] += param.Alpha[i] * tmp1[i] / tmp1sum;
                    en3[i] += t1 * param.Alpha[i] * tmp1[i] / tmp1sum;
                }
                llf += NMath.Log(param.Omega * tmp1sum);
            }
            for (int j = 2; j <= dsize; j++)
            {
                t1 += time[j - 1];             //dat.getTime(j);
                x1  = num[j - 1];              //dat.getNumber(j);
                for (int i = 0; i < param.M; i++)
                {
                    gam20[i] = NMath.Q_gamma(param.Shape[i], param.Rate[i] * t1, a0[i]);
                    gam21[i] = NMath.Q_gamma(param.Shape[i] + 1, param.Rate[i] * t1, a1[i]);
                }
                if (x1 != 0)
                {
                    tmp1sum = 0.0;
                    for (int i = 0; i < param.M; i++)
                    {
                        tmp1[i]  = gam10[i] - gam20[i];
                        tmp1sum += param.Alpha[i] * tmp1[i];
                        tmp2[i]  = (param.Shape[i] / param.Rate[i]) * (gam11[i] - gam21[i]);
                    }
                    en1 += x1;
                    for (int i = 0; i < param.M; i++)
                    {
                        en2[i] += x1 * param.Alpha[i] * tmp1[i] / tmp1sum;
                        en3[i] += x1 * param.Alpha[i] * tmp2[i] / tmp1sum;
                    }
                    llf += x1 * NMath.Log(param.Omega * tmp1sum) - NMath.Lgamma(x1 + 1);
                }
                if (type[j - 1] == 1)               //dat.getType(j) == 1)
                {
                    tmp1sum = 0.0;
                    for (int i = 0; i < param.M; i++)
                    {
                        tmp1[i]  = Ipdf(i, t1);
                        tmp1sum += param.Alpha[i] * tmp1[i];
                    }
                    en1 += 1.0;
                    for (int i = 0; i < param.M; i++)
                    {
                        en2[i] += param.Alpha[i] * tmp1[i] / tmp1sum;
                        en3[i] += t1 * param.Alpha[i] * tmp1[i] / tmp1sum;
                    }
                    llf += NMath.Log(param.Omega * tmp1sum);
                }
                for (int i = 0; i < param.M; i++)
                {
                    gam10[i] = gam20[i];
                    gam11[i] = gam21[i];
                }
            }
            tmp1sum = 0.0;
            for (int i = 0; i < param.M; i++)
            {
                tmp1sum += param.Alpha[i] * gam10[i];                                                  // gam10 is the last time
                en2[i]  += param.Omega * param.Alpha[i] * gam10[i];                                    // gam10 is the last time
                en3[i]  += param.Omega * param.Alpha[i] * (param.Shape[i] / param.Rate[i]) * gam11[i]; // gam11 is the last time
            }
            en1 += param.Omega * tmp1sum;
            llf += -param.Omega * (1.0 - tmp1sum);

            // M-step
            param.Omega = en1;
            for (int i = 0; i < param.M; i++)
            {
                param.Alpha[i] = en2[i] / en1;
                param.Rate[i]  = param.Shape[i] * en2[i] / en3[i];
            }
            return(llf);
        }
Beispiel #22
0
        private double Estep(SRMData data)
        {
            int dsize = data.Size;

            double[] time = data.Time;
            int[]    num  = data.Fault;
            int[]    type = data.Type;

            int    j;
            int    x;
            double t, y, y0;
            double tmp1, tmp2, tmp3;
            double llf;
            double g00, g01, g02;
            double g10, g11, g12;
            double g20, g21, g22;

            // E-step
            y0 = NMath.Exp(param.Mu / param.Theta);
            //    double tomega = omega / (1.0 - exp(-y0));
            double tomega = -param.Omega / NMath.Expm1(-y0);

            en1 = 0.0;
            en2 = 0.0;
            en3 = 0.0;
            llf = 0.0;
            //    g00 = 1.0 - exp(-y0);
            //    g01 = exp(-mu/theta)*(1.0 - (1.0 + y0)*exp(-y0));
            //    g02 = 1.0 - exp(-y0) * (1.0 + y0 * log(y0));
            g00 = -NMath.Expm1(-y0);
            g01 = -NMath.Exp(-param.Mu / param.Theta) * (NMath.Expm1(-y0) + y0 * NMath.Exp(-y0));
            g02 = -(NMath.Expm1(-y0) + NMath.Exp(-y0) * y0 * param.Mu / param.Theta);
            t   = time[0];
            x   = num[0];
            y   = NMath.Exp(-(t - param.Mu) / param.Theta);
            g10 = g00;
            g11 = g01;
            g12 = g02;
            //    g20 = 1.0 - exp(-y);
            //    g21 = exp(-mu/theta)*(1.0 - (1.0 + y)*exp(-y));
            //    g22 = 1.0 - exp(-y) * (1.0 + y * log(y));
            g20 = -NMath.Expm1(-y);
            g21 = -NMath.Exp(-param.Mu / param.Theta) * (NMath.Expm1(-y) + y * NMath.Exp(-y));
            g22 = -NMath.Expm1(-y) + NMath.Exp(-y) * y * (t - param.Mu) / param.Theta;
            if (x != 0)
            {
                tmp1 = g10 - g20;
                tmp2 = g11 - g21;
                tmp3 = g12 - g22;
                en1 += x;
                en2 += x * tmp2 / tmp1;
                en3 += x * tmp3 / tmp1;
                llf += x * (NMath.Log(tmp1) - NMath.Log(g00)) - NMath.Lgamma(x + 1.0);
            }
            if (type[0] != 0)
            {
                en1 += 1.0;
                en2 += NMath.Exp(-t / param.Theta);
                en3 += (t - param.Mu) / param.Theta * (1.0 - y);
                llf += NMath.Log(dist.Pdf(t));
            }
            for (j = 1; j < dsize; j++)
            {
                x = num[j];
                if (time[j] != 0.0)
                {
                    t  += time[j];
                    y   = NMath.Exp(-(t - param.Mu) / param.Theta);
                    g10 = g20;
                    g11 = g21;
                    g12 = g22;
                    //        g20 = 1.0 - exp(-y);
                    //        g21 = exp(-mu/theta)*(1.0 - (1.0 + y)*exp(-y));
                    //        g22 = 1.0 - exp(-y) * (1.0 + y * log(y));
                    g20 = -NMath.Expm1(-y);
                    g21 = -NMath.Exp(-param.Mu / param.Theta) * (NMath.Expm1(-y) + y * NMath.Exp(-y));
                    g22 = -NMath.Expm1(-y) + NMath.Exp(-y) * y * (t - param.Mu) / param.Theta;
                }
                if (x != 0)
                {
                    tmp1 = g10 - g20;
                    tmp2 = g11 - g21;
                    tmp3 = g12 - g22;
                    en1 += x;
                    en2 += x * tmp2 / tmp1;
                    en3 += x * tmp3 / tmp1;
                    llf += x * (NMath.Log(tmp1) - NMath.Log(g00)) - NMath.Lgamma(x + 1.0);
                }
                if (type[j] != 0)
                {
                    en1 += 1.0;
                    en2 += NMath.Exp(-t / param.Theta);
                    en3 += (t - param.Mu) / param.Theta * (1.0 - y);
                    llf += NMath.Log(dist.Pdf(t));
                }
            }
            llf += (NMath.Log(tomega) + NMath.Log(g00)) * en1;
            en1 += tomega * (1.0 - g00 + g20);
            en2 += tomega * (NMath.Exp(-param.Mu / param.Theta) - g01 + g21);
            en3 += tomega * (1.0 - g02 + g22);
            llf += -tomega * (g00 - g20);

            return(llf);
        }
Beispiel #23
0
        private double Estep(SRMData data)
        {
            int dsize = data.Size;

            double[] time = data.Time;
            int[]    num  = data.Fault;
            int[]    type = data.Type;

            double tomega = param.Omega / dist0.Ccdf(-param.Mu / param.Sig);

            int    j;
            int    x;
            double t, y;
            double tmp1, tmp2, tmp3;
            double tmp, llf;
            double g00, g01, g02;
            double g10, g11, g12;
            double g20, g21, g22;

            en1 = 0.0;
            en2 = 0.0;
            en3 = 0.0;
            llf = 0.0;
            tmp = dist0.Pdf(-param.Mu / param.Sig);
            g00 = dist0.Ccdf(-param.Mu / param.Sig);
            g01 = param.Sig * tmp + param.Mu * g00;
            g02 = (param.Mu * param.Sig) * tmp + (param.Sig * param.Sig + param.Mu * param.Mu) * g00;
            t   = time[0];
            x   = num[0];
            y   = (t - param.Mu) / param.Sig;
            tmp = dist0.Pdf(y);
            g10 = g00;
            g11 = g01;
            g12 = g02;
            g20 = dist0.Ccdf(y);
            g21 = param.Sig * tmp + param.Mu * g20;
            g22 = (param.Sig * t + param.Mu * param.Sig) * tmp + (param.Sig * param.Sig + param.Mu * param.Mu) * g20;
            if (x != 0)
            {
                tmp1 = g10 - g20;
                tmp2 = g11 - g21;
                tmp3 = g12 - g22;
                en1 += x;
                en2 += x * tmp2 / tmp1;
                en3 += x * tmp3 / tmp1;
                llf += x * (NMath.Log(tmp1) - NMath.Log(g00)) - NMath.Lgamma(x + 1.0);
            }
            if (type[0] != 0)
            {
                en1 += 1.0;
                en2 += t;
                en3 += t * t;
                llf += NMath.Log(dist.Pdf(t));
            }
            for (j = 1; j < dsize; j++)
            {
                x = num[j];
                if (time[j] != 0.0)
                {
                    t  += time[j];
                    y   = (t - param.Mu) / param.Sig;
                    tmp = dist0.Pdf(y);
                    g10 = g20;
                    g11 = g21;
                    g12 = g22;
                    g20 = dist0.Ccdf(y);
                    g21 = param.Sig * tmp + param.Mu * g20;
                    g22 = (param.Sig * t + param.Mu * param.Sig) * tmp + (param.Sig * param.Sig + param.Mu * param.Mu) * g20;
                }
                if (x != 0)
                {
                    tmp1 = g10 - g20;
                    tmp2 = g11 - g21;
                    tmp3 = g12 - g22;
                    en1 += x;
                    en2 += x * tmp2 / tmp1;
                    en3 += x * tmp3 / tmp1;
                    llf += x * (NMath.Log(tmp1) - NMath.Log(g00)) - NMath.Lgamma(x + 1.0);
                }
                if (type[j] != 0)
                {
                    en1 += 1.0;
                    en2 += t;
                    en3 += t * t;
                    llf += NMath.Log(dist.Pdf(t));
                }
            }
            llf += (NMath.Log(tomega) + NMath.Log(g00)) * en1;
            en1 += tomega * (1.0 - g00 + g20);
            en2 += tomega * (param.Mu - g01 + g21);
            en3 += tomega * (param.Sig * param.Sig + param.Mu * param.Mu - g02 + g22);
            llf += -tomega * (g00 - g20);

            return(llf);
        }
Beispiel #24
0
 public void Pre_em(SRMData data)
 {
 }
Beispiel #25
0
 public void Initialize(SRMData data)
 {
     param.Omega = data.TotalFaults;
     param.Alpha = 1.0;
     param.Beta  = 2.0 / data.TotalTime;
 }
Beispiel #26
0
        private double Estep(SRMData data)
        {
            int dsize = data.Size;

            double[] time = data.Time;
            int[]    num  = data.Fault;
            int[]    type = data.Type;

            int    j;
            double t0;
            int    x1;
            double t1;
            double tmp1, tmp2, tmp3, tmp4, llf;
            double gam10, gam11, gam20, gam21;

            // E-step
            en1 = 0.0;
            en2 = 0.0;
            en3 = 0.0;
            llf = 0.0;

            t0    = 0.0;
            t1    = time[0];
            x1    = num[0];
            gam10 = 1.0;
            gam11 = 1.0;
            gam20 = dist.Ccdf(t1);
            gam21 = dist1.Ccdf(t1);
            tmp3  = elog.Interval(Log_integrand, 1.0e-10, t1);
            tmp4  = tmp3;
            if (x1 != 0)
            {
                tmp1 = gam10 - gam20;
                tmp2 = (param.Alpha / param.Beta) * (gam11 - gam21);
                en1 += x1;
                en2 += x1 * tmp2 / tmp1;
                en3 += x1 * tmp3 / tmp1;
                llf += x1 * NMath.Log(tmp1) - NMath.Lgamma(x1 + 1.0);
            }
            if (type[0] != 0)
            {
                en1 += 1.0;
                en2 += t1;
                en3 += NMath.Log(t1);
                llf += param.Alpha * NMath.Log(param.Beta) + (param.Alpha - 1.0) * NMath.Log(t1)
                       - param.Beta * t1 - NMath.Lgamma(param.Alpha);
            }
            for (j = 1; j < dsize; j++)
            {
                x1 = num[j];
                if (time[j] != 0.0)
                {
                    t0    = t1;
                    t1    = t0 + time[j];
                    gam10 = gam20;
                    gam11 = gam21;
                    gam20 = dist.Ccdf(t1);
                    gam21 = dist1.Ccdf(t1);
                    tmp3  = elog.Interval(Log_integrand, t0, t1);
                    tmp4 += tmp3;
                }
                if (x1 != 0)
                {
                    tmp1 = gam10 - gam20;
                    tmp2 = (param.Alpha / param.Beta) * (gam11 - gam21);
                    en1 += x1;
                    en2 += x1 * tmp2 / tmp1;
                    en3 += x1 * tmp3 / tmp1;
                    llf += x1 * NMath.Log(tmp1) - NMath.Lgamma(x1 + 1.0);
                }
                if (type[j] != 0)
                {
                    en1 += 1.0;
                    en2 += t1;
                    en3 += NMath.Log(t1);
                    llf += param.Alpha * NMath.Log(param.Beta) + (param.Alpha - 1.0) * NMath.Log(t1)
                           - param.Beta * t1 - NMath.Lgamma(param.Alpha);
                }
            }
            llf += NMath.Log(param.Omega) * en1;
            en1 += param.Omega * gam20;
            en2 += param.Omega * (param.Alpha / param.Beta) * gam21;
            en3 += param.Omega * (NMath.Psi(param.Alpha) - NMath.Log(param.Beta) - tmp4);
            llf += -param.Omega * (1.0 - gam20);

            return(llf);
        }
Beispiel #27
0
 public void Post_em(SRMData data)
 {
 }
Beispiel #28
0
 public abstract void Fit(SRMData data);
Beispiel #29
0
        private double Estep(SRMData data)
        {
            int dsize = data.Size;

            double[] time = data.Time;
            int[]    num  = data.Fault;
            int[]    type = data.Type;

            int    j;
            int    x;
            double t, y, yp2, y0, y0p2;
            double tmp1, tmp2, tmp3;
            double llf;
            double g00, g01, g02;
            double g10, g11, g12;
            double g20, g21, g22;

            // E-step
            y0   = NMath.Exp(-param.Mu / param.Phi);
            y0p2 = 1.0 + 2.0 * y0 + y0 * y0;
            double tomega = param.Omega * (1.0 + y0);

            en1 = 0.0;
            en2 = 0.0;
            en3 = 0.0;
            llf = 0.0;
            g00 = 1.0 / (1.0 + y0);
            g01 = 1.0 / (2.0 * y0p2);
            g02 = (1.0 + (1.0 + NMath.Log(y0)) * y0) / y0p2;
            t   = time[0];
            x   = num[0];
            y   = NMath.Exp((t - param.Mu) / param.Phi);
            yp2 = 1.0 + 2.0 * y + y * y;
            g10 = g00;
            g11 = g01;
            g12 = g02;
            g20 = 1.0 / (1.0 + y);
            g21 = 1.0 / (2.0 * yp2);
            g22 = (1.0 + (1.0 + NMath.Log(y)) * y) / yp2;
            if (x != 0)
            {
                tmp1 = g10 - g20;
                tmp2 = g11 - g21;
                tmp3 = g12 - g22;
                en1 += x;
                en2 += x * tmp2 / tmp1;
                en3 += x * tmp3 / tmp1;
                llf += x * (NMath.Log(tmp1) - NMath.Log(g00)) - NMath.Lgamma(x + 1.0);
            }
            if (type[0] != 0)
            {
                en1 += 1.0;
                en2 += 1.0 / (1.0 + y);
                en3 += (y - 1.0) * NMath.Log(y) / (1.0 + y);
                llf += NMath.Log(dist.Pdf(t));
            }
            for (j = 1; j < dsize; j++)
            {
                x = num[j];
                if (time[j] != 0.0)
                {
                    t  += time[j];
                    y   = NMath.Exp((t - param.Mu) / param.Phi);
                    yp2 = 1.0 + 2.0 * y + y * y;
                    g10 = g20;
                    g11 = g21;
                    g12 = g22;
                    g20 = 1.0 / (1.0 + y);
                    g21 = 1.0 / (2.0 * yp2);
                    g22 = (1.0 + (1.0 + NMath.Log(y)) * y) / yp2;
                }
                if (x != 0)
                {
                    tmp1 = g10 - g20;
                    tmp2 = g11 - g21;
                    tmp3 = g12 - g22;
                    en1 += x;
                    en2 += x * tmp2 / tmp1;
                    en3 += x * tmp3 / tmp1;
                    llf += x * (NMath.Log(tmp1) - NMath.Log(g00)) - NMath.Lgamma(x + 1.0);
                }
                if (type[j] != 0)
                {
                    en1 += 1.0;
                    en2 += 1.0 / (1.0 + y);
                    en3 += (y - 1.0) * NMath.Log(y) / (1.0 + y);
                    llf += NMath.Log(dist.Pdf(t));
                }
            }
            llf += (NMath.Log(tomega) + NMath.Log(g00)) * en1;
            en1 += tomega * (1.0 - g00 + g20);
            en2 += tomega * (0.5 - g01 + g21);
            en3 += tomega * (1.0 - g02 + g22);
            llf += -tomega * (g00 - g20);

            return(llf);
        }
Beispiel #30
0
 public abstract void Initialize(SRMData data);