Sklearn PCA, как восстановить среднее значение в нижнем измерении? - PullRequest
2 голосов
/ 20 марта 2019

Этот вопрос касается того, как децентрировать и «восстановить» данные в более низком измерении после выполнения PCA.

Я делаю простой анализ главных компонентов с помощью sklearn.Насколько я понимаю, реализация должна заботиться о (1) центрировании данных при создании компонентов и (2) децентрировании данных после преобразования.Однако после преобразования данных они все еще центрируются.Как я могу проецировать данные в пространство меньшего размера, сохраняя характеристики исходных данных?Учитывая, что я буду уменьшать размерность для многомерных данных, у меня не будет подходящего среднего значения для каждого основного компонента, как его можно получить?

Сокращение 3 измерений до 2 измерений:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

X = np.array([[-1, -1, -1], [-2, -1, -1], [-3, -2, -3], [1, 1, 1], [2, 1, 2], [3, 2, 3]]) + 3
X.shape

(6, 3)

fig = plt.figure(figsize=(10, 8), dpi= 80, facecolor='w', edgecolor='k')
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X[:,0], X[:,1],X[:,2], '*')
plt.title('original')
plt.show()

enter image description here

PCA с 2 компонентами:

pca = PCA(n_components=2)
pca.fit(X)
X_trans =pca.transform(X)
X_trans.shape

(6, 2)

plt.plot(X_trans[:,0], X_trans[:,1], '*')
plt.show()

enter image description here

На этом этапе мне хотелось бы «восстановить»«Мои данные в этом более низком измерении, так что значения точек данных соответствуют исходным данным.Он все еще должен иметь только 2 измерения, но не должен быть центрирован вокруг среднего значения.

Выполнение обратного преобразования, как предлагается ниже, фактически возвращает меня к 3 измерениям

X_approx = pca.inverse_transform(X_trans) 
X_approx.shape

(6, 3)

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

1 Ответ

2 голосов
/ 20 марта 2019

Вы просто подбираете данные и наносите на график преобразованные данные.Чтобы вернуть исходные данные в более низкое измерение, вам нужно использовать inverse_transform, который возвращает исходные данные, как показано ниже на графике.Из документов :

inverse_transform (X)

Преобразование данных обратно в исходное пространство.

pca = PCA(n_components=2)
pca.fit(X)

X_trans =pca.transform(X)
X_original = pca.inverse_transform(X_trans)
plt.plot(X_original[:,0], X_original[:,1], 'r*')

enter image description here

...