Use SVD for PCA and fix when channels > observations#3
Open
ethanbb wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
I noticed that the branch of
pca_whitenfor whenNSUB > NVOX, i.e. you have more channels than observations, wasn't giving the expected results. I compared the result for a matrix withNSUB < NVOXwith 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.svdreturns 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.