Why does LDA reduction give only one dimension for two classes?
Hi,
I'm trying to reduce data from two classes with the Linear Discriminant Analysis algorithm (LDA opencv documentation here).
Here is a short example of what I'm trying to accomplish:
LDA lda(num_components);
lda.compute(someData, classesLabels); //Computes LDA algorithm to find the best projection
Mat reductedData = lda.project(someData); //Reduces input data
Let's say I've 100 dimensions per sample as input and I want to get 50 after reduction. If I'm correctly understanding the documentation (here), num_components should be the number of kept dimensions.
However I'm obtaining only one dimension regardless of the number I give to the LDA constructor. I looked at the LDA source code (here) which explains this behaviour :
...
// number of unique labels
int C = (int)num2label.size();
...
...
// clip number of components to be a valid number
if ((_num_components <= 0) || (_num_components > (C - 1))) {
_num_components = (C - 1);
}
...
_eigenvalues = Mat(_eigenvalues, Range::all(), Range(0, _num_components));
_eigenvectors = Mat(_eigenvectors, Range::all(), Range(0, _num_components));
Here are my questions:
- The behaviour in the documentation and the code seem to be different, is it normal ? If so, could someone explain why the number of output dimensions should be linked to the number of classes ?
- How should I proceed to have more than one dimension with two classes ?
"Let's say I've 100 dimensions per sample as input and I want to get 50 after reduction" -- imho, you want PCA, not LDA
From what I could read LDA could be used as reduction method as well ( e.g. here).
Wikipedia also seems to say it:
(source)
I'm not interested in using the PCA method, I already have and would like to compare it to LDA reduction.