Estoy tratando de descomponer una matriz de covarianza basada en un conjunto de datos dispersos / breves. Me doy cuenta de que la suma de lambda (varianza explicada), según se calcula con svd
, se amplifica con datos cada vez más vacíos. Sin huecos, svd
y eigen
arrojar los mismos resultados.
Esto no parece suceder con una eigen
descomposición. Me había inclinado hacia el uso svd
porque los valores lambda siempre son positivos, pero esta tendencia es preocupante. ¿Hay algún tipo de corrección que deba aplicarse, o debería evitarlo svd
por completo?
###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")
r
svd
eigenvalues
Marc en la caja
fuente
fuente
svd
si no fuera por la forma diferente de los valores propios. El resultado obviamente está dando más importancia a los valores propios finales de lo que debería.Respuestas:
Debe hacer la suma del valor absoluto de los valores propios, es decir, suma (abs (por ejemplo, valores $)) y compararlo con la suma de los valores singulares. Serían iguales.
La prueba de lo contrario de este hermoso teorema apareció en El álgebra de los hiperboloides de la revolución, Javier F. Cabrera, Álgebra lineal y sus aplicaciones, Universidad de Princeton (ahora en Rutgers).
Otra forma de razonar esto es por el hecho de que sqrt (eigen (t (Cg)% *% Cg)) son iguales a los valores singulares de Cg. Pero cuando los valores propios son negativos, los datos deben representarse en forma hermitiana teniendo en cuenta el plano complejo, que es lo que se perdió en la formulación original, es decir, los datos formados por la raíz cuadrada simétrica de la matriz con un origen negativo. los valores tendrían entradas complejas.
fuente