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()