func (lr *LROWLQN) updateValueGrad(pos *core.Vector, dataset *core.DataSet) { var totalLoss float64 = 0.0 var grad *core.Vector = core.NewVector() for _, sample := range dataset.Samples { var score float64 = lr.getScore(pos, sample) var signScore float64 = score if sample.Label == 0 { signScore = -score } var prob float64 var lnProb float64 if signScore < -30 { prob = 0 lnProb = signScore } else if signScore > 30 { prob = 1 lnProb = 0 } else { prob = 1.0 / (1.0 + math.Exp(-signScore)) lnProb = math.Log(prob) } var scale float64 if sample.Label == 0 { scale = (1 - prob) } else { scale = -(1 - prob) } totalLoss += -lnProb for _, fea := range sample.Features { grad.AddValue(fea.Id, scale*fea.Value) } } lr.lastPos = pos.Copy() lr.lastCost = totalLoss lr.lastGrad = grad }