%% Análisis componentes principales: <svd> (sin toolboxes extra) versus <pca> (statistics and ML toolbox)
% © 2022, Antonio Sala Piqueras, Universitat Politècnica de Valencia. Todos los derechos reservados.
% Este código ejecutó sin errores en Matlab R2022a.
% Presentación en vídeo: http://personales.upv.es/asala/YT/V/pcaissvd.html
% Objetivo: ilustrar que los comandos "svd" y "pca" producen el mismo resultado.
%% Generar Datos

N=1000;
X0=randn(N,4); %four standard normal random variables
TT=diag([4.5 4 3 2])*[1 2 3 3;1 3 -1 2;0 0 0.06 0.4;0.2 0 0.1 0.6]';
X=X0*TT+[5 4 3 -1]; %scale and mix things and move mean

%%
%% Procesar Datos
% Si los datos fueran en unidades arbitrarias no comparables, estandarizamos:

X=zscore(X);
std(X)
[U,S,V]=svd(X,'econ');
[coeff,score,latent]=pca(X); %Statistics and ML toolbox

% Los dos comandos sacan lo mismo. Comparemos:

diag(S)'/sqrt(N-1) %correction needed to have "standard dev." units as output
sqrt(latent')
V
coeff %identical to V except for sign changes (irrelevant)
%US=XV
U*S %identical to "score" except for sign changes (irrelevant)
score
std(score) %should be S/sqrt(N-1) or latent variable variance