в PCA вы go из n-мерного пространства в другое (повернутое) n-мерное пространство. Это изменение выполняется с использованием матрицы nxn
Это действительно матрица, возвращаемая pca.components_
; при умножении на PCA-преобразованные данные это дает реконструкцию исходных данных X.
Вот демонстрация с данными радужной оболочки:
import numpy as np
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
X = load_iris().data
mu = np.mean(X, axis=0) # mean value
pca = PCA()
X_pca = pca.fit_transform(X)
M = pca.components_
M
# result:
array([[ 0.36138659, -0.08452251, 0.85667061, 0.3582892 ],
[ 0.65658877, 0.73016143, -0.17337266, -0.07548102],
[-0.58202985, 0.59791083, 0.07623608, 0.54583143],
[-0.31548719, 0.3197231 , 0.47983899, -0.75365743]])
т.е. матрица 4x4 (радужная оболочка) данные имеют 4 функции).
Давайте восстановим исходные данные, используя все ПК:
X_hat = np.matmul(X_pca, M)
X_hat = X_hat + mu # add back the mean
print(X_hat[0]) # reconstructed
print(X_[0]) # original
Результат:
[5.1 3.5 1.4 0.2]
[5.1 3.5 1.4 0.2]
т.е. идеальная реконструкция.
Реконструкция с меньшим количеством ПК, скажем, 2 (из 4):
n_comp = 2
X_hat2 = np.matmul(X_pca[:,:n_comp], pca.components_[:n_comp,:])
X_hat2 = X_hat2 + mu
print(X_hat2[0])
Результат:
[5.08303897 3.51741393 1.40321372 0.21353169]
т.е. менее точная реконструкция, как и следовало ожидать из-за усечения в использованные ПК (2 вместо всех 4).
(Код адаптирован из большого потока Как преобразовать PCA и восстановить исходные переменные из нескольких основных компонентов? при перекрестной проверке.)