Rastgele bir matris için SVD hiçbir şeyi açıklamamalı mı? Neyi yanlış yapıyorum?


13

Tamamen rastgele verilerden oluşan bir 2-D matris oluşturursam, PCA ve SVD bileşenlerinin temelde hiçbir şeyi açıklamamasını beklerdim.

Bunun yerine, ilk SVD sütunu verilerin% 75'ini açıklıyor gibi görünüyor. Bu nasıl olabilir? Neyi yanlış yapıyorum?

İşte konu:

resim açıklamasını buraya girin

İşte R kodu:

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)

Güncelleme

Teşekkürler @Aaron. Belirttiğiniz gibi düzeltme, matrise ölçekleme eklemekti, böylece sayılar 0 etrafında ortalandı (yani, ortalama 0'dır).

m <- scale(m, scale=FALSE)

İşte düzeltilmiş görüntü, rastgele veriler içeren bir matris için, ilk SVD sütunu beklendiği gibi 0'a yakın.

Düzeltilmiş resim


4
İşletme matris birimi küp üzerinde muntazam bir dağılım gösterirler içinde . SVD , köken hakkındaki atalet momentlerini hesaplar . Gelen "toplam varyansın" olmalıdır kere birim aralıkta, bu . Küpün ana ekseni boyunca (başlangıç ​​noktasından kaynaklanan) anın ve diğer tüm anlara - simetri sayesinde - eşit eşit olduğunu hesaplamak kolaydır. . Bu nedenle ilk özdeğer, toplamın . İçin olduğunuR 100 R ' , n , n 1 / 3 N / 3 - ( N - 1 ) / 12 1 / 12 ( n / 3 - ( N - 1 ) / 12 ) / ( n / 3 ) = 3 / 4 + 1 / ( 4 n ) n =[0,1]100R100Rnn1/3n/3(n1)/121/12(n/3(n1)/12)/(n/3)=3/4+1/(4n)75.25n=10075.25%, üçüncü grafikte görünür.
whuber

Yanıtlar:


11

İlk bilgisayar değişkenlerin sıfıra odaklanmadığını açıklıyor. Önce ölçeklemek veya rastgele değişkenlerinizi sıfır etrafında ortalamak beklediğiniz sonucu verecektir. Örneğin, bunlardan biri:

m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)
m <- scale(m, scale=FALSE)

m <- matrix(runif(10000,min=-25,max=25), nrow=100,ncol=100)

3
İyi bir noktaya değindin, ama bence bu hikayenin sadece bir kısmını anlatıyor. Gerçekten, OP'nin her birini deneyeceğini ve sonuçtan hala şaşıracağını tahmin ediyorum . Mesele şu ki , çıktıda tekil değerler sıralandığı için, "rastgele" verilerden beklendiği gibi düzgün dağılmayacaklar (ve gerçekten de). Marchenko-Pastur dağıtım bu durumda davranışlarını yönetir.
kardinal

@Aaron Teşekkürler, kesinlikle haklıydınız. Sonucun ne kadar güzel olduğunu göstermek için yukarıdaki düzeltilmiş çıktının bir grafiğini ekledim.
Contango

1
@cardinal Yorumunuz için teşekkürler, kesinlikle haklısınız (yukarıdaki düzeltilmiş kod tarafından üretilen grafiğe bakın). SVD değerlerinin, matris küçüldükçe daha az düzgün bir şekilde dağılacağına inanıyorum, çünkü daha küçük bir matris, büyük sayılar yasası tarafından ezilmeyecek kalıplara sahip olma şansına sahip olacaktır.
Contango

3

Boş bir model karşılaştırması kullanarak sorunuza daha görsel bir cevap ekleyeceğim. Prosedür, değişkenler (kolonlar) arasındaki kovaryans kaybolurken genel varyansı korumak için her sütundaki verileri rastgele karıştırır. Bu birkaç kez yapılır ve rastgele değer matrisinde tekil değerlerin sonuçta ortaya çıkan dağılımı orijinal değerlerle karşılaştırılır.

Matris ayrışımı prcompyerine kullanıyorum svd, ancak sonuçlar benzer:

set.seed(1)
m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)

S <- svd(scale(m, center = TRUE, scale=FALSE))
P <- prcomp(m, center = TRUE, scale=FALSE)
plot(S$d, P$sdev) # linearly related

Null model karşılaştırması aşağıdaki ortalanmış matriste yapılır:

library(sinkr) # https://github.com/marchtaylor/sinkr

