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); }
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); }
public double Emstep(SRMData data) { double llf = Estep(data); Mstep(); return(llf); }
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); }
public override void Initialize(SRMData data) { hsrm.InitAll(data, conf, msg); status = ModelStatus.Initialized; result = srm.Calc(data); PlotMVF(data); }
public override void Initialize(SRMData data) { em.Initialize(data); status = ModelStatus.Initialized; result = srm.Calc(data); PlotMVF(data); }
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(); }
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; } }
private double DoEstimation(SRMData data, int u) { double llf = 0.0; for (int k = 0; k < u; k++) { llf = Emstep(data); } return(llf); }
public void PlotMVF(SRMData data, double tmax = 1.5) { if (data != null) { mvf = srm.MvfData(PlotPoint.MakeSeq(0, data.TotalTime * tmax)); } else { mvf = null; } }
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]; }
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); }
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; } }
public void Initialize(SRMData data) { param.Omega = 1.0; param.Mu = 0.0; param.Phi = data.TotalTime / 2.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); }
public void Initialize(SRMData data) { param.Omega = 1.0; param.Mu = 1.0; param.Phi = NMath.Log(data.TotalTime / 2.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); }
public void Initialize(SRMData data) { param.Omega = data.TotalFaults; param.Lambda = 2.0 / data.TotalTime; }
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); }
public void Initialize(SRMData data) { param.Omega = 1.0; param.A = 1.0; param.C = 1.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); }
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); }
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); }
public void Pre_em(SRMData data) { }
public void Initialize(SRMData data) { param.Omega = data.TotalFaults; param.Alpha = 1.0; param.Beta = 2.0 / data.TotalTime; }
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); }
public void Post_em(SRMData data) { }
public abstract void Fit(SRMData data);
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); }
public abstract void Initialize(SRMData data);