LDPP is an algorithm that simultaneously learns a linear projection
base and a reduced set of prototypes for Nearest-Neighbor
classification. This approach uses a process in which given an initial
projection base and prototypes it iteratively adjusts the parameters
by minimizing the classification error probability. The algorithm is
intended for problems in which the original dimensionality is very
high compared to the amount of training samples, although it can be
used for other classification tasks.
You can checkout the online face
analysis demo which uses for recognition models trained with
LDPP. Also, if you have a mobile phone with a camera which supports
java midlets with MMAPI, you can try out
the
gender recognition midlet demo. This midlet captures an image,
detects the face (using a model trained with LDPP) and then
classifies the face as male or female (using another model trained
with LDPP). The gender recognition error rate should be around
10%.
I am making available my implementation of the LDPP algorithm for
matlab/octave under the GNU General Public License. You can download
the file
from here. If
you have any comments or suggestions, feel free to
contact me.
This example trains a 16-dimensional projection base and 4 prototypes
per class using the gender recognition data set from the CVPR2008
paper. The initialization is PCA for the projection base and class
means for the prototypes. The data set can be downloaded from
here and a script of the
experiment is found here. You must also
download the LDPP implementation and
the PCA implementation.
>> % read the training data
>> load('gender.data');
>> X=gender(:,1:size(gender,2)-1)';
>> Xlabels=gender(:,size(gender,2));
>> % create an initial projection base (using PCA)
>> B0 = pca(X);
>> B0 = B0(:,1:16);
>> % create initial prototypes (class means)
>> P0 = [];
>> Plabels = [];
>> for c = unique(Xlabels)',
>> P0 = [ P0, repmat(mean(X(:,Xlabels==c),2),1,4) ];
>> Plabels = [ Plabels; c*ones(4,1) ];
>> end;
>> % learn with LDPP
>> [B,P] = ldpp(X, Xlabels, B0, P0, Plabels);
ldpp: output: iteration | J | delta(J) | error
0 0.306913 -0.693087 0.243129
1 0.300842 -0.006071 0.236258
2 0.293210 -0.007633 0.232030
...
998 0.011006 -0.000012 0.004228
999 0.010990 -0.000016 0.004228
1000 0.010975 -0.000015 0.004228
ldpp: reached maximum number of iterations
ldpp: best iteration 1000, J=0.010975, error=0.004228