This repository has been archived on 2021-05-17. You can view files and clone it, but cannot push or open issues or pull requests.
scientificComputing/linearalgebra/code/pca3d.m

62 lines
1.6 KiB
Matlab

function pca3d( x, y, z )
% computes covariance matrix from the triples x, y, z
% diagonalizes covariance matrix, i.e. performs pca on [ x, y, z ]
% x, y and z are column vectors
% covariance matrix:
cv = cov( [ x y z ] );
% eigen values:
[ v , d] = eig( cv )
% plots:
subplot( 1, 2, 1 );
hold on;
% scatter plot:
view( 3 );
scatter3( x, y, z ); % , 1.0, 'b', 'filled' ); %, 'MarkerEdgeColor', 'blue' );
xlabel( 'x' );
ylabel( 'y' );
zlabel( 'z' );
grid on;
% plot eigenvectors:
quiver3( ones( 1, 3 ).*mean( x ), ones( 1, 3 )*mean(y), ones( 1, 3 )*mean(z), v(1,:).*sqrt(diag(d))', v(2,:).*sqrt(diag(d))', v(3,:).*sqrt(diag(d))', 'r' ); %, 'LineWidth', 3, 'AutoScale', 'off', 'AutoScaleFactor', 1.0, 'MaxHeadSize', 0.7 )
%axis( 'equal' );
hold off;
% 2D scatter plots:
subplot( 2, 6, 4 );
scatter( x, y, 'b', 'filled' ); %, 'MarkerEdgeColor', 'white' );
xlabel( 'x' )
ylabel( 'y' )
subplot( 2, 6, 5 );
scatter( x, z, 'b', 'filled' ); %, 'MarkerEdgeColor', 'white' );
xlabel( 'x' )
ylabel( 'z' )
subplot( 2, 6, 6 );
scatter( y, z, 'b', 'filled' ); %, 'MarkerEdgeColor', 'white' );
xlabel( 'y' )
ylabel( 'z' )
% sort the eigenvalues:
[d,inx] = sort( diag(d), 'descend' );
subplot( 2, 2, 4 );
hold on;
% subtract means:
x = x - mean( x );
y = y - mean( y );
% project onto eigenvectors:
nx = [ x y z ] * v(:,inx);
scatter( nx(:,1), nx(:,2), 'b', 'filled' ); %, 'MarkerEdgeColor', 'white' );
xlabel( 'ex' )
ylabel( 'ey' )
axis( 'equal' );
hold off;
end