1 votos

Ayuda para entender el PCA

Siempre asumí que el PCA es exactamente la descomposición en valores propios de la matriz de covarianza. Es decir, las varianzas explicadas son los valores propios de la matriz de covarianza, y los componentes son sus eigenvectores. Para poner a prueba mi comprensión, he implementado PCA tanto usando la lógica anterior como usando una biblioteca existente. Los resultados se ven diferentes. ¿Alguien puede explicar por qué? ¿Hay una brecha en mi comprensión, o es un error en el código?

nDim = 20
nData = 1000

def naive_pca(d):
    return np.sort(np.linalg.eig(np.cov(d))[0])[::-1]

data = np.random.uniform(0,1,(nDim, nData))

pca = PCA(n_components=nDim)
pca.fit(data)

fig, ax = plt.subplots(ncols=3, figsize=(12,4))
ax[0].plot(pca.explained_variance_)
ax[1].plot(pca.singular_values_)
ax[2].plot(naive_pca(data))
ax[0].set_title("PCA: varianza explicada")
ax[1].set_title("PCA: valores singulares")
ax[2].set_title("valores propios de la covarianza")
plt.show()

introducir descripción de la imagen aquí

1voto

Dipstick Puntos 4869

Has estropeado las columnas. Scikit-learn asume que las características están en columnas, numpy utiliza rowvar=True como predeterminado:

np.random.seed(42)
nDim = 20
nData = 1000

def naive_pca(d):
    return np.sort(np.linalg.eig(np.cov(d))[0])[::-1]

data = np.random.uniform(0,1,(nDim, nData))

pca = PCA(n_components=nDim)
pca.fit(data.T)  # <----- AQUÍ

fig, ax = plt.subplots(ncols=3, figsize=(12,4))
ax[0].plot(pca.explained_variance_)
ax[1].plot(pca.singular_values_)
ax[2].plot(naive_pca(data))
ax[0].set_title("PCA: varianza explicada")
ax[1].set_title("PCA: valores singulares")
ax[2].set_title("autovalores de la covarianza")
plt.show()

introduce la descripción de la imagen aquí

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X