// Loss returns the weighted exponential loss. // It determines which samples are positive vs. negative // by checking the sign of the element in the expected // vector. func (w *WeightedExpLoss) Loss(actual autofunc.Result, expected linalg.Vector) autofunc.Result { expVar := &autofunc.Variable{Vector: expected.Copy().Scale(-1)} dots := autofunc.Mul(actual, expVar) exps := autofunc.Exp{}.Apply(dots) weightVec := &autofunc.Variable{Vector: make(linalg.Vector, len(expected))} for i, x := range expected { if x > 0 { weightVec.Vector[i] = w.PosWeight } else { weightVec.Vector[i] = 1 } } return autofunc.SumAll(autofunc.Mul(exps, weightVec)) }
// Loss returns the squared magnitude of the difference // between actual and expected. func (_ SquareLoss) Loss(actual autofunc.Result, expected linalg.Vector) autofunc.Result { expVar := &autofunc.Variable{Vector: expected.Copy().Scale(-1)} return autofunc.SumAll(autofunc.Square(autofunc.Add(actual, expVar))) }
// Loss returns the exponential loss, as given by // exp(-actual*expected). func (_ ExpLoss) Loss(actual autofunc.Result, expected linalg.Vector) autofunc.Result { expVar := &autofunc.Variable{Vector: expected.Copy().Scale(-1)} dots := autofunc.Mul(actual, expVar) exps := autofunc.Exp{}.Apply(dots) return autofunc.SumAll(exps) }
func (_ MeanSquaredCost) CostR(v autofunc.RVector, a linalg.Vector, x autofunc.RResult) autofunc.RResult { aVar := &autofunc.Variable{a.Copy().Scale(-1)} aVarR := autofunc.NewRVariable(aVar, v) return autofunc.SquaredNorm{}.ApplyR(v, autofunc.AddR(aVarR, x)) }