# centred data
Pnull <- prcompNull(m, center = TRUE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda[,1:20], ylim=range(Pnull$Lambda[,1:20], Pnull$Lambda.orig[1:20]), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=FALSE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

Aşağıda, düz çizgi olarak gösterilen her bir tekil değerin% 95'i ile nüfuz eden matrisin bir kutu grafiği verilmiştir. PCA'nın orijinal değerleri mnoktalardır. hepsi% 95 çizginin altındadır - Böylece genlikleri rastgele gürültüden ayırt edilemez.

resim açıklamasını buraya girin

Aynı prosedür maynı sonucun ortalanmamış versiyonunda yapılabilir - Önemli tekil değerler yok:

# centred data
Pnull <- prcompNull(m, center = FALSE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda[,1:20], ylim=range(Pnull$Lambda[,1:20], Pnull$Lambda.orig[1:20]), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=TRUE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

resim açıklamasını buraya girin

Karşılaştırma için, rastgele olmayan bir veri kümesine sahip bir veri kümesine bakalım: iris

# iris dataset example
m <- iris[,1:4]
Pnull <- prcompNull(m, center = TRUE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda, ylim=range(Pnull$Lambda, Pnull$Lambda.orig), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=FALSE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

resim açıklamasını buraya girin

Burada, 1. tekil değer önemlidir ve toplam varyansın% 92'sinden fazlasını açıklar:

P <- prcomp(m, center = TRUE)
P$sdev^2 / sum(P$sdev^2)
# [1] 0.924618723 0.053066483 0.017102610 0.005212184

+1. İris veri kümesi örneği ilginçtir, çünkü ilk iki PC'ye (örneğin, kendi yazınızdaki stat.stackexchange.com/a/88092 gibi ) bakıldığında ikincisinin bir miktar sinyal taşıdığı oldukça açıktır. Permütasyon (diğer adıyla karıştırma) testi, sadece birincisinin "anlamlı" olduğunu gösterir. Karıştırma PC sayısını küçümseme eğilimindedir: ilk gerçek PC'nin büyük varyasyonu, karıştırılmış PC'ler arasında "yayılır" ve ikinciden başlayarak hepsini yükseltir. Bunu açıklayan daha hassas testler yapılabilir ancak bu nadiren yapılır.
amip diyor Reinstate Monica

@amoeba - Mükemmel yorum. Bir süredir "yayılıyor" etkisini merak ediyorum. Bir çapraz geçerlilik testinin referans verdiğiniz daha hassas testlerden biri olabileceğini varsayalım (örneğin cevabınız burada )? Bir örnek / referans sağlayabilirseniz harika olur.
Marc kutuda

Genellikle çapraz onaylamayı kullanmayı tercih ederim ( burada cevabım uyarınca yeniden yapılandırma hatasına dayanarak ), ancak aslında bir şekilde aynı duyarsızlıktan muzdarip olup olmadığından emin değilim. İris veri kümesinde denemek mantıklı olabilir. Karıştırmaya dayalı yaklaşımlarla ilgili olarak, bu “yayılma” nın muhasebesi için herhangi bir referans bilmiyorum, sadece son zamanlarda üzerinde çalışan bazı insanları tanıyorum. Sanırım yakında yazmak istediler. Fikir, daha yüksek karıştırılmış PC'lerin varyansları için bazı ölçek küçültme faktörlerini tanıtmaktır.
amip diyor Reinstate Monica

@amoeba - Bu bağlantı için teşekkürler. Benim için çok şey açıklıyor. PCA'da çapraz doğrulamanın eksik değerlere sahip veri kümelerinde çalışabilecek yöntemleri kullandığını görmek özellikle ilginç buldum. Bu yaklaşım üzerinde birkaç girişimde bulundum ve (siz belirttiğiniz gibi) sıfır model karıştırma yaklaşımı gerçekten önemli bilgisayarların sayısını küçümseme eğilimindedir. Ancak, iris veri kümesi için, yeniden yapılandırma hatası için sürekli olarak tek bir PC döndürürüm. Konu hakkında ne söylediğini ilginç. Tür tahminlerine dayanarak hata ölçersek sonuçlar farklı olabilirdi.
Marc kutuda

Meraktan, Iris verilerinde denedim. Aslında, çapraz doğrulama yöntemi ile iki önemli PC alıyorum. Bağlantılı yayınımı güncelledim, lütfen oraya bakın.
amip diyor Reinstate Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.