डेटा के SVD द्वारा डेटा का PCA क्यों?


22

यह प्रश्न प्रमुख घटकों की गणना करने के लिए एक कुशल तरीके के बारे में है।

  1. रेखीय पीसीए पर कई ग्रंथों केवेज़ डेटा के एकवचन-मूल्य अपघटन का उपयोग करने की वकालत करते हैं । है यही कारण है, अगर हम डेटा है और चर (अपने को बदलना चाहते कॉलम प्रमुख घटकों द्वारा), हम करते हैं SVD: एक्स = यू एस वी ' (। वर्ग eigenvalues की जड़ों), विलक्षण मूल्यों का मुख्य विकर्ण पर कब्जा एस , दाएँ eigenvectors V अक्षों-घटकों में axes-variables के orthogonal रोटेशन मैट्रिक्स हैं, बाएं eigenvectors U केवल मामलों के लिए V की तरह हैं । हम फिर C = X V = U S के रूप में घटक मानों की गणना कर सकते हैंXX=USVSVUVC=XV=US

  2. एक और तरीका है चर के पीसीए करने के लिए के अपघटन के माध्यम से है वर्ग मैट्रिक्स (यानी आर हो सकता है सहसंबंध या सहप्रसरण आदि, चर के बीच)। अपघटन eigen-अपघटन किया जा सकता है या एकवचन-मूल्य अपघटन: वर्ग सममित सकारात्मक semidefinite मैट्रिक्स के साथ, वे ही परिणाम प्राप्त होगा आर = वी एल वी ' के विकर्ण रूप में eigenvalues साथ एल , और वी के रूप में पहले वर्णित। घटक मूल्य होंगेR=XXR R=VLVLVC=XV

अब, मेरा प्रश्न: यदि डेटा एक बड़ा मैट्रिक्स है, और मामलों की संख्या है (जो अक्सर एक मामला है) चर की संख्या से बहुत अधिक है, तो रास्ता (1) वैसे (2) की तुलना में बहुत धीमा होने की उम्मीद है , क्योंकि (1) एक बड़े मैट्रिक्स में काफी महंगा एल्गोरिदम (जैसे एसवीडी) लागू होता है; यह विशाल मैट्रिक्स यू की गणना करता है और संग्रहीत करता है जो हमें वास्तव में हमारे मामले में (चर के पीसीए) की आवश्यकता नहीं है। यदि ऐसा है, तो क्यों इतने सारे टेक्सबुक की वकालत करने लगते हैं या केवल एक ही तरीके (1) का उल्लेख करते हैं? शायद यह है कुशल और मैं कुछ याद कर रहा हूँ?XU


2
आम तौर पर हम केवल कुछ प्रमुख घटकों में रुचि रखते हैं जो अधिकांश विचरण को समझाते हैं। एक कम एसवीडी करना संभव है; उदाहरण के लिए यदि आयाम की है एन × पी जहां पी < < एन तब के समारोह की गणना करेंगे केवल पहले पी छोड़ दिया और डिफ़ॉल्ट रूप से सही विलक्षण वैक्टर। XN×pp<<NRsvdp
एम। बर्क

1
@ M.Berk: हालांकि, दोनों दृष्टिकोणों में समान है: वे बराबर परिणाम देते हैं (साइन अप करने के लिए बराबर)। इसके अलावा, उदाहरण के लिए, R केवल C की गणना करता हैpC
केबेलाइट्स मोनिका

क्या आपके पास रास्ते (1) के लिए एक संदर्भ है? मैं केवल पीसीए के बारे में एसवीडी के माध्यम से सहसंयोजक मैट्रिक्स (यानी रास्ता 2) पर लागू होने के बारे में जानता हूं, क्योंकि यह कुछ संख्यात्मक समस्याओं से बचा जाता है और स्पष्ट रूप से आयामीता के साथ तराजू होता है, न कि डेटा सेट आकार। वे (1) मैं एसवीडी कहूंगा, पीसीए बिल्कुल नहीं। मैंने केवल इसे एक शुद्ध एसवीडी संदर्भ में देखा है, जहां कोई वास्तव में पूर्ण अपघटन नहीं करेगा।
एनोनी-मूस

