Linear Discriminant Analysis

Background

Linear Discriminant Analysis (LDA) is a basic classification method from parametric statistics. It is based on a maximum a posteriori estimate of the class membership under the assumption that the class conditional densities are multi-variate Gaussians having different means but a common covariance matrix. Despite its simplicity, LDA gives surprisingly good results in practice, of course crucially depending on the representation of the input patterns and the underlying distribution. Details can be found, for instance, in [HastieTibshiraniFriedman2008].

Linear Discriminant Analysis in Shark

We assume that a data file in csv format is provided as a command line argument. As a first step, we inspect and split the data as described in the Nearest Neighbor Classification tutorial:

int main(int argc, char **argv) {
        if(argc < 2) {
                cerr << "usage: " << argv[0] << " (filename)" << endl;
                exit(EXIT_FAILURE);
        }
        // read data
        ClassificationDataset data;
        try {
                importCSV(data, argv[1], LAST_COLUMN, ' ');
        }
        catch (...) {
                cerr << "unable to read data from file " <<  argv[1] << endl;
                exit(EXIT_FAILURE);
        }

        cout << "overall number of data points: " << data.numberOfElements() << " "
             << "number of classes: " << numberOfClasses(data) << " "
             << "input dimension: " << inputDimension(data) << endl;

        // split data into training and test set
        ClassificationDataset dataTest = splitAtElement(data, .5 * data.numberOfElements() );
        cout << "training data points: " << data.numberOfElements() << endl;
        cout << "test data points: " << dataTest.numberOfElements() << endl;

Model and learning algorithm

We include the LDA class

#include <shark/Algorithms/Trainers/LDA.h>

and define the LDA trainer

LDA ldaTrainer;

and the linear classifier to be trained by the LDA trainer:

LinearClassifier<> lda;

The model is trained by calling:

ldaTrainer.train(lda, data);

Evaluating the model

After training the model, we can evaluate it. As a performance measure, we consider the standard 0-1 loss. The corresponding risk is the probability of error, the empirical risk is the average classification error. When measured on set of sample patterns, it simply computes the fraction of wrong predictions. We define the loss for unsigned integer labels and create a new data container for the predictions of our model:

Data<unsigned int> prediction;
ZeroOneLoss<unsigned int> loss;

Let’s apply the classifier to the training and the test data:

prediction = lda(data.inputs());
cout << "LDA on training set accuracy: " << 1. - loss(data.labels(), prediction) << endl;
prediction = lda(dataTest.inputs());
cout << "LDA on test set accuracy:     " << 1. - loss(dataTest.labels(), prediction) << endl;

Of course, the accuracy is given by one minus the error. In this example, the (parametric) LDA performs worse than the (non-parametric) nearest neighbor classifier, but still much better than random guessing.

Full example program

The full example program is LDATutorial.cpp.

Sample classification problem: Protein fold prediction

Let us consider the same bioinformatics problem as in the Nearest Neighbor Classification tutorial, namely the prediction of the secondary structure of proteins. The goal is to assign a protein to one out of 27 SCOP fold types [DingDubchak2001a]. We again consider the descriptions of amino-acid sequences provided by [DamoulasGirolami2008a]. The data C.csv provide a description of the amino-acid compositions of 695 proteins together with the corresponding fold type. Each row corresponds to a protein. After downloading the data C.csv we can envoke the example program:

./LDATutorial C.csv

References

[DamoulasGirolami2008a]T. Damoulas and M. Girolami. Probabilistic multi-class multi-kernel learning: on protein fold recognition and remote homology detection. Bioinformatics, 24(10):1264-1270, 2008.
[DingDubchak2001a]C.H.Q. Ding and I. Dubchak. Multi-class protein fold recognition using support vector machines and neural networks. Bioinformatics, 17(4):349-358, 2001.
[HastieTibshiraniFriedman2008]T. Hastie, R. Tibshirani and J. Friedman. The Elements of Statistical Learning, section 4.3. Springer-Verlag, 2008.