@amoeba 포함 PCA 질문에 훌륭한 대답했다 이 한 PCA에 SVD의 관계에있다. 정확한 질문에 대답하면 세 가지 점을 알려 드리겠습니다.
- 수학적으로 데이터 행렬에서 직접 또는 공분산 행렬에서 PCA를 계산하는지 여부에는 차이가 없습니다.
- 그 차이는 순전히 수치 정밀도와 복잡성 때문입니다. SVD를 데이터 행렬에 직접 적용하는 것은 공분산 행렬보다 수치 적으로 더 안정적입니다.
- SVD를 공분산 행렬에 적용하여 PCA를 수행하거나 고유 값을 얻을 수 있습니다. 실제로 고유 문제를 해결하는 것이 가장 좋아하는 방법입니다.
SVD는 특히 머신 러닝의 일반적인 고유 값 감소 절차보다 안정적입니다. 머신 러닝에서는 공 선형 회귀 분석을 쉽게 수행 할 수 있습니다. 이 경우 SVD가 더 잘 작동합니다.
요점을 시연하는 Python 코드가 있습니다. 나는 매우 공선적인 데이터 행렬을 만들고 공분산 행렬을 가져 와서 후자의 고유 값을 얻으려고했습니다. SVD는 여전히 작동하지만이 경우 일반적인 고유 분해는 실패합니다.
import numpy as np
import math
from numpy import linalg as LA
np.random.seed(1)
# create the highly collinear series
T = 1000
X = np.random.rand(T,2)
eps = 1e-11
X[:,1] = X[:,0] + eps*X[:,1]
C = np.cov(np.transpose(X))
print('Cov: ',C)
U, s, V = LA.svd(C)
print('SVDs: ',s)
w, v = LA.eig(C)
print('eigen vals: ',w)
산출:
Cov: [[ 0.08311516 0.08311516]
[ 0.08311516 0.08311516]]
SVDs: [ 1.66230312e-01 5.66687522e-18]
eigen vals: [ 0. 0.16623031]
최신 정보
Federico Poloni의 의견에 따라 SVD와 Eig의 안정성 테스트가 위의 동일한 행렬의 무작위 샘플 1000 개에 대한 코드가 있습니다. 많은 경우에, Eig는 0의 작은 고유 값을 보여주는데, 이는 행렬의 특이성을 초래할 것입니다. 그리고 SVD는 여기서하지 않습니다. SVD는 작은 고유 값 결정에서 두 배 정도 더 정확하며, 문제에 따라 중요하거나 중요하지 않을 수 있습니다.
import numpy as np
import math
from scipy.linalg import toeplitz
from numpy import linalg as LA
np.random.seed(1)
# create the highly collinear series
T = 100
p = 2
eps = 1e-8
m = 1000 # simulations
err = np.ones((m,2)) # accuracy of small eig value
for j in range(m):
u = np.random.rand(T,p)
X = np.ones(u.shape)
X[:,0] = u[:,0]
for i in range(1,p):
X[:,i] = eps*u[:,i]+u[:,0]
C = np.cov(np.transpose(X))
U, s, V = LA.svd(C)
w, v = LA.eig(C)
# true eigen values
te = eps**2/2 * np.var(u[:,1])*(1-np.corrcoef(u,rowvar=False)[0,1]**2)
err[j,0] = s[p-1] - te
err[j,1] = np.amin(w) - te
print('Cov: ',C)
print('SVDs: ',s)
print('eigen vals: ',w)
print('true small eigenvals: ',te)
acc = np.mean(np.abs(err),axis=0)
print("small eigenval, accuracy SVD, Eig: ",acc[0]/te,acc[1]/te)
산출:
Cov: [[ 0.09189421 0.09189421]
[ 0.09189421 0.09189421]]
SVDs: [ 0.18378843 0. ]
eigen vals: [ 1.38777878e-17 1.83788428e-01]
true small eigenvals: 4.02633695086e-18
small eigenval, accuracy SVD, Eig: 2.43114702041 3.31970128319
x1=ux2=u+εv
u,v(σ21σ21+ερσ1σ2σ21+ερσ1σ2σ21+2ερσ1σ2+ε2σ22σ2)
σ21,σ22,ρ - 유니폼과 그들 사이의 상관 관계 coeffient의 편차를.
λ=12(σ22ε2−σ42ε4+4σ32ρσ1ε3+8σ22ρ2σ21ε2+8σ2ρσ31ε+4σ41−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√+2σ2ρσ1ε+2σ21)
The small eigenvalue can't be calculated by simply plugging the
ε into formula due to limited precision, so you need to Taylor expand it:
λ≈σ22ε2(1−ρ2)/2
I run j=1,…,m simulations of the realizations of the data matrix, calculate the eigenvalues of the simulated covariance matrix λ^j, and obtain the errors ej=λ−λ^j.