// UpdateOne updates sufficient statistics using one observation. func (g *Model) UpdateOne(o model.Obs, w float64) { glog.V(6).Infof("gaussian update, name:%s, obs:%v, weight:%e", g.ModelName, o, w) /* Update sufficient statistics. */ obs, _, _ := model.ObsToF64(o) floatx.Apply(floatx.ScaleFunc(w), obs, g.tmpArray) floats.Add(g.Sumx, g.tmpArray) floatx.Sq(g.tmpArray, obs) floats.Scale(w, g.tmpArray) floats.Add(g.Sumxsq, g.tmpArray) g.NSamples += w }
// Estimate computes model parameters using sufficient statistics. func (gmm *Model) UpdateOne(o model.Obs, w float64) { obs, _, _ := model.ObsToF64(o) maxProb := gmm.logProbInternal(obs, gmm.tmpProbs) gmm.Likelihood += maxProb floatx.Apply(floatx.AddScalarFunc(-maxProb+math.Log(w)), gmm.tmpProbs, nil) // Compute posterior probabilities. floatx.Exp(gmm.tmpProbs, gmm.tmpProbs) // Update posterior sum, needed to compute mixture weights. floats.Add(gmm.PosteriorSum, gmm.tmpProbs) // Update Gaussian components. for i, c := range gmm.Components { c.UpdateOne(o, gmm.tmpProbs[i]) } // Count number of observations. gmm.NSamples += w }