희소 데이터를 기반으로하는 공분산 행렬의 고유 및 svd 분해가 다른 결과를 생성하는 이유는 무엇입니까?


12

희소 / 갭피 데이터 세트를 기반으로 공분산 행렬을 분해하려고합니다. 로 계산 된 람다 (설명 된 분산)의 합이 svd점점 더 좁아지는 데이터로 증폭되고 있음을 알았습니다. 틈없이, svd그리고 eigen높을 동일한 결과.

이것은 eigen분해 로 발생하지 않는 것 같습니다 . svd람다 값이 항상 양수이기 때문에 사용에 기울고 있었지만이 경향은 걱정입니다. 적용해야 할 일종의 수정이 있습니까? 아니면 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")

여기에 이미지 설명을 입력하십시오


코드를 따르지 못해 죄송합니다 (R을 모르십시오). 그러나 여기에는 하나 또는 두 가지 개념이 있습니다. 음의 고유 값은 cov의 고유 분해에 나타날 수 있습니다. 원시 데이터에 많은 결 측값이 있고 cov를 계산할 때 쌍으로 삭제 된 경우 행렬. 이러한 행렬의 SVD는 음의 고유 값을 양으로보고합니다. 귀하의 사진은 고유 값과 svd 분해가 모두 음수 값에 대한 차이 외에 비슷하게 (정확히 동일하지는 않지만) 유사하게 작동한다는 것을 보여줍니다.
ttnphns

1
추신 : 당신이 나를 이해하기를 바랍니다 : 고유 값의 합계는 cov의 추적 (대각선 합계)과 같아야합니다. 매트릭스. 그러나 SVD는 일부 고유 값이 음수 일 수 있다는 사실에 "맹목적"입니다. SVD는 비-그래미 언 cov를 분해하는 데 거의 사용되지 않습니다. 매트릭스는 일반적으로 고의적으로 그래미 언 (양의 반정의) 매트릭스 또는 원시 데이터와 함께 사용됩니다
ttnphns

1
@ttnphns-귀하의 통찰에 감사드립니다. svd고유 값의 다른 모양이 아니라면 결과에 대해 걱정하지 않을 것 입니다. 결과는 후행 고유 값보다 분명히 중요합니다.
Marc 상자에

답변:


4

고유 값의 절대 값, 즉 sum (abs (Eg $ values))의 합을 수행하여 특이 값의 합과 비교해야합니다. 그들은 같을 것입니다.

그 이유는 음의 고유 값에 해당하는 행이나 열에 을 곱하면 새 행렬의 고유 값이 양수가되고 고유 벡터의 직교성이 방해받지 않기 때문입니다.1

이 아름다운 정리의 반대 증거는 Javier F. Cabrera, Linear Algebra 및 그 응용 프로그램, Princeton University (현재 Rutgers)의 초볼 로이드 혁명 대수에 나타났습니다.

sqrt (eigen (t (Cg) % * % Cg))가 Cg의 특이 값과 같다는 사실에 의해 다른 이유가 있습니다. 그러나 고유 값이 음수 인 경우, 데이터는 복소 평면을 고려한 은자 형태로 표현되어야합니다. 즉, 원래 공식에서는 누락 된 것입니다. 값은 복잡한 항목을 갖습니다.


1
이 설명에 감사드립니다. 나는 고유와 svd 사이의 관계를 알고 있었지만 원래의 행렬을 분해하는 데 위에서 언급 한 차이점을 감안할 때 여전히 관련이 있음을 알지 못했습니다. 내가 궁금한 한, 고유 분해는 행렬이 "긍정적"이 아닌 경우 음의 값을 줄 것입니다. 갭피 데이터에 기반한 모든 공분산 행렬의 경우입니까?
Marc in the box

1
Marc, 실제 대칭 행렬의 양의 한정은 모든 양의 고유 값을 갖는 것과 같습니다. "gappy data"와 밀접한 관계가 없으며, 항목이 0 인 희소 행렬을 의미합니다. 결국, 비단 수 행렬 (대칭 여부) 중 가장 희소 한 행렬은 대각 행렬이며 고유 값이 항목으로 표시됩니다.
whuber

@ whuber-귀하의 의견에 감사드립니다. 이 경우 비값이 NaN이고 0이 아니라는 점에서 "gappy"를 "sparse"와 다르게 해석합니다. 따라서 공분산 값은 공통 값의 수 (즉, n-1로 나눈 값)로 스케일됩니다. 그런 점에서 공분산 행렬에 실제로 0이 포함되어 있다고 생각하지 않습니다.
Marc in the box

1
누락 된 데이터에서 공분산 행렬을 추정하기조차 수있는 방법을 찾는 것은 도전이다 : 내가 물어 비슷한 질문을 오래 전에 어떤 자극 답변을 받았다.
whuber

: 나는 경험적 직교 함수의 사용 (EOF) 여기에 분석의 제목에 내 관심에 정성 들여 추가 질문 물었다 stats.stackexchange.com/questions/34832/...
상자에 마크
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.