# How can I reproduce the result of PrincipalComponents

matrix = N[{{1, 2}, {2, 3}, {4, 10}}]
{{1., 2.}, {2., 3.}, {4., 10.}}

res1 = PrincipalComponents[matrix, Method -> "Correlation"]
{{1.10388, 0.130549}, {0.478746, -0.170139}, {-1.58262, 0.0395904}}

res2 = PrincipalComponents[matrix, Method -> "Covariance"]
{{3.27053, 0.285293}, {1.99969, -0.335165}, {-5.27023, 0.0498715}}

res3 = PrincipalComponents[Standardize @ matrix, Method -> "Covariance"]
{{1.10388, 0.130549}, {0.478746, -0.170139}, {-1.58262, 0.0395904}}


Here, you see that res1 == res3. My question is, how can I get res2 manually like the following:

eigenVectors = Eigenvectors @ Covariance[Standardize @ matrix];
Standardize[matrix].Transpose[eigenVectors]
{{-1.10388, 0.130549}, {-0.478746, -0.170139}, {1.58262, 0.0395904}}


I vastly prefer the formulation in terms of the singular value decomposition (SVD). This question gets asked a lot by users of these functions, so here's a quick reference:

mat = {{1., 2.}, {2., 3.}, {4., 10.}};

p1 = PrincipalComponents[mat, Method -> "Covariance"]
{{3.27053, 0.285293}, {1.99969, -0.335165}, {-5.27023, 0.0498715}}

p1a = Dot @@ Most[SingularValueDecomposition[Standardize[mat, Mean, 1 &]]]
{{3.27053, 0.285293}, {1.99969, -0.335165}, {-5.27023, 0.0498715}}

p2 = PrincipalComponents[mat, Method -> "Correlation"]
{{1.10388, 0.130549}, {0.478746, -0.170139}, {-1.58262, 0.0395904}}

p2a = Dot @@ Most[SingularValueDecomposition[Standardize[mat, Mean, StandardDeviation]]]
{{1.10388, 0.130549}, {0.478746, -0.170139}, {-1.58262, 0.0395904}}

• So just out of curiosity: are there any practical reasons for preferring one over the other? From my brief experiments, computing the eigenvectors of the covariance matrix seems to be faster than computing the (truncated) SVD of the data. The covariance matrix is also a useful quantity by itself, so you'll often end up calculating that anyway and it's a small step to calculate the eigenvectors after that. – Sjoerd Smit Aug 12 '19 at 11:24
• I apparently missed this comment: the thing with SVD is that it often gives more accurate results for the singular values and vectors, as opposed to computing the eigendecomposition of the cross-product matrix. I discuss a classical example here. As for the covariance matrix: in fact, a route often taken is to just assemble it from the right singular vectors and the singular values. – J. M. will be back soon Nov 15 '19 at 10:43