DImensionality Reduction: wrong eigenvector matrix
Description
The matrix of eigenvectors calculated by OTB is quite different to that calculated with R, matlab and HypPy
Steps to reproduce
I’ve compared the matrix of eigenvectors resulting from:
otbcli_DimensionalityReduction -in CupriteCoarse.tif -out CupriteCoarsePCAotb.tif -method pca -method.pca.outeigenvalues eigv.csv -outmatrix eigenmat.csv
to results of PCA run with R (package RStoolbox), HypPy3 (https://blog.utwente.nl/bakker/hyppy/ 1) and matlab. Results from R, HypPy3 and matlab are much more alike than any of them compared to OTB I copy here the comparison subtracting the respective eigenmatrices (I use abs() because signs are arbitrary):
Comparing OTB to R:
> round(abs(otbeigenmat) - abs(Reigenmat),5)
1 0.02125 0.00017 -0.00009 0.00024 -0.00019 0.00012
2 0.00193 0.24181 0.00221 0.00201 -0.00065 0.00266
3 0.00042 0.00734 0.69122 0.00815 0.06338 -0.03435
4 0.00009 0.00490 0.02421 0.81131 0.11675 0.08478
5 0.00094 0.00511 -0.03584 0.09221 0.00714 0.86069
6 0.00056 -0.00010 0.06821 0.13170 0.92992 0.02208
Comparing OTB to HypPy3:
> round(abs(otbeigenmat) - abs(hypeigenmat),5)
1 0.02125 0.00017 0.00001 0.00001 0.00001 0.00002
2 0.00193 0.24181 0.00243 0.00164 0.00072 0.00087
3 0.00032 0.00712 0.69122 0.01296 0.02644 0.00047
4 0.00032 0.00528 0.01940 0.81131 0.10635 0.09612
5 0.00074 0.00375 0.00110 0.10261 0.00714 0.85866
6 0.00067 0.00169 0.03339 0.12036 0.93195 0.02208
Comparing R to HypPy3
> round(abs(Reigenmat) - abs(hypeigenmat),5)
1 0.00000 0.00000 0.00010 -0.00023 0.00020 -0.00011
2 0.00000 0.00000 0.00023 -0.00037 0.00137 -0.00179
3 -0.00010 -0.00023 0.00000 0.00481 -0.03694 0.03482
4 0.00023 0.00037 -0.00481 0.00000 -0.01040 0.01134
5 -0.00020 -0.00137 0.03694 0.01040 0.00000 -0.00203
6 0.00011 0.00179 -0.03482 -0.01134 0.00203 0.00000
Comparing otb to matlab
> round(abs(otbeigenmat) - abs(matleigenmat),5)
V1 V2 V3 V4 V5 V6
1 0.02125 0.00017 -0.00009 0.00024 -0.00019 0.00012
2 0.00193 0.24181 0.00221 0.00201 -0.00065 0.00266
3 0.00042 0.00734 0.69122 0.00815 0.06338 -0.03434
4 0.00009 0.00490 0.02421 0.81131 0.11675 0.08477
5 0.00094 0.00511 -0.03584 0.09221 0.00714 0.86069
6 0.00056 -0.00010 0.06821 0.13170 0.92992 0.02208
Comparing R to matlab
> round(abs(Reigenmat) - abs(matleigenmat),5)
V1 V2 V3 V4 V5 V6
1 0 0 0 0 0 0
2 0 0 0 0 0 0
3 0 0 0 0 0 0
4 0 0 0 0 0 0
5 0 0 0 0 0 0
6 0 0 0 0 0 0
I understand OTB uses the original image, without centering and/or scaling bands.
Configuration information
OTB v7 on Debian