Click or drag to resize
Accord.NET (logo)

MultilabelSupportVectorMachineTModel, TKernel, TInput Class

One-against-all Multi-label Kernel Support Vector Machine Classifier.
Inheritance Hierarchy
SystemObject
  Accord.MachineLearningTransformBaseTInput, Boolean
    Accord.MachineLearningClassifierBaseTInput, Boolean
      Accord.MachineLearningMultilabelClassifierBaseTInput
        Accord.MachineLearningMultilabelScoreClassifierBaseTInput
          Accord.MachineLearningMultilabelLikelihoodClassifierBaseTInput
            Accord.MachineLearningOneVsRestTModel, TInput
              Accord.MachineLearning.VectorMachinesMultilabelSupportVectorMachineTModel, TKernel, TInput
                Accord.MachineLearning.VectorMachinesMultilabelSupportVectorMachineTKernel
                Accord.MachineLearning.VectorMachinesMultilabelSupportVectorMachineTKernel, TInput

Namespace:  Accord.MachineLearning.VectorMachines
Assembly:  Accord.MachineLearning (in Accord.MachineLearning.dll) Version: 3.5.0
Syntax
[SerializableAttribute]
public class MultilabelSupportVectorMachine<TModel, TKernel, TInput> : OneVsRest<TModel, TInput>, 
	IDisposable
where TModel : SupportVectorMachine<TKernel, TInput>
where TKernel : Object, IKernel<TInput>
where TInput : ICloneable
Request Example View Source

Type Parameters

TModel
TKernel
TInput

The MultilabelSupportVectorMachineTModel, TKernel, TInput type exposes the following members.

Constructors
  NameDescription
Public methodMultilabelSupportVectorMachineTModel, TKernel, TInput
Initializes a new instance of the MultilabelSupportVectorMachineTModel, TKernel, TInput class.
Top
Properties
  NameDescription
Public propertyCount
Gets the total number of binary models in this one-vs-rest multi-label configuration. Should be equal to the NumberOfOutputs (number of classes).
(Inherited from OneVsRestTModel, TInput.)
Public propertyItem
Gets or sets the inner binary classifiers used to distinguish between each class and all other classes.
(Inherited from OneVsRestTModel, TInput.)
Public propertyModels
Gets or sets the binary classifiers that have been trained to distinguish between each class and all other classes.
(Inherited from OneVsRestTModel, TInput.)
Public propertyNumberOfInputs
Gets the number of inputs accepted by the model.
(Inherited from TransformBaseTInput, TOutput.)
Public propertyNumberOfOutputs
Gets the number of outputs generated by the model.
(Inherited from TransformBaseTInput, TOutput.)
Public propertyParallelOptions
Gets or sets the parallelization options used when deciding the class of a new sample.
Public propertySupportVectorCount
Gets the total number of support vectors in the entire multi-label machine.
Public propertySupportVectorSharedCount
Gets the number of shared support vectors in the multi-label machine.
Public propertySupportVectorUniqueCount
Gets the number of unique support vectors in the multi-label machine.
Top
Methods
  NameDescription
