Gdybym zbudował matrycę 2-D złożoną wyłącznie z losowych danych, oczekiwałbym, że komponenty PCA i SVD w zasadzie niczego nie wyjaśnią.
Zamiast tego wydaje się, że pierwsza kolumna SVD wydaje się wyjaśniać 75% danych. Jak to możliwe? Co ja robię źle?
Oto fabuła:
Oto kod R:
set.seed(1)
rm(list=ls())
m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)
svd1 <- svd(m, LINPACK=T)
par(mfrow=c(1,4))
image(t(m)[,nrow(m):1])
plot(svd1$d,cex.lab=2, xlab="SVD Column",ylab="Singluar Value",pch=19)
percentVarianceExplained = svd1$d^2/sum(svd1$d^2) * 100
plot(percentVarianceExplained,ylim=c(0,100),cex.lab=2, xlab="SVD Column",ylab="Percent of variance explained",pch=19)
cumulativeVarianceExplained = cumsum(svd1$d^2/sum(svd1$d^2)) * 100
plot(cumulativeVarianceExplained,ylim=c(0,100),cex.lab=2, xlab="SVD column",ylab="Cumulative percent of variance explained",pch=19)
Aktualizacja
Dziękuję @Aaron. Jak zauważyłeś, poprawka polegała na dodaniu skalowania do macierzy, aby liczby były wyśrodkowane wokół 0 (tj. Średnia wynosi 0).
m <- scale(m, scale=FALSE)
Oto poprawiony obraz, pokazujący macierz z losowymi danymi, pierwsza kolumna SVD jest bliska 0, zgodnie z oczekiwaniami.
Odpowiedzi:
Pierwszy komputer wyjaśnia, że zmienne nie są wyśrodkowane wokół zera. Skalowanie najpierw lub centrowanie zmiennych losowych wokół zera da oczekiwany wynik. Na przykład jeden z tych:
źródło
Dodam bardziej wizualną odpowiedź do twojego pytania, poprzez porównanie z zerowym modelem. Procedura losowo tasuje dane w każdej kolumnie, aby zachować ogólną wariancję, podczas gdy kowariancja między zmiennymi (kolumnami) zostaje utracona. Odbywa się to kilka razy, a wynikowy rozkład liczby pojedynczej w losowej macierzy jest porównywany z wartościami pierwotnymi.
Używam
prcomp
zamiastsvd
do rozkładu macierzy, ale wyniki są podobne:Porównanie modeli zerowych jest wykonywane na macierzy centrowanej poniżej:
Poniżej znajduje się wykres pudełkowy permutowanej macierzy z 95% kwantylem każdej liczby pojedynczej pokazanej jako linia ciągła. Pierwotne wartości PCA
m
to kropki. wszystkie leżą poniżej linii 95% - dlatego ich amplituda jest nie do odróżnienia od szumu przypadkowego.Tę samą procedurę można wykonać w niecentralnej wersji
m
z tym samym wynikiem - Brak znaczących pojedynczych wartości:Dla porównania spójrzmy na zestaw danych z nieprzypadkowym zestawem danych:
iris
Tutaj pierwsza wartość pojedyncza jest znacząca i wyjaśnia ponad 92% całkowitej wariancji:
źródło