PCA를 되돌리고 여러 주요 구성 요소에서 원래 변수를 재구성하는 방법은 무엇입니까?


113

PCA (Principal Component Analysis)를 사용하여 치수를 줄일 수 있습니다. 이러한 차원 축소가 수행 된 후 소수의 주요 구성 요소에서 원래 변수 / 기능을 어떻게 대략 재구성 할 수 있습니까?

또는 데이터에서 여러 주요 구성 요소를 어떻게 제거하거나 버릴 수 있습니까?

다시 말해 PCA를 어떻게 바꾸는가?


PCA가 SVD (Singular Value Decomposition)와 밀접한 관련이 있다고 가정하면 SVD를 어떻게 뒤집을 것인가?


10
이 Q & A 스레드를 게시하고 있습니다.이 질문에 대해 수십 개의 질문을보고이 주제에 대한 표준 스레드가 없기 때문에 중복으로 닫을 수 없기 때문에 피곤합니다. 괜찮은 답변을 가진 유사한 스레드가 여러 개 있지만 모두 R에 독점적으로 초점을 맞추는 것과 같이 심각한 제한이있는 것 같습니다.
amoeba

4
노력에 감사합니다. PCA에 대한 정보, 수행 대상, 수행하지 않은 작업, 하나 또는 여러 개의 고품질 스레드로 정보를 수집해야 할 필요가 있다고 생각합니다. 이 작업을 수행하기 위해 직접 사용해 주셔서 감사합니다.
Sycorax

1
이 정답 "정리"가 그 목적에 부합한다고 확신하지 않습니다. 우리가 여기있는 것은 훌륭하고 일반적인 질문과 답변이지만, 각 질문에는 실제로 여기서 잃어버린 PCA에 대한 미묘한 점이있었습니다. 본질적으로 당신은 모든 질문을 받고, PCA를 수행했으며, 때로는 풍부하고 중요한 세부 사항이 숨겨져있는 하위 주요 구성 요소를 버렸습니다. 게다가, 당신은 교과서 Linear Algebra 표기법으로 되돌아갔습니다. 이것은 R이라는 캐주얼 통계학 자의 언어를 사용하는 대신 PCA를 많은 사람들에게 불투명하게 만드는 것입니다.
Thomas Browne

1
@Thomas 감사합니다. 나는 우리가 그것을 논의하기 위해 행복 의견, 생각 채팅 또는 메타에 있습니다. 매우 간략하게 : (1) 실제로 각 질문에 개별적으로 답변하는 것이 더 나을 수도 있지만, 가혹한 현실은 그것이 일어나지 않는다는 것입니다. 아마 많은 질문에 대답하지 않은 채로있을 것입니다. (2) 이곳의 커뮤니티는 많은 사람들에게 유용한 일반적인 답변을 강력하게 선호합니다. 어떤 종류의 답변이 가장 많이지지되는지 확인할 수 있습니다. (3) 수학에 동의하지만, 여기에 R 코드를 줬습니다! (4) 링구아 프랑카에 대한 동의; 개인적으로, 나는 R을 모른다
amoeba

@amoeba 나는 전에 메타 토론에 참여한 적이 없기 때문에 대화를 찾는 방법을 모르겠습니다.
Thomas Browne

답변:


147

PCA는 공분산 행렬의 고유 벡터 ( "주축")를 계산하고 고유 값 (설명 된 분산의 양)을 기준으로 정렬합니다. 그런 다음 중심 데이터를 이러한 주축에 투영하여 주성분 ( "점수")을 산출 할 수 있습니다. 차원 축소를 위해 주요 구성 요소의 하위 집합 만 유지하고 나머지는 버릴 수 있습니다. ( PCA 에 대한 평신도의 소개 는 여기를 참조하십시오 .)

하자 될 와 데이터 매트릭스 행 (데이터 지점) 및 열 (변수 또는 기능). 각 행에서 평균 벡터 를 빼면 중심 데이터 행렬 얻습니다 . 를 우리가 사용하고자하는 고유 벡터 의 행렬로 하자 . 이들은 가장 큰 고유 값을 갖는 고유 벡터 일 것입니다. 그러면 PCA 프로젝션 의 행렬 ( "점수")은 로 간단히 제공됩니다 . n×pnpXrawn×pnpμXVp×kkkn×kZ=XV