Public methodCompress
If the inner machines have a linear kernel, compresses their support vectors into a single parameter vector for each machine.
Public methodDecide(TInput)
Computes class-label decisions for a given set of input vectors.
(Inherited from ClassifierBaseTInput, TClasses.)
Public methodDecide(TInput)
Computes a class-label decision for a given input.
(Inherited from MultilabelClassifierBaseTInput.)
Public methodDecide(TInput, TClasses)
Computes a class-label decision for a given input.
(Inherited from ClassifierBaseTInput, TClasses.)
Public methodDecide(TInput, Double)
Computes class-label decisions for the given input.
(Inherited from MultilabelClassifierBaseTInput.)
Public methodDecide(TInput, Int32)
Computes class-label decisions for the given input.
(Inherited from MultilabelClassifierBaseTInput.)
Public methodDecide(TInput, Double)
Computes a class-label decision for a given input.
(Inherited from MultilabelClassifierBaseTInput.)
Public methodDecide(TInput, Int32)
Computes a class-label decision for a given input.
(Inherited from MultilabelClassifierBaseTInput.)
Public methodDecide(TInput, Double)
Computes a class-label decision for a given input.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodDecide(TInput, Boolean)
Computes class-label decisions for the given input.
(Overrides MultilabelClassifierBaseTInputDecide(TInput, Boolean).)
Public methodDecide(TInput, Int32)
Computes whether a class label applies to an input vector.
(Overrides OneVsRestTModel, TInputDecide(TInput, Int32).)
Public methodDecide(TInput, Int32)
Computes a class-label decision for a given input.
(Overrides MultilabelScoreClassifierBaseTInputDecide(TInput, Int32).)
Public methodDispose
Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
Protected methodDispose(Boolean)
Releases unmanaged and - optionally - managed resources
Public methodEquals
Determines whether the specified object is equal to the current object.
(Inherited from Object.)
Protected methodFinalize
Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
(Inherited from Object.)
Public methodGetClassifierForClass
Gets the binary classifier for particular class index.
(Inherited from OneVsRestTModel, TInput.)
Public methodGetEnumerator
Returns an enumerator that iterates through the collection.
(Inherited from OneVsRestTModel, TInput.)
Public methodGetHashCode
Serves as the default hash function.
(Inherited from Object.)
Public methodGetLastKernelEvaluations
Gets the total kernel evaluations performed in the last call to Decide(TInput) and similar functions in the current thread.
Public methodGetLastKernelHits
Gets the number of cache hits during in the last call to Decide(TInput) and similar functions in the current thread.
Public methodGetType
Gets the Type of the current instance.
(Inherited from Object.)
Public methodLogLikelihood(TInput, Int32)
Computes the log-likelihood that the given input vector belongs to the specified classIndex.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihood(TInput, Int32)
Computes the log-likelihood that the given input vector belongs to the specified classIndex.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihood(TInput, Int32)
Computes the log-likelihood that the given input vector belongs to the specified classIndex.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihood(TInput, Int32, Double)
Computes the log-likelihood that the given input vector belongs to the specified classIndex.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihood(TInput, Int32, Double)
Computes the log-likelihood that the given input vector belongs to the specified classIndex.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihood(TInput, Int32, Boolean)
Computes a log-likelihood measuring the association between the given input vector and a given classIndex.
(Inherited from OneVsRestTModel, TInput.)
Public methodLogLikelihoods(TInput)
Computes the log-likelihood that the given input vector belongs to each of the possible classes.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihoods(TInput)
Computes the log-likelihood that the given input vector belongs to each of the possible classes.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihoods(TInput, Double)
Predicts a class label vector for the given input vector, returning the log-likelihoods of the input vector belonging to each possible class.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihoods(TInput, Double)
Computes the log-likelihood that the given input vector belongs to each of the possible classes.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihoods(TInput, Double)
Predicts a class label vector for each input vector, returning the log-likelihoods of the input vector belonging to each possible class.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihoods(TInput, Double)
Computes the log-likelihood that the given input vector belongs to each of the possible classes.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihoods(TInput, Boolean, Double)
Predicts a class label vector for the given input vector, returning the log-likelihoods of the input vector belonging to each possible class.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodLogLikelihoods(TInput, Double, Double)
Predicts a class label vector for each input vector, returning the log-likelihoods of the input vector belonging to each possible class.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Protected methodMemberwiseClone
Creates a shallow copy of the current Object.
(Inherited from Object.)
Public methodProbabilities(TInput)
Computes the probabilities that the given input vector belongs to each of the possible classes.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbabilities(TInput)
Computes the probabilities that the given input vector belongs to each of the possible classes.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbabilities(TInput, Double)
Predicts a class label vector for the given input vector, returning the probabilities of the input vector belonging to each possible class.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbabilities(TInput, Double)
Computes the probabilities that the given input vector belongs to each of the possible classes.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbabilities(TInput, Double)
Predicts a class label vector for each input vector, returning the probabilities of the input vector belonging to each possible class.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbabilities(TInput, Double)
Computes the probabilities that the given input vector belongs to each of the possible classes.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbabilities(TInput, Boolean, Double)
Predicts a class label vector for the given input vector, returning the probabilities of the input vector belonging to each possible class.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbabilities(TInput, Double, Double)
Predicts a class label vector for each input vector, returning the probabilities of the input vector belonging to each possible class.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbability(TInput, Int32)
Computes the probability that the given input vector belongs to the specified classIndex.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbability(TInput, Int32)
Computes the probability that the given input vector belongs to the specified classIndex.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbability(TInput, Int32)
Computes the probability that the given input vector belongs to the specified classIndex.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbability(TInput, Int32, Double)
Computes the probability that the given input vector belongs to the specified classIndex.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodProbability(TInput, Int32, Double)
Computes the probability that the given input vector belongs to the specified classIndex.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodReset
Resets the cache and machine statistics so they can be recomputed on next evaluation.
Public methodScore(TInput, Int32)
Computes a numerical score measuring the association between the given input vector and a given classIndex.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScore(TInput, Int32)
Computes a numerical score measuring the association between the given input vector and a given classIndex.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScore(TInput, Int32)
Computes a numerical score measuring the association between the given input vector and a given classIndex.
(Overrides MultilabelScoreClassifierBaseTInputScore(TInput, Int32).)
Public methodScore(TInput, Int32, Double)
Computes a numerical score measuring the association between the given input vector and a given classIndex.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScore(TInput, Int32, Double)
Computes a numerical score measuring the association between the given input vector and a given classIndex.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScore(TInput, Int32, Boolean)
Computes a numerical score measuring the association between the given input vector and a given classIndex.
(Inherited from OneVsRestTModel, TInput.)
Public methodScores(TInput)
Computes a numerical score measuring the association between the given input vector and each class.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScores(TInput)
Computes a numerical score measuring the association between the given input vector and each class.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScores(TInput, Boolean)
Predicts a class label vector for the given input vector, returning a numerical score measuring the strength of association of the input vector to each of the possible classes.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScores(TInput, Double)
Computes a numerical score measuring the association between the given input vector and each class.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScores(TInput, Double)
Computes a numerical score measuring the association between the given input vector and each class.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScores(TInput, Int32)
Predicts a class label vector for each input vector, returning a numerical score measuring the strength of association of the input vector to each of the possible classes.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScores(TInput, Boolean, Double)
Predicts a class label vector for the given input vector, returning a numerical score measuring the strength of association of the input vector to each of the possible classes.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScores(TInput, Boolean, Double)
Predicts a class label vector for each input vector, returning a numerical score measuring the strength of association of the input vector to each of the possible classes.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodScores(TInput, Boolean, Double)
Predicts a class label vector for the given input vector, returning a numerical score measuring the strength of association of the input vector to each of the possible classes.
(Overrides MultilabelScoreClassifierBaseTInputScores(TInput, Boolean, Double).)
Public methodToMulticlass
Views this instance as a multi-class generative classifier.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodToString
Returns a string that represents the current object.
(Inherited from Object.)
Public methodTransform(TInput)
Applies the transformation to an input, producing an associated output.
(Inherited from ClassifierBaseTInput, TClasses.)
Public methodTransform(TInput)
Applies the transformation to a set of input vectors, producing an associated set of output vectors.
(Inherited from TransformBaseTInput, TOutput.)
Public methodTransform(TInput, Boolean)
Applies the transformation to an input, producing an associated output.
(Inherited from MultilabelClassifierBaseTInput.)
Public methodTransform(TInput, Int32)
Applies the transformation to an input, producing an associated output.
(Inherited from MultilabelClassifierBaseTInput.)
Public methodTransform(TInput, Boolean)
Applies the transformation to an input, producing an associated output.
(Inherited from MultilabelClassifierBaseTInput.)
Public methodTransform(TInput, Int32)
Applies the transformation to an input, producing an associated output.
(Inherited from MultilabelClassifierBaseTInput.)
Public methodTransform(TInput, Double)
Applies the transformation to an input, producing an associated output.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodTransform(TInput, Double)
Applies the transformation to an input, producing an associated output.
(Inherited from MultilabelLikelihoodClassifierBaseTInput.)
Public methodTransform(TInput, Double)
Applies the transformation to an input, producing an associated output.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Public methodTransform(TInput, Int32)
Applies the transformation to an input, producing an associated output.
(Inherited from MultilabelScoreClassifierBaseTInput.)
Top
Extension Methods
  NameDescription
