Por que as decomposições de eigen e svd de uma matriz de covariância baseadas em dados esparsos estão produzindo resultados diferentes?

12

Estou tentando decompor uma matriz de covariância com base em um conjunto de dados esparsos / gappy. Estou percebendo que a soma do lambda (variação explicada), conforme calculada svd, está sendo amplificada com dados cada vez mais escassos. Sem lacunas, svde eigenproduz os mesmos resultados.

Isso não parece acontecer com uma eigendecomposição. Eu estava inclinado a usar svdporque os valores lambda são sempre positivos, mas essa tendência é preocupante. Existe algum tipo de correção que precisa ser aplicada ou devo evitar svdcompletamente esse problema.

###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")

insira a descrição da imagem aqui

Marc na caixa
fonte
Sinto muito por não conseguir seguir seu código (não sei R), mas aqui estão uma ou duas noções. Valores próprios negativos podem aparecer na decomposição de um cov. matriz se os dados brutos tiverem muitos valores ausentes e esses forem excluídos em pares ao calcular o cov. O SVD dessa matriz reportará (enganosamente) esses autovalores negativos como positivos. Suas fotos mostram que as decomposições de eigen e svd se comportam de maneira semelhante (se não exatamente igual), além da única diferença em relação aos valores negativos.
ttnphns
1
PS Espero que você tenha me entendido: a soma dos autovalores deve ser igual ao traço (soma diagonal) da cov. matriz. No entanto, o SVD é "cego" para o fato de que alguns autovalores podem ser negativos. O SVD raramente é usado para decompor cov não-gramiano. matriz, ela é tipicamente usada com matrizes conscientemente gramian (positivo semidefinido) ou com dados em bruto
ttnphns
1
@ttnphns - Obrigado pela sua compreensão. Acho que não ficaria tão preocupado com o resultado dado svdse não fosse pela forma diferente dos autovalores. Obviamente, o resultado está dando mais importância aos valores próprios finais do que deveria.
Marc na caixa

Respostas:

4

Você precisa fazer a soma do valor absoluto dos valores de eigen, por exemplo, sum (abs (por exemplo, valores de $)) e compará-lo com a soma dos valores singulares. Eles seriam iguais.

O motivo é que, se você multiplicar as linhas ou colunas que correspondem aos valores próprios negativos com 1 , o valor próprio da nova matriz se tornará positivo e a ortogonalidade dos vetores não será perturbada.

A prova do inverso desse belo teorema apareceu em A álgebra dos hiperbolóides da revolução, Javier F. Cabrera, Álgebra linear e suas aplicações, Universidade de Princeton (agora em Rutgers).

Outra maneira de argumentar isso é pelo fato de que sqrt (eigen (t (Cg)% *% Cg)) é igual aos valores singulares de Cg. Mas quando os autovalores são negativos, os dados devem ser representados de forma eremita com o plano complexo levado em consideração, o que foi perdido na formulação original, ou seja, os dados formados pela raiz quadrada simétrica da matriz com autógeno negativo valores teriam entradas complexas.

carro fúnebre
fonte
1
muito obrigado por esta explicação. Eu estava ciente da relação entre eigen e svd, mas não sabia que eles ainda estariam relacionados, dadas as diferenças acima mencionadas na decomposição da matriz original. Apenas curioso - até onde eu sei, uma decomposição de um eigen dará valores negativos quando uma matriz não é "definida positivamente". É esse o caso de todas as matrizes de covariância baseadas em dados lacrimejantes?
Marc na caixa
1
Marc, a definição positiva de uma matriz simétrica real é equivalente a ter todos os autovalores positivos. Não existe uma relação estreita com "dados lacrimejantes", entendendo que isso significa matrizes esparsas com muitas entradas zero. Afinal, as mais esparsas entre as matrizes não singulares (simétricas ou não) são as diagonais, que exibem seus autovalores como entradas.
whuber
@ whuber - obrigado pelo seu comentário. Nesse caso, interpreto "gappy" de maneira diferente de "sparse", pois os valores não são NaNs e não 0 (zero). Assim, os valores de covariância são escalados pelo número de valores comuns (isto é, dividido por n-1). A esse respeito, não acredito que a matriz de covariância contenha zeros.
Marc na caixa
1
Encontrar um meio de estimar a matriz de covariância a partir desses dados ausentes é um desafio: fiz uma pergunta semelhante há muito tempo e recebi algumas respostas estimulantes.
whuber
Fiz uma pergunta adicional sobre meu interesse no assunto pelo uso na análise da Função Ortogonal Empírica (EOF) aqui: stats.stackexchange.com/questions/34832/…
Marc na caixa