아래 그림에 설명되어 있습니다. 첫 번째 서브 플롯에는 일부 중심 데이터 ( 링크 된 스레드에서 애니메이션 에 사용하는 것과 동일한 데이터 )와 첫 번째 주축의 투영이 표시됩니다. 두 번째 서브 플롯은이 투영의 값만 보여줍니다. 차원이 2에서 1로 감소되었습니다.

여기에 이미지 설명을 입력하십시오

이 하나의 주성분에서 원래의 두 변수를 재구성하기 위해 사용 하여 차원에 다시 매핑 할 수 있습니다 . 실제로, 각 PC의 값은 투영에 사용 된 것과 동일한 벡터에 위치해야합니다. 서브 플로트 1과 3을 비교합니다. 결과는 . 위의 세 번째 하위 플롯에 표시하고 있습니다. 최종 재구성 를 얻으려면 평균 벡터 를 추가해야 합니다.pVX^=ZV=XVVX^rawμ

PCA reconstruction=PC scoresEigenvectors+Mean

에 행렬 을 곱하여 첫 번째 서브 플롯에서 세 번째 서브 플롯으로 직접 이동할 수 있습니다 . 이를 투영 행렬 이라고합니다 . 모든 경우에 고유 벡터를 사용하는 다음 단위 행렬이다 (어떤 차원 축소는 수행되지 않으며, 따라서, "재구성"완벽). 고유 벡터의 부분 집합 만 사용하는 경우 동일하지 않습니다.XVVpVV

이것은 PC 공간에서 임의의 포인트 에서 작동 합니다. 통해 원래 공간에 매핑 될 수 있습니다 .zx^=zV

주요 PC 폐기 (제거)

때로는 선행 PC를 유지하고 나머지를 버리는 대신 (위와 같이) 일부 주요 PC를 폐기 (제거)하고 나머지를 유지하려고합니다. 이 경우 모든 공식은 정확히 동일 하지만 는 버리고 자하는 주축을 제외한 모든 주축으로 구성되어야합니다 . 즉, 는 항상 유지하려는 모든 PC를 포함해야합니다.VV

상관 관계에 대한 PCA에 대한 경고

PCA가 상관 행렬 (공분산 행렬이 아님)에 대해 수행 될 때 원시 데이터 는 를 빼서 중심을 둘뿐만 아니라 각 열을 표준 편차 로 나눠서 스케일됩니다 . 이 경우 원래 데이터를 재구성하려면 하여 의 열을 다시 스케일링 한 다음 평균 벡터 다시 추가해야합니다 .XrawμσiX^σiμ


이미지 처리 예

이 주제는 종종 이미지 처리와 관련하여 나타납니다. 이미지 처리 문헌의 표준 이미지 중 하나 인 Lenna를 고려하십시오 (링크를 따라 출처를 찾으십시오). 왼쪽 아래에이 이미지 의 회색조 변형이 표시됩니다 ( 여기에서 사용 가능한 파일 ).512×512

Lenna 이미지의 2 가지 그레이 스케일 버전.  오른쪽에있는 것은 거칠지 만 확실히 인식 할 수 있습니다.

이 그레이 스케일 이미지를 데이터 매트릭스 로 취급 할 수 있습니다 . PCA를 수행 하고 처음 50 개의 주요 구성 요소를 사용하여 를 계산합니다. 결과가 오른쪽에 표시됩니다.512×512XrawX^raw


SVD 되돌리기

PCA는 단일 값 분해 (SVD)와 밀접한 관련이 있습니다. SVD와 PCA의 관계를 참조하십시오 . SVD를 사용하여 PCA를 수행하는 방법? 상세 사항은. 경우 매트릭스 SVD-ED는 그대로 및 하나 선택하는 차원 벡터 은 "축소"의 지점 나타내는 - 공간을 의 측정 한 다음에 다시 매핑하는 하나와 곱해야 치수 .n×pXX=USVkzUkpS1:k,1:kV:,1:k


R, Matlab, Python 및 Stata의 예

