Próbuję dekomponować macierz kowariancji w oparciu o rzadki / gappy zestaw danych. Zauważam, że suma lambda (wyjaśniona wariancja), obliczona za pomocą svd
, jest powiększana o coraz bardziej nieokreślone dane. Bez luk svd
i eigen
uzyskaj te same wyniki.
Wydaje się, że tak się nie dzieje z eigen
rozkładem. Skłoniłem się do używania, svd
ponieważ wartości lambda są zawsze dodatnie, ale ta tendencja jest niepokojąca. Czy istnieje jakaś korekta, którą należy zastosować, czy też powinienem svd
całkowicie unikać takiego problemu.
###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 w pudełku
źródło
źródło
svd
gdyby nie inny kształt wartości własnych. Rezultat w oczywisty sposób nadaje większą wagę końcowym wartościom własnym niż powinien.Odpowiedzi:
Musisz wykonać sumę wartości bezwzględnej wartości własnych, tj. Sumę (abs (np. Wartości $)) i porównać ją z sumą wartości pojedynczych. Byliby równi.
Powodem jest to, że jeśli pomnożysz wiersze lub kolumny, które odpowiadają ujemnym wartościom własnym przez , wówczas wartość własna nowej macierzy staje się dodatnia, a ortogonalność wektorów własnych nie jest zakłócona.- 1
Dowód przeciwności tego pięknego twierdzenia pojawił się w Algebrze hiperboloidów rewolucji, Javier F. Cabrera, Algebra liniowa i jej zastosowania, Princeton University (obecnie w Rutgers).
Innym sposobem na uzasadnienie tego jest fakt, że sqrt (własny (t (Cg)% *% Cg)) jest równy liczbie pojedynczej Cg. Ale gdy wartości własne są ujemne, dane muszą być reprezentowane w formie pustelnika z uwzględnieniem złożonej płaszczyzny, czego brakowało w pierwotnym sformułowaniu, tj. Danych utworzonych przez symetryczny pierwiastek kwadratowy macierzy z ujemnym własnym wartości miałyby złożone wpisy.
źródło