¿Por qué las descomposiciones eigen y svd de una matriz de covarianza basada en datos dispersos producen resultados diferentes?

12

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, svdy eigenarrojar los mismos resultados.

Esto no parece suceder con una eigendescomposición. Me había inclinado hacia el uso svdporque 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 svdpor 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")

ingrese la descripción de la imagen aquí

Marc en la caja
fuente
Lamento no poder seguir su código (no sé R), pero aquí hay una o dos nociones. Los valores propios negativos pueden aparecer en la descomposición propia de un cov. matriz si los datos sin procesar tenían muchos valores faltantes y se eliminaron por pares al calcular el cov. La SVD de dicha matriz informará (de manera engañosa) esos valores propios negativos como positivos. Sus imágenes muestran que las descomposiciones de eigen y svd se comportan de manera similar (si no exactamente igual) además de esa única diferencia con respecto a los valores negativos.
ttnphns
1
PD Espero que me hayas entendido: la suma de los valores propios debe ser igual a la traza (suma diagonal) del cov. matriz. Sin embargo, SVD es "ciego" al hecho de que algunos valores propios pueden ser negativos. La SVD rara vez se usa para descomponer cov no gramian. matriz, se utiliza típicamente o bien con la matriz a sabiendas gramian (semidefinida positiva) o con datos en bruto
ttnphns
1
@ttnphns: gracias por su comprensión. Supongo que no estaría tan preocupado por el resultado dado svdsi 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.
Marc en la caja el

Respuestas:

4

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.

1

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.

coche fúnebre
fuente
1
Muchas gracias por esta explicación. Era consciente de la relación entre eigen y svd, pero no sabía que aún estarían relacionados dadas las diferencias mencionadas anteriormente en la descomposición de la matriz original. Es curioso: hasta donde puedo decir, una descomposición propia dará valores negativos cuando una matriz no es "positiva definida". ¿Es este el caso con todas las matrices de covarianza basadas en datos breves?
Marc en la caja el
1
Marc, la definición positiva de una matriz simétrica real es equivalente a tener todos los valores propios positivos. No existe una relación estrecha con los "datos breves", entendiendo que significa matrices dispersas con muchas entradas cero. Después de todo, las más dispersas entre las matrices no singulares (simétricas o no) son las diagonales, que exhiben sus valores propios como sus entradas.
whuber
@whuber - gracias por tu comentario. En este caso, interpreto "gappy" de manera diferente a "escaso" en el sentido de que los no valores son NaN y no 0 (cero). Por lo tanto, los valores de covarianza se escalan por el número de valores comunes (es decir, divididos por n-1). A ese respecto, no creo que la matriz de covarianza en realidad contuviera ceros.
Marc en la caja el
1
Encontrar una manera incluso de estimar la matriz de covarianza a partir de estos datos faltantes es un desafío: hace mucho tiempo hice una pregunta similar y recibí algunas respuestas estimulantes.
whuber
He hecho una pregunta adicional sobre mi interés en el tema para el uso en el análisis de la función empírica ortogonal (EOF) aquí: stats.stackexchange.com/questions/34832/…
Marc en la casilla