func (KNN *KNNClassifier) Predict(what *base.Instances) *base.Instances { ret := what.GeneratePredictionVector() for i := 0; i < what.Rows; i++ { ret.SetAttrStr(i, 0, KNN.PredictOne(what.GetRowVectorWithoutClass(i))) } return ret }
func (lr *LogisticRegression) Predict(X *base.Instances) *base.Instances { ret := X.GeneratePredictionVector() row := make([]float64, X.Cols-1) for i := 0; i < X.Rows; i++ { rowCounter := 0 for j := 0; j < X.Cols; j++ { if j != X.ClassIndex { row[rowCounter] = X.Get(i, j) rowCounter++ } } fmt.Println(Predict(lr.model, row), row) ret.Set(i, 0, Predict(lr.model, row)) } return ret }
func (lr *LinearRegression) Predict(X *base.Instances) (*base.Instances, error) { if !lr.fitted { return nil, NoTrainingDataError } ret := X.GeneratePredictionVector() for i := 0; i < X.Rows; i++ { var prediction float64 = lr.disturbance for j := 0; j < X.Cols; j++ { if j != X.ClassIndex { prediction += X.Get(i, j) * lr.regressionCoefficients[j] } } ret.Set(i, 0, prediction) } return ret, nil }
// Predict gathers predictions from all the classifiers // and outputs the most common (majority) class // // IMPORTANT: in the event of a tie, the first class which // achieved the tie value is output. func (b *BaggedModel) Predict(from *base.Instances) *base.Instances { n := runtime.NumCPU() // Channel to receive the results as they come in votes := make(chan *base.Instances, n) // Count the votes for each class voting := make(map[int](map[string]int)) // Create a goroutine to collect the votes var votingwait sync.WaitGroup votingwait.Add(1) go func() { for { incoming, ok := <-votes if ok { // Step through each prediction for j := 0; j < incoming.Rows; j++ { // Check if we've seen this class before... if _, ok := voting[j]; !ok { // If we haven't, create an entry voting[j] = make(map[string]int) // Continue on the current row j-- continue } voting[j][incoming.GetClass(j)]++ } } else { votingwait.Done() break } } }() // Create workers to process the predictions processpipe := make(chan int, n) var processwait sync.WaitGroup for i := 0; i < n; i++ { processwait.Add(1) go func() { for { if i, ok := <-processpipe; ok { c := b.Models[i] l := b.generatePredictionInstances(i, from) votes <- c.Predict(l) } else { processwait.Done() break } } }() } // Send all the models to the workers for prediction for i := range b.Models { processpipe <- i } close(processpipe) // Finished sending models to be predicted processwait.Wait() // Predictors all finished processing close(votes) // Close the vote channel and allow it to drain votingwait.Wait() // All the votes are in // Generate the overall consensus ret := from.GeneratePredictionVector() for i := range voting { maxClass := "" maxCount := 0 // Find the most popular class for c := range voting[i] { votes := voting[i][c] if votes > maxCount { maxClass = c maxCount = votes } } ret.SetAttrStr(i, 0, maxClass) } return ret }