func (classifier *MaxEntClassifier) Predict(instance *data.Instance) data.InstanceOutput { output := data.InstanceOutput{} // 当使用NamedFeatures时转化为Features if instance.NamedFeatures != nil { if classifier.FeatureDictionary == nil { return output } instance.Features = util.NewSparseVector() // 第0个feature始终是1 instance.Features.Set(0, 1.0) for k, v := range instance.NamedFeatures { id := classifier.FeatureDictionary.TranslateIdFromName(k) instance.Features.Set(id, v) } } output.LabelDistribution = util.NewVector(classifier.NumLabels) output.LabelDistribution.Set(0, 1.0) z := float64(1) mostPossibleLabel := 0 mostPossibleLabelWeight := float64(1) for iLabel := 1; iLabel < classifier.NumLabels; iLabel++ { sum := float64(0) for _, k := range classifier.Weights.GetValues(iLabel - 1).Keys() { sum += classifier.Weights.Get(iLabel-1, k) * instance.Features.Get(k) } exp := math.Exp(sum) if exp > mostPossibleLabelWeight { mostPossibleLabel = iLabel mostPossibleLabelWeight = exp } z += exp output.LabelDistribution.Set(iLabel, exp) } output.LabelDistribution.Scale(1 / z) output.Label = mostPossibleLabel if classifier.LabelDictionary != nil { output.LabelString = classifier.LabelDictionary.GetNameFromId(output.Label) } return output }
// 使用当前训练出的模型对一个样本的输出进行预测 func (classifier *OnlineSGDClassifier) Predict(instance *data.Instance) data.InstanceOutput { output := data.InstanceOutput{} predictedLabel := 0 maxWeight := float64(0) for iLabel := 1; iLabel < classifier.weights.NumLabels()+1; iLabel++ { sum := float64(0) for _, k := range instance.Features.Keys() { sum += classifier.weights.Get(iLabel-1, k) * instance.Features.Get(k) } if sum > maxWeight { predictedLabel = iLabel maxWeight = sum } } output.Label = predictedLabel return output }