# Cleve's Cubicle

### From Wikimization

(Difference between revisions)

Line 3: | Line 3: | ||

<i>SVD meets PCA</i>, by Cleve Moler | <i>SVD meets PCA</i>, by Cleve Moler | ||

- | [https://www.mathworks.com/company/newsletters/articles/professor-svd.html MATLAB News & Notes | + | “''The Wikipedia pages on SVD and PCA are quite good and contain a number of useful links, although not to each other.''” |

- | + | <br>[https://www.mathworks.com/company/newsletters/articles/professor-svd.html <math>-</math>MATLAB News & Notes, Cleve’s Corner, 2006] | |

- | + | ||

- | + | ||

- | + | ||

<pre> | <pre> | ||

Line 14: | Line 11: | ||

A = randn(m,n); | A = randn(m,n); | ||

- | [coef,score,latent] = pca(A) | + | [coef,score,latent] = pca(A) |

X = A - mean(A); | X = A - mean(A); | ||

[U,S,V] = svd(X,'econ'); | [U,S,V] = svd(X,'econ'); | ||

- | % | + | % S vs. latent |

rho = rank(X); | rho = rank(X); | ||

+ | latent = diag(S(:,1:rho)).^2/(m-1) | ||

+ | |||

+ | % U vs. score | ||

sense = sign(score).*sign(U*S(:,1:rho)); %account for negated left singular vector | sense = sign(score).*sign(U*S(:,1:rho)); %account for negated left singular vector | ||

- | + | score = U*S(:,1:rho).*sense | |

- | + | ||

- | + | ||

% V vs. coef | % V vs. coef | ||

sense2 = sign(coef).*sign(V(:,1:rho)); %account for corresponding negated right singular vector | sense2 = sign(coef).*sign(V(:,1:rho)); %account for corresponding negated right singular vector | ||

- | + | coef = V(:,1:rho).*sense2 | |

</pre> | </pre> |

## Revision as of 18:46, 17 October 2017

Singular Value Decomposition *versus* Principal Component Analysis

*SVD meets PCA*, by Cleve Moler

“*The Wikipedia pages on SVD and PCA are quite good and contain a number of useful links, although not to each other.*”

MATLAB News & Notes, Cleve’s Corner, 2006

%relationship of pca to svd m=3; n=7; A = randn(m,n); [coef,score,latent] = pca(A) X = A - mean(A); [U,S,V] = svd(X,'econ'); % S vs. latent rho = rank(X); latent = diag(S(:,1:rho)).^2/(m-1) % U vs. score sense = sign(score).*sign(U*S(:,1:rho)); %account for negated left singular vector score = U*S(:,1:rho).*sense % V vs. coef sense2 = sign(coef).*sign(V(:,1:rho)); %account for corresponding negated right singular vector coef = V(:,1:rho).*sense2