태그 보관물: svd

svd

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

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

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

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


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



답변

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

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

Xraw

n×p

n

p

μ

X

V

p×k

k

k

n×k

Z=XV

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

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

p

V⊤

X^=ZV⊤=XVV⊤

X^raw

μ

PCA reconstruction=PC scores⋅Eigenvectors⊤+Mean

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

X

VV⊤

p

VV⊤

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

z

x^=zV⊤

주요 PC 폐기 (제거)

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

V

V

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

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

Xraw

μ

σi

X^

σi

μ

이미지 처리 예

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

512×512

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

512×512

Xraw

X^raw

SVD 되돌리기

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

n×p

X

X=USV⊤

k

z

U

k

p

S1:k,1:k⊤V:,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  

답변