ica icon indicating copy to clipboard operation
ica copied to clipboard

Use SVD for PCA and fix when channels > observations

Open ethanbb opened this issue 6 years ago • 0 comments

I noticed that the branch of pca_whiten for when NSUB > NVOX, i.e. you have more channels than observations, wasn't giving the expected results. I compared the result for a matrix with NSUB < NVOX with the result when I added dummy channels of all zeros, which should have no effect on the whitened data, and they weren't the same - I believe due to a missing scaling factor somewhere.

Rather than pinpointing exactly where the missing factor was and what it was supposed to be, I decided to just rewrite it using SVD rather than eigendecomposition. I verified the results are the same, except the components are in reverse order since scipy.linalg.svd returns its results starting with the largest singular value. This doesn't require multiplying to get the covariance matrix, and seems to be faster in some cases (based on some light profiling, this is true in the typical case of few features and many observations).

Here's some more information about using SVD for PCA.

ethanbb avatar May 29 '19 22:05 ethanbb