@amoeba对PCA问题有很好的答案,包括关于SVD与PCA的关系这一问题。回答您的确切问题,我将提出三点意见:
- 在数学上,您是直接在数据矩阵上还是在其协方差矩阵上计算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)
ελ≈σ22ε2(1−ρ2)/2
j=1,…,mλ^jej=λ−λ^j