Search code examples
pythonmachine-learningscikit-learnpca

fit_transform PCA inconsistent results


I am trying to do PCA from sklearn with n_components = 5. I apply the dimensionality reduction on my data using fit_transform(data).

Initially I tried to do the classical matrix multiplication between pca.components_ values and my x_features data, but the results are different. So I am wether doing my multiplication incorrectly or I did not understand how fit_transform work.

Below is a mock-up to compare classic matrix multiplication and fit_transform:

import numpy as np
from sklearn import decomposition
np.random.seed(0)
my_matrix = np.random.randn(100, 5)`

mdl = decomposition.PCA(n_components=5)
mdl_FitTrans = mdl.fit_transform(my_matrix)
pca_components = mdl.components_
mdl_FitTrans_manual = np.dot(pca_components, my_matrix.transpose())
mdl_FitTrans_manualT = mdl_FitTrans_manual.transpose()

I am expecting mdl_FitTrans == mdl_FitTrans_manual but the result is False.


Solution

  • Check out, how the transform() method is implemented in sklearn: https://github.com/scikit-learn/scikit-learn/blob/a5ab948/sklearn/decomposition/base.py#L101

    According to it, manual reduction is done as following:

    import numpy as np
    from sklearn import decomposition
    np.random.seed(0)
    data = np.random.randn(100, 100)
    mdl = decomposition.PCA(n_components=5)
    mdl_fit = mdl.fit(data)
    data_transformed = mdl_fit.transform(data)
    data_transformed_manual = np.dot(data - mdl_fit.mean_, mdl.components_.T)
    
    np.all(data_transformed == data_transformed_manual)
    
    True