Neden verilerin PCA'sı SVD aracılığıyla?


22

Bu soru ana bileşenleri hesaplamanın etkili bir yoludur.

  1. Doğrusal PCA ile ilgili birçok metin, casewise verilerinin tekil değer ayrışımını kullanarak savunur . Veri varsa kendisine, ve değişkenler (kendi değiştirmek istiyor sütun temel bileşenler), yaptığımız SVD: X = U S V ' (. Kare özdeğerler kökleri), tekil değerler ana çapını işgal S , sağ özvektörler V , eksen değişkenlerinin eksen-bileşenlerine ortogonal dönme matrisidir, sol özvektörler U sadece durumlar için V gibidir . Daha sonra bileşen değerlerini C = X V = U S olarak hesaplayabiliriz.XX=USVSVUVC=XV=US.

  2. Değişkenlerin PCA'sını yapmanın başka bir yolu, kare matrisin ayrışmasıdır (yani R , değişkenler arasında korelasyonlar veya kovaryanslar vb. Olabilir ). Kare simetrik pozitif yarı kesin matris ile, aynı sonucu verir: dekompozisyon ya da tekil değer ayrışma bozunma-öz edilebilir R = V L V ' diyagonal olarak öz değerleri ile L ve V daha önce tarif edildiği gibi. Bileşen değerleri C = X V olacaktır .R=XXR R=VLVLVC=XV

