Разница в реализации PCA между NumPy и SKLEARN - PullRequest
0 голосов
/ 30 сентября 2018
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets('data/MNIST/', one_hot=True)

реализация numpy

# Entire Data set
Data=np.array(mnist.train.images)
#centering the data
mu_D=np.mean(Data, axis=0)
Data-=mu_D


COV_MA = np.cov(Data, rowvar=False)
eigenvalues, eigenvec=scipy.linalg.eigh(COV_MA, eigvals_only=False)
together = zip(eigenvalues, eigenvec)
together = sorted(together, key=lambda t: t[0], reverse=True)
eigenvalues[:], eigenvec[:] = zip(*together)


n=3
pca_components=eigenvec[:,:n]
print(pca_components.shape)
data_reduced = Data.dot(pca_components)
print(data_reduced.shape)
data_original = np.dot(data_reduced, pca_components.T) # inverse_transform
print(data_original.shape)


plt.imshow(data_original[10].reshape(28,28),cmap='Greys',interpolation='nearest')

реализация sklearn

from sklearn.decomposition import PCA

pca = PCA(n_components=3)
pca.fit(Data)

data_reduced = np.dot(Data, pca.components_.T) # transform
data_original = np.dot(data_reduced, pca.components_) # inverse_transform
plt.imshow(data_original[10].reshape(28,28),cmap='Greys',interpolation='nearest')

Я бы хотел реализовать алгоритмы PCA, используяNumPy.Однако я не знаю, как восстановить изображения из этого, и я даже не знаю, правильный ли этот код.

На самом деле, когда я использовал sklearn.decomposition.PCA, результат отличался от простой реализации.

Можете ли вы объяснить различия?

1 Ответ

0 голосов
/ 30 сентября 2018

Я уже могу заметить несколько отличий.

Для одного:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...