주성분 분석 (PCA)은 공분산 행렬의 고유 분해를 통해 설명됩니다. 그러나 데이터 행렬 의 단일 값 분해 (SVD)를 통해 수행 할 수도 있습니다 . 어떻게 작동합니까? 이 두 가지 방법의 관계는 무엇입니까? SVD와 PCA의 관계는 무엇입니까?
즉, 데이터 행렬의 SVD를 사용하여 차원 축소를 수행하는 방법은 무엇입니까?
주성분 분석 (PCA)은 공분산 행렬의 고유 분해를 통해 설명됩니다. 그러나 데이터 행렬 의 단일 값 분해 (SVD)를 통해 수행 할 수도 있습니다 . 어떻게 작동합니까? 이 두 가지 방법의 관계는 무엇입니까? SVD와 PCA의 관계는 무엇입니까?
즉, 데이터 행렬의 SVD를 사용하여 차원 축소를 수행하는 방법은 무엇입니까?
답변:
데이터 행렬 를 크기로 설정하십시오. 여기서 은 샘플 수이고 는 변수 수입니다. 중심 이 있다고 가정합시다 . 즉, 열 평균을 빼고 이제 0과 같습니다. N × P는 n 개의 페이지
그런 다음 공분산 행렬 는 됩니다. 대칭 행렬이므로 대각선으로 나타낼 수 있습니다. 여기서 는 고유 벡터 행렬 (각 열은 고유 벡터)이고 은 대각선 에서 내림차순 으로 고유 값이 대각선 행렬 . 고유 벡터를 데이터의 주축 또는 주 방향 이라고합니다. 주축의 데이터 투영을 주성분 이라고하며 PC 점수 라고도 함C C = X ⊤ X / ( n - 1 ) C = V L V ⊤ , V L λ i j j X V i i X V
이제 의 특이 값 분해를 수행 하면 분해 을 얻습니다 여기서 는 단일 행렬이고 는 대각선 행렬입니다. 특이 값 . 여기에서 즉 오른쪽 특이 벡터 는 주 방향이며 특이 값은 를 통해 공분산 행렬의 고유 값과 . 주요 구성 요소는X = U S V ⊤ , U S s i C = V S U ⊤ U S V ⊤ / ( n - 1 ) = V S 2
요약:
SVD와 PCA의 직관적 인 관계는 무엇입니까? 수학에서 매우 인기 있고 비슷한 스레드입니다.
데이터의 SVD를 통해 PCA가 필요한 이유는 무엇입니까? -SVD를 통해 PCA를 수행하면 어떤 이점이 있는지에 대한 토론 [단기 답변 : 수치 안정성].
Biplot과 관련한 PCA 및 통신 분석-SVA를 기반으로하는 일부 고유 기술의 맥락에서 PCA.
PCA에 비해 SVD의 장점이 있습니까? -PCA 대신 SVD 를 사용할 때 어떤 이점이 있는지 묻는 질문 [짧은 답변 : 잘못된 질문].
주요 구성 요소 분석, 고유 벡터 및 고유 값 이해-PCA에 대한 비 기술적 설명을 제공하는 대답입니다. 주의를 끌기 위해 여기에 하나의 그림을 재현합니다.
@amoeba의 답변과 함께 제공되는 Python & Numpy 스 니펫을 작성했으며 누군가에게 유용 할 수 있도록 여기에 남겨 둡니다. 의견은 대부분 @amoeba의 답변에서 가져온 것입니다.
import numpy as np
from numpy import linalg as la
np.random.seed(42)
def flip_signs(A, B):
"""
utility function for resolving the sign ambiguity in SVD
http://stats.stackexchange.com/q/34396/115202
"""
signs = np.sign(A) * np.sign(B)
return A, B * signs
# Let the data matrix X be of n x p size,
# where n is the number of samples and p is the number of variables
n, p = 5, 3
X = np.random.rand(n, p)
# Let us assume that it is centered
X -= np.mean(X, axis=0)
# the p x p covariance matrix
C = np.cov(X, rowvar=False)
print "C = \n", C
# C is a symmetric matrix and so it can be diagonalized:
l, principal_axes = la.eig(C)
# sort results wrt. eigenvalues
idx = l.argsort()[::-1]
l, principal_axes = l[idx], principal_axes[:, idx]
# the eigenvalues in decreasing order
print "l = \n", l
# a matrix of eigenvectors (each column is an eigenvector)
print "V = \n", principal_axes
# projections of X on the principal axes are called principal components
principal_components = X.dot(principal_axes)
print "Y = \n", principal_components
# we now perform singular value decomposition of X
# "economy size" (or "thin") SVD
U, s, Vt = la.svd(X, full_matrices=False)
V = Vt.T
S = np.diag(s)
# 1) then columns of V are principal directions/axes.
assert np.allclose(*flip_signs(V, principal_axes))
# 2) columns of US are principal components
assert np.allclose(*flip_signs(U.dot(S), principal_components))
# 3) singular values are related to the eigenvalues of covariance matrix
assert np.allclose((s ** 2) / (n - 1), l)
# 8) dimensionality reduction
k = 2
PC_k = principal_components[:, 0:k]
US_k = U[:, 0:k].dot(S[0:k, 0:k])
assert np.allclose(*flip_signs(PC_k, US_k))
# 10) we used "economy size" (or "thin") SVD
assert U.shape == (n, p)
assert S.shape == (p, p)
assert V.shape == (p, p)