Şimdi, sorum şu: eğer verileri büyük bir matris ise ve vakaların sayısı (bu genellikle bir durumdur) değişken sayısından çok daha büyükse, o zaman yolun (1) yoldan çok daha yavaş olması beklenir (2), çünkü yol (1) büyük bir matrise oldukça pahalı bir algoritma (SVD gibi) uygular; bizim durumumuzda gerçekten ihtiyaç duymadığımız U matrisini hesaplar ve saklar (değişkenlerin PCA'sı). Eğer öyleyse, o zaman neden bu kadar çok ders kitabı savunuyor ya da sadece tek yoldan bahsediyor gibi görünüyor (1)? Belki de olduğu verimli ve bir şey eksik?XU


2
Genel olarak, varyansın çoğunu açıklayan sadece birkaç ana bileşenle ilgileniyoruz. Azaltılmış bir SVD yapmak mümkündür; Örneğin eğer boyutu ait N x p burada p < < K sonra 'in fonksiyonu sadece ilk hesaplamak s sol ve varsayılan doğru tekil vektörler. XN×pp<<NRsvdp
M. Berk

1
@ M.Berk: ancak her iki yaklaşımda da aynıdır: eşdeğer sonuçlar verir (işaret değişikliklerine eşittir). Ayrıca, örneğin R sadece istendiğinde C'yi hesaplar . pC
cbeleites,

Way (1) için referansınız var mı? PCA'nın kovaryans matrisinde (yani yol 2) SVD aracılığıyla uygulanmasının farkındayım, çünkü bu bazı sayısal problemleri önler ve açıkça veri setinin boyutunu değil boyutsallıkla ölçeklendirir. Yol (1) PCA'yı değil, SVD'yi arardım. Bunu yalnızca tamamen SVD bağlamında görmüştüm, ki burada gerçekte tam bir ayrıştırma gerçekleştirmezdim.
Anony-Mousse

@ Anony-Mousse, Bahsetmek istediğim bir tek, Joliffe, Principal component analysis, 2nd ed.Aslında, Joliffe iki yolu da anlatıyor, ancak PCA'nın ana bölümünde, hatırlayabildiğim kadarıyla, sadece 1.
ttnphns

@ Anony-Mousse, Way 1 benim için teorik açıdan önemlidir, çünkü PCA'nın doğrudan basit yazışma analiziyle doğrudan ilişkili olduğunu açıkça göstermektedir .
ttnphns

Yanıtlar:


7

İşte konuyla ilgili benim 2ct

  • İlk önce PCA'nın çözelti kullandığını öğrendiğim (2) kemometri dersi veriyordu, fakat sayısal yönelimli değildi ve sayısal dersim sadece bir girişti ve hatırladığım kadarıyla SVD'yi tartışmadı.

  • Ben anlamak Holmes: Büyük Ölçekli Matrisler için hızlı SVD doğru, senin fikrin uzun matrislerin bir hesaplama hızlı SVD almak için kullanılmıştır.
    Bu, uygun bir matrisle karşılaşırsa iyi bir SVD uygulamasının dahili olarak (2) takip edebileceği anlamına gelir (daha iyi olasılıklar olup olmadığını bilmiyorum). Bu, yüksek seviyeli bir uygulama için SVD'yi (1) kullanmak ve dahili olarak hangi algoritmayı kullanacağına dikkat etmek için BLAS'a bırakmanın daha iyi olacağı anlamına gelir.

  • Hızlı pratik kontrol: OpenBLAS'ın svd'si 5e4 x 100'lük bir matriste svd (X, nu = 0)medyan 3.5 s'yi alırken svd (crossprod (X), nu = 0), 54 ms (R ile denir microbenchmark) alır.
    Tabii ki özdeğerlerinin karesi hızlıdır ve her iki çağrının da sonuçları eşdeğerdir.

    timing  <- microbenchmark (svd (X, nu = 0), svd (crossprod (X), nu = 0), times = 10)
    timing
    # Unit: milliseconds
    #                      expr        min         lq    median         uq        max neval
    #            svd(X, nu = 0) 3383.77710 3422.68455 3507.2597 3542.91083 3724.24130    10
    # svd(crossprod(X), nu = 0)   48.49297   50.16464   53.6881   56.28776   59.21218    10
    

güncelleme: Wu, W'ye bir göz atın ; Massart, D. ve de Jong, S .: Çekirdek PCA geniş veri için algoritmalar. Bölüm I: Teori ve algoritmalar, Chemometrics ve Akıllı Laboratuar Sistemleri, 36, 165 - 172 (1997). DOI: http://dx.doi.org/10.1016/S0169-7439(97)00010-5

Bu yazıda PCA için 4 farklı algoritmanın sayısal ve hesaplamalı özellikleri ele alınmıştır: SVD, öz ayrışma (EVD), NIPALS ve POWER.

Bunlar aşağıdaki gibidir:

computes on      extract all PCs at once       sequential extraction    
X                SVD                           NIPALS    
X'X              EVD                           POWER

Kağıdın bağlam olan geniş ve bunlar üzerinde çalışmak X X ' (çekirdek PCA) - bu konuda sormak biri olarak tam tersi bir durumdur. Bu yüzden, uzun matris davranışı hakkındaki sorunuzu cevaplamak için, "çekirdek" ve "klasik" anlamını değiştirmelisiniz.X(30×500)XX

performance comparison

Beklendiği gibi, EVD ve SVD, klasik veya çekirdek algoritmalarının kullanılmasına bağlı olarak yer değiştirir. Bu soru bağlamında bu, birinin ya da diğerinin matrisin şekline bağlı olarak daha iyi olabileceği anlamına gelir.

Fakat “klasik” SVD ve EVD tartışmalarından ayrışmasının PCA'yı hesaplamak için çok olağan bir yol olduğu açıktır . Bununla birlikte, Matlab'ın işlevini kullanmak dışında hangi SVD algoritmasının kullanılacağını belirtmezler .XXsvd ()


    > sessionInfo ()
    R version 3.0.2 (2013-09-25)
    Platform: x86_64-pc-linux-gnu (64-bit)

    locale:
     [1] LC_CTYPE=de_DE.UTF-8       LC_NUMERIC=C               LC_TIME=de_DE.UTF-8        LC_COLLATE=de_DE.UTF-8     LC_MONETARY=de_DE.UTF-8   
     [6] LC_MESSAGES=de_DE.UTF-8    LC_PAPER=de_DE.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
    [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C       

    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     

    other attached packages:
    [1] microbenchmark_1.3-0

loaded via a namespace (and not attached):
[1] tools_3.0.2

$ dpkg --list libopenblas*
[...]
ii  libopenblas-base              0.1alpha2.2-3                 Optimized BLAS (linear algebra) library based on GotoBLAS2
ii  libopenblas-dev               0.1alpha2.2-3                 Optimized BLAS (linear algebra) library based on GotoBLAS2

Bu nedenle, testiniz (3.5 sn - 54 msn), "yol 1" in oldukça yavaş olduğu çizgimi destekliyor. Sağ?
ttnphns

1
@ ttnphns: evet. Ancak, svd farklı bir BLAS ile farklı olabilecek BLAS tarafından sağlandığı için. İyi bir optimize edilmiş BLAS'ın böyle bir şey yapmasını beklerdim. Ancak OpenBLAS ile durum böyle görünmüyor. Diğer BLAS'ları kontrol etmek için çok tembelim ama belki birkaç kişi diğer BLAS'larını kontrol edebilir, bu nedenle hangisinin bu durumda optimize edildiğini ve hangilerinin olmadığını öğrendik. (Ben belki o biraz bilgi için algoritma geçiş için değil örneğin nedenlerini ekleyebilir, OpenBLAS geliştirici gönderilecektir ve ona bu soruya bir bağlantı gönderilen svd (X'X)uzun matrisleri için.)
cbeleites destekler Monica

