为什么基于稀疏数据的协方差矩阵的 eigen 和 svd 分解会产生不同的结果?

机器算法验证 r svd 特征值
2022-03-17 10:13:42

我正在尝试基于稀疏/间隙数据集分解协方差矩阵。我注意到用 计算的 lambda 之和(解释方差)svd正随着越来越多的数据而被放大。没有差距,svdeigen产生相同的结果。

eigen分解似乎不会发生这种情况。我一直倾向于使用svd,因为 lambda 值总是正数,但这种趋势令人担忧。是否需要应用某种更正,或者我应该svd完全避免这样的问题。

###Make complete and gappy data set
set.seed(1)
x <- 1:100
y <- 1:100
grd <- expand.grid(x=x, y=y)

#complete data
z <- matrix(runif(dim(grd)[1]), length(x), length(y))
image(x,y,z, col=rainbow(100))

#gappy data
zg <- replace(z, sample(seq(z), length(z)*0.5), NaN)
image(x,y,zg, col=rainbow(100))


###Covariance matrix decomposition
#complete data
C <- cov(z, use="pair")
E <- eigen(C)
S <- svd(C)

sum(E$values)
sum(S$d)
sum(diag(C))


#gappy data (50%)
Cg <- cov(zg, use="pair")
Eg <- eigen(Cg)
Sg <- svd(Cg)

sum(Eg$values)
sum(Sg$d)
sum(diag(Cg))



###Illustration of amplification of Lambda
set.seed(1)
frac <- seq(0,0.5,0.1)
E.lambda <- list()
S.lambda <- list()
for(i in seq(frac)){
    zi <- z
    NA.pos <- sample(seq(z), length(z)*frac[i])
    if(length(NA.pos) > 0){
        zi <- replace(z, NA.pos, NaN)
    }
    Ci <- cov(zi, use="pair")
    E.lambda[[i]] <- eigen(Ci)$values
	S.lambda[[i]] <- svd(Ci)$d
}


x11(width=10, height=5)
par(mfcol=c(1,2))
YLIM <- range(c(sapply(E.lambda, range), sapply(S.lambda, range)))

#eigen
for(i in seq(E.lambda)){
    if(i == 1) plot(E.lambda[[i]], t="n", ylim=YLIM, ylab="lambda", xlab="", main="Eigen Decomposition")
    lines(E.lambda[[i]], col=i, lty=1)
}
abline(h=0, col=8, lty=2)
legend("topright", legend=frac, lty=1, col=1:length(frac), title="fraction gaps")

    #svd
for(i in seq(S.lambda)){
    if(i == 1) plot(S.lambda[[i]], t="n", ylim=YLIM, ylab="lambda", xlab="", main="Singular Value Decomposition")
    lines(S.lambda[[i]], col=i, lty=1)
}
abline(h=0, col=8, lty=2)
legend("topright", legend=frac, lty=1, col=1:length(frac), title="fraction gaps")

在此处输入图像描述

1个回答

您需要对特征值的绝对值求和,即 sum(abs(Eg$values)) 并将其与奇异值的总和进行比较。他们将是平等的。

原因是如果将对应于负特征值的行或列与相乘,则新矩阵的特征值变为正值,并且特征向量的正交性不会受到干扰。1

这个美丽定理的逆证明出现在普林斯顿大学(现在罗格斯大学)的《革命双曲面的代数》中,Javier F. Cabrera,线性代数及其应用。

另一种推理方式是 sqrt(eigen(t(Cg) %*% Cg)) 等于 Cg 的奇异值。但是当特征值为负时,数据必须以厄米形式表示,并考虑复平面,这是原始公式中遗漏的,即由具有负特征的矩阵的对称平方根形成的数据values 会有复杂的条目。