@ Anony-Mousse, सिर्फ एक का उल्लेख करने के लिए, Joliffe, Principal component analysis, 2nd ed.वास्तव में, जोलिफ दोनों तरीकों का वर्णन करता है, लेकिन पीसीए पर मुख्य अध्याय में वह सिर्फ 1 के बारे में कहता है, जहां तक ​​मुझे याद है।
tnnphns

@ Anony-Mousse, मेरे लिए रास्ता 1 सैद्धांतिक बिंदु से महत्वपूर्ण है क्योंकि यह स्पष्ट रूप से दिखाता है कि पीसीए सीधे सरल पत्राचार विश्लेषण से कैसे संबंधित है ।
ttnphns 8

जवाबों:


7

यहाँ विषय पर मेरे 2ct हैं

  • केमोमेट्रिक्स व्याख्यान जहां मैंने पहली बार पीसीए इस्तेमाल किया समाधान (2) सीखा, लेकिन यह संख्यात्मक रूप से उन्मुख नहीं था, और मेरा संख्यात्मक व्याख्यान केवल एक परिचय था और जहां तक ​​मुझे याद है एसवीडी पर चर्चा नहीं की।

  • अगर मैं होम्स को समझता हूं : लार्ज-स्केल मैट्रिस के लिए फास्ट एसवीडी सही ढंग से, तो आपके विचार का इस्तेमाल लंबी मैट्रिसेस के कम्प्यूटेशनल फास्ट एसवीडी को प्राप्त करने के लिए किया गया है।
    इसका मतलब यह होगा कि एक अच्छा एसवीडी कार्यान्वयन आंतरिक रूप से (2) का पालन कर सकता है यदि यह उपयुक्त मैट्रिसेस का सामना करता है (मुझे नहीं पता कि क्या अभी भी बेहतर संभावनाएं हैं)। इसका मतलब यह होगा कि उच्च-स्तरीय कार्यान्वयन के लिए एसवीडी (1) का उपयोग करना बेहतर है और इसे BLAS पर छोड़ देना चाहिए, जिसमें आंतरिक रूप से उपयोग करने के लिए एल्गोरिदम का ध्यान रखा जाए।

  • त्वरित व्यावहारिक जांच: OpenBLAS का svd 5e4 x 100 के मैट्रिक्स पर, इस अंतर को बनाने के लिए प्रतीत नहीं होता है, svd (X, nu = 0)माध्य 3.5 s पर ले जाता है, जबकि svd (crossprod (X), nu = 0)54 ms (R के साथ से बुलाया जाता है microbenchmark) लेता है ।
    निश्चित रूप से eigenvalues ​​का स्क्वेरिंग तेज है, और इसके लिए दोनों कॉल के परिणाम समान हैं।

    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
    

अद्यतन: वू, डब्ल्यू पर एक नज़र है ; मस्सर्ट, डी। एंड डी जोंग, एस .: विस्तृत डेटा के लिए कर्नेल पीसीए एल्गोरिदम। भाग I: सिद्धांत और एल्गोरिदम, रसायन विज्ञान और बुद्धिमान प्रयोगशाला प्रणाली, 36, 165 - 172 (1997)। DOI: http://dx.doi.org/10.1016/S0169-7439(97)00010-5

यह पत्र पीसीए के लिए 4 अलग एल्गोरिदम के संख्यात्मक और कम्प्यूटेशनल गुणों पर चर्चा करता है: एसवीडी, ईजन अपघटन (ईवीडी), एनआईपीएएलएस और पावर।

वे इस प्रकार से संबंधित हैं:

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

कागज के संदर्भ हैं विस्तृत , और वे पर काम एक्स एक्स ' (कर्नेल पीसीए) - यह आप के बारे में पूछने के रूप में ठीक विपरीत स्थिति है। इसलिए लंबे मैट्रिक्स व्यवहार के बारे में आपके प्रश्न का उत्तर देने के लिए, आपको "कर्नेल" और "शास्त्रीय" के अर्थ का आदान-प्रदान करने की आवश्यकता है।X(30×500)XX