Public Extension MethodHasMethod
Checks whether an object implements a method with the given name.
(Defined by ExtensionMethods.)
Public Extension MethodIsEqual
Compares two objects for equality, performing an elementwise comparison if the elements are vectors or matrices.
(Defined by Matrix.)
Public Extension MethodToTOverloaded.
Converts an object into another type, irrespective of whether the conversion can be done at compile time or not. This can be used to convert generic types to numeric types during runtime.
(Defined by ExtensionMethods.)
Public Extension MethodToTOverloaded.
Converts an object into another type, irrespective of whether the conversion can be done at compile time or not. This can be used to convert generic types to numeric types during runtime.
(Defined by Matrix.)
Top
Remarks

The Support Vector Machine is by nature a binary classifier. Multiple label problems are problems in which an input sample is allowed to belong to one or more classes. A way to implement multi-label classes in support vector machines is to build a one-against-all decision scheme where multiple SVMs are trained to detect each of the available classes.

Currently this class supports only Kernel machines as the underlying classifiers. If a Linear Support Vector Machine is needed, specify a Linear kernel in the constructor at the moment of creation.

References:

Examples

The following example shows how to learn a linear, multi-label (one-vs-rest) support vector machine using the LinearDualCoordinateDescent algorithm.

// Let's say we have the following data to be classified
// into three possible classes. Those are the samples:
// 
double[][] inputs =
{
    //               input         output
    new double[] { 0, 1, 1, 0 }, //  0 
    new double[] { 0, 1, 0, 0 }, //  0
    new double[] { 0, 0, 1, 0 }, //  0
    new double[] { 0, 1, 1, 0 }, //  0
    new double[] { 0, 1, 0, 0 }, //  0
    new double[] { 1, 0, 0, 0 }, //  1
    new double[] { 1, 0, 0, 0 }, //  1
    new double[] { 1, 0, 0, 1 }, //  1
    new double[] { 0, 0, 0, 1 }, //  1
    new double[] { 0, 0, 0, 1 }, //  1
    new double[] { 1, 1, 1, 1 }, //  2
    new double[] { 1, 0, 1, 1 }, //  2
    new double[] { 1, 1, 0, 1 }, //  2
    new double[] { 0, 1, 1, 1 }, //  2
    new double[] { 1, 1, 1, 1 }, //  2
};

