I've been taught to think of the PCA as change of basis technique with a cleverly chosen basis. Let's say my initial data is a $m\times n$ matrix $X$ where $m$ is a number of features and $n$ is a number of measurements. I've computed covariance matrix $S$ and got eigenbasis $m\times m$ matrix $P$ (eigenvectors of $S$) which represents my new set of coordinates. I now want to transform my data to this new coordinates by $Y=PX$. Alternatively, I use
sklearn.decomposition.PCA class to perform the same procedure, but the transformed data differs from what I get manually.
import numpy as np import pandas as pd from sklearn.decomposition import PCA # generate some random data m = 10 n = 100 X = np.random.randn(m, n) X = X - X.mean(axis=1).reshape((m, 1)) S = X @ X.T / (n-1) # manual computation P = np.linalg.eig(S) # transformation matrix P Y = P @ X # transformed data # using sklearn pca = PCA() pca.fit(X.T) Y_sklearn = pca.transform(X.T).T
The output for the first vector in $Y$,
Y[:, 0], is
array([-0.09133876, -1.53859883, 0.86409512, -2.52404208, 0.05910835, 0.83063718, 0.52757518, 0.7412817 , -0.42611878, -0.71241571])
Y_sklearn[:, 0] is
array([ 1.44259169, 1.05948004, 0.87768441, 0.60333571, -1.560406 , 0.11799914, -1.91440021, -0.96841104, 0.41010045, -0.38189462])
I am probably making a mistake at some point, but can't find where exactly. Thanks in advance.