performance comparison

आश्चर्य नहीं कि शास्त्रीय या कर्नेल एल्गोरिदम का उपयोग करने के आधार पर ईवीडी और एसवीडी स्थान बदलते हैं। इस प्रश्न के संदर्भ में इसका मतलब है कि मैट्रिक्स के आकार के आधार पर एक या दूसरे बेहतर हो सकते हैं।

लेकिन "शास्त्रीय" SVD और ईवीडी की उनकी चर्चा से यह स्पष्ट है कि के अपघटन पीसीए गणना करने के लिए एक बहुत ही सामान्य तरीका है। हालांकि, वे यह निर्दिष्ट नहीं करते हैं कि एसवीडी एल्गोरिथ्म का उपयोग इसके अलावा किया जाता है कि वे मतलाब के फ़ंक्शन का उपयोग करते हैं।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

तो, आपका परीक्षण (3.5 सेकंड बनाम 54 मिसे) मेरी लाइन का समर्थन करता है कि "रास्ता 1" काफी धीमा है। सही?
tnnphns

1
@ttnphns: हाँ। लेकिन जैसा कि BLAS द्वारा svd प्रदान किया जाता है जो एक अलग BLAS के साथ भिन्न हो सकता है। मुझे उम्मीद है कि एक अच्छा अनुकूलित BLAS कुछ इस तरह से करता है। हालाँकि यह OpenBLAS के मामले में नहीं लगता है। मैं अन्य BLAS की जाँच करने के लिए बहुत आलसी हूँ, लेकिन शायद कुछ लोग अपने अन्य BLAS की जाँच कर सकते हैं ताकि हमें पता चले कि इस मामले के लिए कौन से अनुकूलित हैं और कौन से नहीं हैं। (मैंने OpenBLAS डेवलपर को ईमेल किया और उसे इस सवाल का लिंक भेजा, इसलिए शायद वह कुछ जानकारी जोड़ सकता है, उदाहरण के लिए एल्गोरिथ्म को svd (X'X)लंबे समय तक मैट्रिक न करने का कारण ।)
cbeleites मोनिका

XXn<pXXun+1=XXun/||XXun||v1XXXX×(Xun)

XXT

मैं आपके अपडेट के बारे में बात कर रहा था, जहां निपल्स शामिल हैं। मैं पुष्टि करता हूं कि निपल्स लापैक के एसवीडी में शामिल नहीं है। आपके बेंचमार्क प्रयोग के बारे में, जैसा कि कुछ microbenchmark(X <- matrix(rnorm(5e6), ncol=100), Y <- t(X), svd(X), svd(Y), control=list(order="inorder"), times = 5)दिलचस्प हो सकता है।
एल्विस

18

एसवीडी धीमा है लेकिन अक्सर इसकी उच्च संख्यात्मक सटीकता की वजह से पसंदीदा तरीका माना जाता है।

X1n1XXXXnp

यहां MATLAB के pca()फ़ंक्शन सहायता में लिखा गया है :

pcaमुख्य घटक विश्लेषण करने के लिए उपयोग करने वाले प्रमुख घटक एल्गोरिथ्म [...]:

'svd' - डिफ़ॉल्ट। एक्स के विलक्षण मूल्य अपघटन (SVD)।

np

अंतिम वाक्य यहाँ खेलने में महत्वपूर्ण गति सटीकता व्यापार बंद पर प्रकाश डाला गया है।

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 (चौथी पंक्ति) के बजाय सबसे तेज़ तरीका हो जाएगा। डेटा मैट्रिक्स का SVD खुद ही धीमा हो जाएगा।

हालाँकि, यह अधिक सटीक होगा क्योंकि गुणा करनाX with itself can lead to a numerical accuracy loss. Here is an example, adapted from @J.M.'s answer to Why SVD on X is preferred to eigendecomposition of XX in PCA on Math.SE.

Consider a data matrix

X=(111ϵ000ϵ000ϵ),
sometimes called Läuchli matrix (and let us omit centering for this example). Its squared singular values are 3+ϵ2, ϵ2, and ϵ2. Taking ϵ=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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.