@amoebaは、SVDとPCAの関係に関するこの質問を含む、PCAの質問に対する優れた回答を持っています。あなたの正確な質問に答えるには、3つのポイントを挙げます。
- 数学的には、データ行列で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のコメントに答えて、上記と同じマトリックスの1000個のランダムサンプルでのSVD対Eigの安定性テストのコードを示します。多くの場合、Eigは0の小さな固有値を示します。これにより、行列の特異性が生じますが、SVDはここでそれを行いません。SVDは、小さな固有値の決定で約2倍正確になります。これは、問題に応じて重要な場合と重要でない場合があります。
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
バツ1= あなたバツ2= U + ε V
あなた、v(σ21σ21+ ε ρ σ1σ2σ21+ ε ρ σ1σ2σ21+ 2 ε ρ σ1σ2+ ε2σ22σ2)
σ21、σ22、ρ
λ = 12(σ22ε2- σ42ε4+ 4 σ32ρ σ1ε3+ 8 σ22ρ2σ21ε2+ 8 σ2ρ σ31ε + 4 σ41−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√+ 2 σ2ρ σ1ε + 2 σ21)
ελ ≈ σ22ε2(1 - ρ2)/ 2
j = 1 、… 、mλ^jej= λ − λ^j