int[] outputs = // those are the class labels
{
    0, 0, 0, 0, 0,
    1, 1, 1, 1, 1,
    2, 2, 2, 2, 2,
};

// Create a one-vs-one multi-class SVM learning algorithm 
var teacher = new MultilabelSupportVectorLearning<Linear>()
{
    // using LIBLINEAR's L2-loss SVC dual for each SVM
    Learner = (p) => new LinearDualCoordinateDescent()
    {
        Loss = Loss.L2
    }
};

// Configure parallel execution options
teacher.ParallelOptions.MaxDegreeOfParallelism = 1;

// Learn a machine
var machine = teacher.Learn(inputs, outputs);

// Obtain class predictions for each sample
bool[][] predicted = machine.Decide(inputs);

// Compute classification error using mean accuracy (mAcc)
double error = new HammingLoss(outputs).Loss(predicted);

The following example shows how to learn a non-linear, multi-label (one-vs-rest) support vector machine using the Gaussian kernel and the SequentialMinimalOptimization algorithm.

// Let's say we have the following data to be classified
// into three possible classes. Those are the samples:
// 
double[][] inputs =
{
    //               input         output
    new double[] { 0, 1, 1, 0 }, //  0 
    new double[] { 0, 1, 0, 0 }, //  0
    new double[] { 0, 0, 1, 0 }, //  0
    new double[] { 0, 1, 1, 0 }, //  0
    new double[] { 0, 1, 0, 0 }, //  0
    new double[] { 1, 0, 0, 0 }, //  1
    new double[] { 1, 0, 0, 0 }, //  1
    new double[] { 1, 0, 0, 1 }, //  1
    new double[] { 0, 0, 0, 1 }, //  1
    new double[] { 0, 0, 0, 1 }, //  1
    new double[] { 1, 1, 1, 1 }, //  2
    new double[] { 1, 0, 1, 1 }, //  2
    new double[] { 1, 1, 0, 1 }, //  2
    new double[] { 0, 1, 1, 1 }, //  2
    new double[] { 1, 1, 1, 1 }, //  2
};

