protected ProbabilitySupportVectorMachine TrainSVM(double C, double gamma, List <ISample> trainingSamples, Func <ISample, double> idealFunction) { // duplicate the training dataset for better cross validation by LIBSVM probability generator (see LIBSVM documentation) List <double[]> inputSamples = trainingSamples.Select(sample => sample.GetDimensions()).ToList(); inputSamples.AddRange(trainingSamples.Select(sample => sample.GetDimensions())); // account for imposter samples (identifier not in identifierMap) List <double[]> outputSamples = trainingSamples.Select(sample => new double[] { idealFunction.Invoke(sample) }).ToList(); outputSamples.AddRange(trainingSamples.Select(sample => new double[] { idealFunction.Invoke(sample) })); double[][] INPUT = inputSamples.ToArray(); double[][] IDEAL = outputSamples.ToArray(); // train the SVM classifier with the provided data IMLDataSet trainingData = new BasicMLDataSet(INPUT, IDEAL); ProbabilitySupportVectorMachine svmNetwork = new ProbabilitySupportVectorMachine(trainingSamples[0].GetDimensionCount(), false, 0.00000001); // train the SVM classifier with the provided C and gamma SVMTrain trainedSVM = new SVMTrain(svmNetwork, trainingData) { Fold = 0, Gamma = gamma, C = C }; trainedSVM.Iteration(); Console.WriteLine("SVM training error: " + trainedSVM.Error); return(svmNetwork); }
SVMClassifier(Dictionary <string, int> identifiersMap, svm_model model) { /* for serialization */ svmNetwork = new ProbabilitySupportVectorMachine(model); this.identifiersMap = identifiersMap; this.model = model; }
protected void Train(double C, double gamma, List <ISample> trainingSamples, string[] trainingIdentifiers) { // generate a numeric mapping of our string identifiers to unique numeric values identifiersMap = trainingIdentifiers.Select((identifier, index) => new { identifier, index }).ToDictionary(id => id.identifier, id => id.index); // don't include imposter samples svmNetwork = TrainSVM(C, gamma, trainingSamples, (sample) => identifiersMap[sample.GetIdentifier()]); model = svmNetwork.Model; }