numpy 및 sklearn의 PCA는 다른 결과를 생성합니다


21

내가 뭔가를 오해하고 있습니까? 이것은 내 코드입니다

sklearn을 사용하여

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import decomposition
from sklearn import datasets
from sklearn.preprocessing import StandardScaler

pca = decomposition.PCA(n_components=3)

x = np.array([
        [0.387,4878, 5.42],
        [0.723,12104,5.25],
        [1,12756,5.52],
        [1.524,6787,3.94],
    ])
pca.fit_transform(x)

산출:

array([[ -4.25324997e+03,  -8.41288672e-01,  -8.37858943e-03],
   [  2.97275001e+03,  -1.25977271e-01,   1.82476780e-01],
   [  3.62475003e+03,  -1.56843494e-01,  -1.65224286e-01],
   [ -2.34425007e+03,   1.12410944e+00,  -8.87390454e-03]])

numpy 메소드 사용

x_std = StandardScaler().fit_transform(x)
cov = np.cov(x_std.T)
ev , eig = np.linalg.eig(cov)
a = eig.dot(x_std.T)

산출

array([[ 0.06406894,  0.94063993, -1.62373172],
   [-0.35357757,  0.7509653 ,  0.63365168],
   [ 0.29312477,  0.6710958 ,  1.11766206],
   [-0.00361615, -2.36270102, -0.12758202]])
I have kept all 3 components but it doesnt seem to allow me to retain my original data.

왜 그런지 알 수 있습니까?

원래의 매트릭스를 되 찾으려면 어떻게해야합니까?


numpy 코드가 잘못된 IMHO입니다 (또한 X정의되지 않은 코드를 사용합니다 ). 수학을 다시 확인하십시오 .
익명-무스

ipython 노트북을 사용하고 있으므로 셀로만 복사 할 수 있습니다. 내 수학이 틀렸어? @ Anony-Mousse
aceminer

@ Anony-Mousse 네, 내 실수를 깨달았지만 여전히 일치하지 않습니다
aceminer

@aceminer 왜 x_std가 아닌 x_std.T의 공분산 행렬을 계산하는지 궁금합니다.
Evgeni Nabokov

@EvgeniNabokov 너무 오래되었습니다. Sry 나는 이미 기억할 수 없다
aceminer

답변:


21

차이점은 decomposition.PCAPCA를 수행하기 전에 변수를 표준화하지 않지만 수동 계산 StandardScaler에서는 표준화를 수행하기 위해 호출 하기 때문입니다. 따라서 이러한 차이를 관찰하고 있습니다. 상관 또는 공분산에 대한 PCA?

교체하면

pca.fit_transform(x)

x_std = StandardScaler().fit_transform(x)
pca.fit_transform(x_std)

수동 계산과 동일한 결과를 얻을 수 있습니다 ...

...하지만 PC 순서까지만. 당신이 실행할 때 때문입니다

ev , eig = np.linalg.eig(cov)

고유 값이 반드시 내림차순으로 표시되는 것은 아닙니다. 나는 얻다

array([ 0.07168571,  2.49382602,  1.43448827])

따라서 수동으로 주문하고 싶을 것입니다. Sklearn은 당신을 위해 그렇게합니다.


원래 변수 재구성에 대해서는 PCA를 되돌리고 여러 주요 구성 요소에서 원래 변수를 재구성하는 방법을 참조하십시오 .


그냥 확인하고 싶습니다. 표준 편차로 행렬을 표준화해야합니까? 나는 그들이 그것을하지 않는 예를 보았다
aceminer

필요 하지 않습니다. 단지 한 가지 방법 일뿐입니다. 첫 번째 단락 인 stats.stackexchange.com/questions/53 에있는 링크를 참조하십시오. 실제로이 질문에 관한 것입니다. 표준화하면 상관 관계에 대한 PCA를 수행합니다. 그렇지 않으면 공분산에서 PCA를 수행합니다.
amoeba는 Reinstate Monica

9

다음 은 파이썬에서 PCA에 대한 토론과 설명으로 멋진 구현입니다. 이 구현은 scikit PCA와 동일한 결과를 가져옵니다. 이것은 PCA가 잘못되었다는 또 다른 지표입니다.

import numpy as np
from scipy import linalg as LA

x = np.array([
        [0.387,4878, 5.42],
        [0.723,12104,5.25],
        [1,12756,5.52],
        [1.524,6787,3.94],
    ])

#centering the data
x -= np.mean(x, axis = 0)  

cov = np.cov(x, rowvar = False)

evals , evecs = LA.eigh(cov)

고유 값 (및 고유 벡터)을 내림차순으로 정렬해야합니다.

idx = np.argsort(evals)[::-1]
evecs = evecs[:,idx]
evals = evals[idx]

a = np.dot(x, evecs) 

일반적으로 간단한 예제 (가능한 한 간단하게)를 구현하고 올바른 결과 (및 중간 결과)를 직접 계산하여 코드를 확인하는 것이 좋습니다. 문제를 식별하는 데 도움이됩니다.


1
이 답변을 좋아하십시오. 내 문제를 해결했다!
진화 왕
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.