int[] outputs = // those are the class labels
{
    0, 0, 0, 0, 0,
    1, 1, 1, 1, 1,
    2, 2, 2, 2, 2,
};

// Create the multi-class learning algorithm for the machine
var teacher = new MulticlassSupportVectorLearning<Gaussian>()
{
    // Configure the learning algorithm to use SMO to train the
    //  underlying SVMs in each of the binary class subproblems.
    Learner = (param) => new SequentialMinimalOptimization<Gaussian>()
    {
        // Estimate a suitable guess for the Gaussian kernel's parameters.
        // This estimate can serve as a starting point for a grid search.
        UseKernelEstimation = true
    }
};

// Configure parallel execution options
teacher.ParallelOptions.MaxDegreeOfParallelism = 1;

// Learn a machine
var machine = teacher.Learn(inputs, outputs);

// Obtain class predictions for each sample
int[] predicted = machine.Decide(inputs);

// Get class scores for each sample
double[] scores = machine.Score(inputs);

// Compute classification error
double error = new ZeroOneLoss(outputs).Loss(predicted);

Support vector machines can have their weights calibrated in order to produce probability estimates (instead of simple class separation distances). The following example shows how to use ProbabilisticOutputCalibration within MulticlassSupportVectorLearning to generate a probabilistic SVM:

// Let's say we have the following data to be classified
// into three possible classes. Those are the samples:
// 
double[][] inputs =
{
    //               input         output
    new double[] { 0, 1, 1, 0 }, //  0 
    new double[] { 0, 1, 0, 0 }, //  0
    new double[] { 0, 0, 1, 0 }, //  0
    new double[] { 0, 1, 1, 0 }, //  0
    new double[] { 0, 1, 0, 0 }, //  0
    new double[] { 1, 0, 0, 1 }, //  1
    new double[] { 0, 0, 0, 1 }, //  1
    new double[] { 0, 0, 0, 1 }, //  1
    new double[] { 1, 0, 1, 1 }, //  2
    new double[] { 1, 1, 0, 1 }, //  2
    new double[] { 0, 1, 1, 1 }, //  2
    new double[] { 1, 1, 1, 1 }, //  2
};

int[] outputs = // those are the class labels
{
    0, 0, 0, 0, 0,
    1, 1, 1, 
    2, 2, 2, 2, 
};

// Create the multi-class learning algorithm for the machine
var teacher = new MultilabelSupportVectorLearning<Gaussian>()
{
    // Configure the learning algorithm to use SMO to train the
    //  underlying SVMs in each of the binary class subproblems.
    Learner = (param) => new SequentialMinimalOptimization<Gaussian>()
    {
        // Estimate a suitable guess for the Gaussian kernel's parameters.
        // This estimate can serve as a starting point for a grid search.
        UseKernelEstimation = true
    }
};

// Learn a machine
var machine = teacher.Learn(inputs, outputs);

// Create the multi-class learning algorithm for the machine
var calibration = new MultilabelSupportVectorLearning<Gaussian>()
{
    Model = machine, // We will start with an existing machine

    // Configure the learning algorithm to use SMO to train the
    //  underlying SVMs in each of the binary class subproblems.
    Learner = (param) => new ProbabilisticOutputCalibration<Gaussian>()
    {
        Model = param.Model // Start with an existing machine
    }
};


// Configure parallel execution options
calibration.ParallelOptions.MaxDegreeOfParallelism = 1;

// Learn a machine
calibration.Learn(inputs, outputs);

// Obtain class predictions for each sample
bool[][] predicted = machine.Decide(inputs);

// Get class scores for each sample
double[][] scores = machine.Scores(inputs);

// Get log-likelihoods (should be same as scores)
double[][] logl = machine.LogLikelihoods(inputs);

// Get probability for each sample
double[][] prob = machine.Probabilities(inputs);

// Compute classification error using mean accuracy (mAcc)
double error = new HammingLoss(outputs).Loss(predicted);
double loss = new CategoryCrossEntropyLoss(outputs).Loss(prob);
See Also