Estou entendendo algo errado. Este é o meu código
usando o sklearn
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import decomposition
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
pca = decomposition.PCA(n_components=3)
x = np.array([
[0.387,4878, 5.42],
[0.723,12104,5.25],
[1,12756,5.52],
[1.524,6787,3.94],
])
pca.fit_transform(x)
Resultado:
array([[ -4.25324997e+03, -8.41288672e-01, -8.37858943e-03],
[ 2.97275001e+03, -1.25977271e-01, 1.82476780e-01],
[ 3.62475003e+03, -1.56843494e-01, -1.65224286e-01],
[ -2.34425007e+03, 1.12410944e+00, -8.87390454e-03]])
Usando métodos numpy
x_std = StandardScaler().fit_transform(x)
cov = np.cov(x_std.T)
ev , eig = np.linalg.eig(cov)
a = eig.dot(x_std.T)
Resultado
array([[ 0.06406894, 0.94063993, -1.62373172],
[-0.35357757, 0.7509653 , 0.63365168],
[ 0.29312477, 0.6710958 , 1.11766206],
[-0.00361615, -2.36270102, -0.12758202]])
I have kept all 3 components but it doesnt seem to allow me to retain my original data.
Posso saber por que é assim?
Se eu quiser recuperar minha matriz original, o que devo fazer?
pca
python
scikit-learn
aceminador
fonte
fonte
X
que não está definido). Verifique novamente sua matemática .Respostas:
A diferença é
decomposition.PCA
que não padroniza suas variáveis antes de executar o PCA, enquanto em seu cálculo manual você solicitaStandardScaler
a padronização. Portanto, você está observando essa diferença: PCA em correlação ou covariância?Se você substituir
com
você obterá o mesmo resultado do cálculo manual ...
... mas apenas na ordem dos PCs. Isso porque quando você corre
você obtém valores próprios, não necessariamente na ordem decrescente. eu recebo
Então você vai querer encomendá-los manualmente. O Sklearn faz isso por você.
Em relação à reconstrução de variáveis originais, consulte Como reverter o PCA e reconstruir variáveis originais de vários componentes principais?
fonte
Aqui está uma boa implementação com discussão e explicação do PCA em python. Essa implementação leva ao mesmo resultado que o scikit PCA. Esse é outro indicador de que seu PCA está errado.
você precisa classificar os autovalores (e autovetores de acordo) descendentes
Geralmente, recomendo que você verifique seu código implementando um exemplo simples (o mais simples possível) e calculando manualmente os resultados corretos (e resultados intermediários). Isso ajuda você a identificar o problema.
fonte