Я уже могу заметить несколько отличий.
Для одного:
n=300
projections = only_2.dot(eigenvec[:,:n])
Xhat = np.dot(projections, eigenvec[:,:n].T)
Xhat += mu_D
plt.imshow(Xhat[5].reshape(28,28),cmap='Greys',interpolation='nearest')
Я пытаюсь подчеркнуть следующее: если мое понимание верно n = 300
, выпытаясь подобрать 300 собственных векторов, чьи собственные значения переходят от высокого к низкому.
Но в sklearn
from sklearn.decomposition import PCA
pca = PCA(n_components=1)
pca.fit(only_2)
data_reduced = np.dot(only_2, pca.components_.T) # transform
data_original = np.dot(data_reduced, pca.components_) # invers
Мне кажется, что вы подбираете только ПЕРВЫЙ компонент (компонент, которыймаксимизирует дисперсию), и вы не берете все 300.
Далее больше:
Я могу однозначно сказать, что вы, похоже, понимаете, что происходит в PCA, но у вас возникают проблемыреализуя это.Поправьте меня, если я ошибаюсь, но:
data_reduced = np.dot(only_2, pca.components_.T) # transform
data_original = np.dot(data_reduced, pca.components_) # inverse_transform
В этой части вы пытаетесь спроецировать ваши собственные векторы на ваши данные, что вы должны делать в PCA, но в sklearn
, чтовы должны сделать следующее:
import numpy as np
from sklearn.decomposition import PCA
pca = PCA(n_components=300)
pca.fit_transform(only_2)
Если бы вы могли рассказать мне, как вы создали only_2
, я могу дать вам более конкретный ответ завтра.
Вот что sklearn
говорит о fit_transform
для PCA: http://scikit -learn.org / stable / modules / generate / sklearn.decomposition.PCA.html # sklearn.decomposition.PCA.fit_transform :
fit_transform(X, y=None)
Fit the model with X and apply the dimensionality reduction on X.
Parameters:
X : array-like, shape (n_samples, n_features)
Training data, where n_samples is the number of samples and n_features is the number of features.
y : Ignored
Returns:
X_new : array-like, shape (n_samples, n_components)