Bazı noktaların açıklığa ihtiyacı var (bana). "Çekirdek yöntemleri" , n < p olduğunda " X yerine üzerinde çalışmak" olarak özetlenebilir mi? eğer öyleyse, oldukça önemsiz. Ben GÜÇ bilmiyorum ama öz vektörlerini hesaplar, hangi NIPALS biliyoruz X ' X tekrarlayarak u n + 1 = X ' X u n / | | X X u n | | (1'inci özvektör v 1'e yakınsayarak X'i güncellemeniz gerekir.XXn<pXXun+1=XXun/||XXun||v1Xikinciyi hesaplamak, vb.) NIPALS gerçekleştirmenin iki yolu vardır, (1) X X'i önceden hesaplayabilirXX, veya (2) ürünü , burada hangi yolla kullanılır? Ben haksızlık olabilir (1) kullanılır sanırım. X×(Xun)
Elvis,

@Elvis: a) Sadece hesaplamaktan çok çekirdek yöntemleri var , bkz . Stats.stackexchange.com/questions/2499/… . Eşdeğerlik PCA için önemsizdir (sağ veya sol tekil vektörlerle başlayıp başlamayacağınız önemli değil) ancak diğer yöntemler için değil. b) “NIPALS yapmak için hangi yol” aynı genel ilkeye dayanmaktadır. SVD için hangi algoritmanın kullanıldığı BLAS'ınıza bağlıdır ve aslında benim tahminim NIPALS'ın burada yer almadığıdır. Zamanlamamın çapraz ürünün hesaplanmasını içerdiğini unutmayın. XXT
cbeleites

Nipals'ın dahil olduğu güncellemen hakkında konuşuyordum. Nipals'ın Lapack'in SVD'sinde yer almadığını onaylıyorum. Kriter denemeniz hakkında, gibi bir şey microbenchmark(X <- matrix(rnorm(5e6), ncol=100), Y <- t(X), svd(X), svd(Y), control=list(order="inorder"), times = 5)de ilginç olabilir.
Elvis

18

SVD daha yavaştır, ancak daha yüksek sayısal doğruluğu nedeniyle tercih edilen yöntem olarak kabul edilir.

Sorunuzda belirtildiği gibi, temel bileşen analizi (PCA), merkezlenmiş veri matrisi SVD'si tarafından gerçekleştirilebilir.X ( daha fazla ayrıntı için bu Q&A başlığına bakınız ) veya kovaryans matrisinin öz-ayrışması ile gerçekleştirilebilir.1n1XXXXnp

İşte MATLAB'ın pca()fonksiyon yardımında yazılanlar :

Temel bileşen pcaanalizini gerçekleştirmek için kullanılan temel bileşen algoritması [...]:

'svd' - Varsayılan. X'in tekil değer ayrışması (SVD).

np

Son cümle, burada oynanan kritik öneme sahip hızlı takası vurgulamaktadır.

1000×100

X = randn([1000 100]);

tic; svd(X); toc         %// Elapsed time is 0.004075 seconds.
tic; svd(X'); toc        %// Elapsed time is 0.011194 seconds.
tic; eig(X'*X); toc      %// Elapsed time is 0.001620 seconds.
tic; eig(X*X'); toc;     %// Elapsed time is 0.126723 seconds.

npXX

XXXX PCA'daki Math.SE. üzerinde

X=(111ϵ000ϵ000ϵ),
3+ϵ2ϵ2ϵ2 . alarakϵ=105, we can use SVD and EIG to compute these values:
eps = 1e-5;
X = [1 1 1; eye(3)*eps];
display(['Squared sing. values of X: ' num2str(sort(svd(X),'descend').^2')])
display(['Eigenvalues of X''*X:       ' num2str(sort(eig(X'*X),'descend')')])

obtaining identical results:

Squared sing. values of X: 3       1e-10       1e-10
Eigenvalues of X'*X:       3       1e-10       1e-10

But taking now ϵ=1010 we can observe how SVD still performs well but EIG breaks down:

Squared sing. values of X: 3       1e-20       1e-20
Eigenvalues of X'*X:       3           0 -3.3307e-16

What happens here, is that the very computation of covariance matrix squares the condition number of X, so especially in case when X has some nearly collinear columns (i.e. some very small singular values), first computing covariance matrix and then computing its eigendecomposition will result in loss of precision compared to direct SVD.

I should add that one is often happy to ignore this potential [tiny] loss of precision and rather use the faster method.


1
Also for the SVD you can write (or just use) the algorithm for XT which has the opposite runtime behaviour (because the decomposition has symmetry wrt. transposing X ) and otherwise the same numeric behaviour. Numeric stability is an important point (+1) - though I guess it depends a lot the data whether that matters. E.g. I typically far too few cases and noisy measurements - so the stability of my models is typically not limited by the numeric stability of underlying SVDs but by the patients/cell culture batches or instrumental noise.
cbeleites supports Monica

Thanks for the answer and for thorough consideration of pros and cons.
ttnphns

amoeba, may that be that you find time to show a concrete example where numerical stability suffers by eig() approach? (Readers will benefit: there is a point of trade-off between speed and stability. How one may decide in a concrete practical situation?)
ttnphns

@ttnphns I rewrote the whole answer, providing a concrete example. Take a look.
amoeba says Reinstate Monica

1
@amoeba, thank you very much for coming back and giving an example! I tried both epsilon examples in SPSS and got results like your's except for the very last line: instead of 3 0 -3.3307e-16 eigen in spss returned me 3 0 0. It looks as if the function has some in-built and fixed tolerance value beyond which it zero-offs. In this example, the function appeared as if to hack the knot of numerical instability by zeroing both tiny eigenvalues, the "0" and the "-16".
ttnphns
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.