PCA матрица со склеарном - PullRequest
       22

PCA матрица со склеарном

0 голосов
/ 18 апреля 2020

Я сделал PCA на некоторых данных, и я хочу извлечь матрицу PCA. Это мой код (исключая загрузку данных):

from sklearn.decomposition import PCA
pca = PCA(n_components=5)
pca_result = pca.fit_transform(recon.data.cpu().numpy())
M = pca.components_

Я думал, что М должна быть матрицей PCA. Однако, когда я печатаю pca_result (первые несколько строк), я получаю это:

[-21.08167   ,  -5.67821   ,   0.17554353,  -0.732398  ,0.04658243],
[-25.936056  ,  -6.535223  ,   0.6887493 ,  -0.8394666 ,0.06557591],
[-30.755266  ,  -6.0098953 ,   1.1643354 ,  -0.82322127,0.07585468]

Но когда я печатаю np.transpose(np.matmul(M,np.transpose(recon))), я получаю это:

[-27.78438   ,  -2.5913327 ,   0.87771094,  -1.0819707 ,0.1037216 ],
[-32.63887   ,  -3.4483302 ,   1.3909296 ,  -1.1890743 ,0.12274324],
[-37.45802   ,  -2.9229708 ,   1.8665184 ,  -1.1728177 ,0.13301012]

Что я делаю неправильно и как мне получить реальную матрицу PCA? Спасибо!

1 Ответ

1 голос
/ 18 апреля 2020

в 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 и восстановить исходные переменные из нескольких основных компонентов? при перекрестной проверке.)

...