[Python] Discrepancy in Signs Between scikit-learn PCA and Custom PCA Implementation

Discussão em 'Python' iniciado por Stack, Março 23, 2025.

  1. Stack

    Stack Membro Participativo

    I’m implementing my own version of PCA and comparing it with scikit-learn's PCA. However, I’m noticing a discrepancy in the signs of the principal components.

    Using scikit-learn

    scaler = StandardScaler()
    scaled_data = scaler.fit_transform(data)

    pca_scaled = PCA(n_components=2)
    pca_scaled.fit(scaled_data)

    principal_components = pca_scaled.components_


    Output:

    [[ 0.70710678 0.70710678]
    [-0.70710678 0.70710678]]


    Custom PCA

    def custom_PCA(data, num_components):
    mean = np.mean(data, axis=0)
    std = np.std(data, axis=0)
    X_standardized = (data - mean) / std

    cov_matrix = np.cov(X_standardized, rowvar=False)

    eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)

    return eigenvectors


    Output:

    [[ 0.70710678 -0.70710678]
    [ 0.70710678 0.70710678]]


    Why the signs are flipped?

    scikit-learn:
    [[ 0.70710678 0.70710678]
    [-0.70710678 0.70710678]]

    Custom PCA:
    [[ 0.70710678 -0.70710678]
    [ 0.70710678 0.70710678]]

    Continue reading...

Compartilhe esta Página