Fisher Iris 데이터 에 대해 PCA를 수행 한 후 처음 두 가지 주요 구성 요소를 사용하여 재구성합니다. 상관 행렬이 아닌 공분산 행렬에서 PCA를 수행하고 있습니다. 즉, 여기서 변수를 스케일링하지 않습니다. 그러나 나는 여전히 평균을 다시 추가해야합니다. Stata와 같은 일부 패키지는 표준 구문을 통해 처리합니다. 코드에 대한 도움을 주신 @StasK와 @Kodiologist에게 감사합니다.

첫 번째 데이터 포인트의 재구성을 확인합니다.

5.1        3.5         1.4        0.2

MATLAB

load fisheriris
X = meas;
mu = mean(X);

[eigenvectors, scores] = pca(X);

nComp = 2;
Xhat = scores(:,1:nComp) * eigenvectors(:,1:nComp)';
Xhat = bsxfun(@plus, Xhat, mu);

Xhat(1,:)

산출:

5.083      3.5174      1.4032     0.21353

아르 자형

X = iris[,1:4]
mu = colMeans(X)

Xpca = prcomp(X)

nComp = 2
Xhat = Xpca$x[,1:nComp] %*% t(Xpca$rotation[,1:nComp])
Xhat = scale(Xhat, center = -mu, scale = FALSE)

Xhat[1,]

산출:

Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   5.0830390    3.5174139    1.4032137    0.2135317

이미지의 PCA 재구성에 대한 R 예제는 이 답변 도 참조하십시오 .

파이썬

import numpy as np
import sklearn.datasets, sklearn.decomposition

X = sklearn.datasets.load_iris().data
mu = np.mean(X, axis=0)

pca = sklearn.decomposition.PCA()
pca.fit(X)

nComp = 2
Xhat = np.dot(pca.transform(X)[:,:nComp], pca.components_[:nComp,:])
Xhat += mu

print(Xhat[0,])

산출:

[ 5.08718247  3.51315614  1.4020428   0.21105556]

이것은 다른 언어의 결과와 약간 다릅니다. 파이썬의 아이리스 데이터 셋 버전에 실수가 포함되어 있기 때문 입니다.

스타 타

webuse iris, clear
pca sep* pet*, components(2) covariance
predict _seplen _sepwid _petlen _petwid, fit
list in 1

  iris   seplen   sepwid   petlen   petwid    _seplen    _sepwid    _petlen    _petwid  
setosa      5.1      3.5      1.4      0.2   5.083039   3.517414   1.403214   .2135317  

1
MATLAB에서는 표준 PCA 출력에서 ​​mu를 검색 할 수 있으며 입력의 구성 요소 수를 제공 할 수도 있습니다.
Aksakal

2
@ Aksakal 나는 세 가지 코드 발췌문을 가능한 한 비슷하고 명확하게 만들려고 노력했다. 특히 pca ()를 호출하기 전에 수동으로 를 계산 하고 모든 구성 요소로 PCA를 실행하고 점수와 고유 벡터 사이의 내적을 수행 할 때 구성 요소 만 사용하고 싶었습니다 . 이제 동일한 패턴을 따르도록 Python 코드를 수정했습니다. μnComp
amoeba

3
귀여운 소녀의 이미지 및 이미지 처리와 같이 질문에 대한 직접적인 대답과 관련이없는 답변에서 모든 것을 제거합니다. 누군가 이미지에 관심이 없다면 소비를 어렵게 만듭니다. 질문을하는 사람은 이미 매우 혼란스러워합니다.
Aksakal

5
Lenna는 아이리스와 같은 표준 데이터 세트입니다.
StasK

2
@amoeba 테두리의 크기, 비트 깊이, 심지어 검은 픽셀에 대해서도 이야기했습니다. 최종 버전이 없습니다. http://www.ece.rice.edu/~wakin/images/ : "사용 가능한 Lena (일명"Lenna ") 테스트 이미지 버전이 여러 개있는 것 같습니다.이 문제는 Shapiro에 의해 지적되었습니다. 그의 1993 제로 트리 종이에, 그리고 "오늘 놀라운 사실 남아
로랑 듀발
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.