एक बहुभिन्नरूपी सामान्य वितरण से नमूने खींचने के लिए कोलेस्की बनाम ईगेंडेकोम्पोजिशन


16

मैं एक नमूना आकर्षित करना चाहूंगा । विकिपीडिया या तो एक का उपयोग कर पता चलता है Cholesky या Eigendecomposition , यानी या xN(0,Σ)Σ=D1D1TΣ=QΛQT

और इसलिए नमूना के माध्यम से तैयार किया जा सकता है: या जहां x=D1vx=QΛvvN(0,I)

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


1
डेमियन, यह सुनिश्चित करने के लिए सबसे अच्छा नुस्खा है कि कौन सा प्रोग्राम तेज है, इसे अपने सॉफ़्टवेयर पर स्वयं जांचना है: चोल्स्की- और ईगेन-डिकम्पोजिशन फ़ंक्शन अलग-अलग कार्यान्वयन में गति में भिन्न हो सकते हैं। चोल्स्की रास्ता अधिक लोकप्रिय है, एएफएआईके, लेकिन ईजन रास्ता संभवतः अधिक लचीला हो सकता है।
ttnphns

1
मैं चोल्स्की को तेजी से 3/3 ( विकिपीडिया ) समझता हूं जबकि eigendecomposition ( जैकोबी Eigenvalue एल्गोरिथम) है । हालांकि, मेरी दो और समस्याएं हैं: (1) "संभावित रूप से अधिक लचीला" का अर्थ है। ? (2) भिन्नता के कई आदेशों से भिन्नताएं भिन्न होती हैं ( बनाम सबसे चरम तत्वों के लिए) - क्या यह चयनित एल्गोरिथ्म पर असर डालता है?O(N3/3)O(N3)104109
डेमियन

@Damien "अधिक लचीला" का एक पहलू यह है कि इगेंडेकम्पोजीशन, जो एक सहसंयोजक मैट्रिक्स के लिए SVD से मेल खाती है , को पूर्ण मैट्रिक्स का एक इष्टतम निम्न-रैंक सन्निकटन प्राप्त करने के लिए छोटा किया जा सकता है। पूरी तरह से गणना करने और फिर छोटे आइजनवेल्स को बाहर फेंकने के बजाय, छंटनी की गई एसवीडी को सीधे गणना की जा सकती है।
जियोमैट 22

स्टैक ओवरफ्लो में मेरे जवाब को पढ़ने के बारे में कैसे : एक दीर्घवृत्त कोवरियस प्लॉट (द्वारा बनाई गई car::ellipse) पर दीर्घवृत्त के कोने प्राप्त करें । हालाँकि यह प्रश्न अलग-अलग एप्लिकेशन में पूछा जाता है, लेकिन इसके पीछे का सिद्धांत एक ही है। आपको वहां ज्यामितीय स्पष्टीकरण के लिए अच्छे आंकड़े दिखाई देंगे।

जवाबों:


12

समस्या का अध्ययन स्ट्रेका et.al द्वारा अनसेंटेड कलमन फ़िल्टर के लिए किया गया था जो एल्गोरिथ्म के हिस्से के रूप में एक मल्टीवेरिएट नॉर्मल डिस्ट्रीब्यूशन से प्राप्त (निर्धारक) नमूने हैं। कुछ भाग्य के साथ, परिणाम मोंटे-कार्लो समस्या पर लागू हो सकते हैं।

चोल्स्की अपघटन (सीडी) और ईजन अपघटन (ED) - और इस मामले के लिए वास्तविक मैट्रिक्स स्क्वायर रूट (MSR) सभी तरीके हैं जिसमें एक सकारात्मक अर्ध-निश्चित मैट्रिक्स (PSD) को तोड़ा जा सकता है।

पर विचार करें SVD एक PSD मैट्रिक्स, की । चूंकि P PSD है, यह वास्तव में P = U S U T के साथ ED के समान है । : इसके अलावा, हम अपने वर्गमूल से विकर्ण मैट्रिक्स विभाजित कर सकते हैं पी = यू P=USVTP=USUT, यह देखते हुए किnotP=USSTUTS=ST

अब हम एक मनमाना ऑर्थोगोनल मैट्रिक्स पेश कर सकते हैं :O

P=USOOTSTUT=(USO)(USO)T

का विकल्प वास्तव में अनुमान प्रदर्शन को प्रभावित करता है, खासकर जब सहसंयोजक मैट्रिक्स के मजबूत ऑफ-विकर्ण तत्व होते हैं।O

कागज ने तीन विकल्पों का अध्ययन किया :O

  • , जो ईडी से मेल खाती है;O=I
  • सेQR अपघटनके यू O=Q, जो सीडी से मेल खाती है; तथाUS=QR
  • जो एक सममित मैट्रिक्स की ओर जाता है (यानी MSR)O=UT

जिसमें से बहुत विश्लेषण के बाद निम्नलिखित निष्कर्ष निकाला गया था (उद्धृत):

  • असम्बद्ध तत्वों के साथ एक-से-परिवर्तित यादृच्छिक चर के लिए सभी तीन माना जाता है कि एमडी समान सिग्मा अंक प्रदान करते हैं और इसलिए वे [अनसेंटेड ट्रांसफ़ॉर्म] सन्निकटन की गुणवत्ता पर लगभग कोई अंतर नहीं डालते हैं। ऐसे मामले में सीडी को कम लागत के लिए पसंद किया जा सकता है।

  • यदि रैंडम वैरिएबल में सहसंबंधित तत्व होते हैं, तो अलग-अलग [डीकंपोज़िशन] का उपयोग, परिवर्तित रैंडम वैरिएबल के माध्य या सहसंयोजक मैट्रिक्स के [अनसेंटेड ट्रांसफ़ॉर्म] सन्निकटन की गुणवत्ता को काफी प्रभावित कर सकता है। उपरोक्त दो मामलों से पता चला कि [ED] को प्राथमिकता दी जानी चाहिए।

  • यदि परिवर्तित-से-परिवर्तित चर के तत्व मजबूत सहसंबंध प्रदर्शित करते हैं ताकि संबंधित सहसंयोजक मैट्रिक्स लगभग एकवचन हो, तो एक और समस्या को ध्यान में रखा जाना चाहिए, जो कि एमडी कंप्यूटिंग एल्गोरिथ्म की संख्यात्मक स्थिरता है। एसवीडी ChD की तुलना में लगभग एकवचन सहसंयोजक मैट्रिक्स के लिए अधिक संख्यात्मक रूप से स्थिर है।

संदर्भ:

  • स्ट्राका, ओ।; डनिक, जे।; सीमन्डल, एम। एंड हैलिक, जे। "असंगत कलमन फ़िल्टर में मैट्रिक्स डिकम्पोज़िशन की आकांक्षा और तुलना", अमेरिकी नियंत्रण सम्मेलन (एसीसी), 2013, 2013, 3075-3080।

6

यहाँ दो विधि की गणना समय की तुलना करने के लिए R का उपयोग करते हुए एक सरल चित्रण किया गया है।

library(mvtnorm)
library(clusterGeneration)
set.seed(1234)
mean <- rnorm(1000, 0, 1)
sigma <- genPositiveDefMat(1000)
sigma <- sigma$Sigma

eigen.time <- system.time(
  rmvnorm(n=1000, mean=mean, sigma = sigma, method = "eigen")
  )

chol.time <- system.time(
  rmvnorm(n=1000, mean=mean, sigma = sigma, method = "chol")
  )

भागते समय हैं

> eigen.time
   user  system elapsed 
   5.16    0.06    5.33 
> chol.time
   user  system elapsed 
   1.74    0.15    1.90

नमूना आकार को 10000 तक बढ़ाते समय, चलने का समय होता है

> eigen.time <- system.time(
+   rmvnorm(n=10000, mean=mean, sigma = sigma, method = "eigen")
+   )
> 
> chol.time <- system.time(
+   rmvnorm(n=10000, mean=mean, sigma = sigma, method = "chol")
+   )
> eigen.time
   user  system elapsed 
   15.74    0.28   16.19 
> chol.time
   user  system elapsed 
   11.61    0.19   11.89 

उम्मीद है की यह मदद करेगा।


3

यहाँ मैनुअल, या गरीब-आदमी का, यह साबित करना है कि स्वयं प्रदर्शन है:

> set.seed(0)
> # The correlation matrix
> corr_matrix = matrix(cbind(1, .80, .2, .80, 1, .7, .2, .7, 1), nrow=3)
> nvar = 3 # Three columns of correlated data points
> nobs = 1e6 # One million observations for each column
> std_norm = matrix(rnorm(nvar * nobs),nrow=nobs, ncol=nvar) # N(0,1)   

Corr=[1.8.2.81.7.2.71]

N=[[,1][,2][,3][1,]1.08063380.65639130.8400443[2,]1.14342410.17297380.9884772[999999,]0.48618270.035630062.1176976[1000000,]0.43945511.692655171.9534729]

1. SVD विधि:

[U[3×3]Σ0.5[d1000d2000d3]NT[3×106]]T
> ptm <- proc.time()
> # Singular Value Decomposition method:
> svd = svd(corr_matrix)   
> rand_data_svd = t(svd$u %*% (diag(3) * sqrt(svd$d)) %*% t(std_norm))
> proc.time() - ptm
   user  system elapsed 
   0.29    0.05    0.34 
> 
> ptm <- proc.time()

2. चॉकलेट विधि:

[Ch[c1100c21c220c31c32c33]NT[3×106]]T
> # Cholesky method:
> chole = t(chol(corr_matrix))
> rand_data_chole = t(chole %*% t(std_norm))
> proc.time() - ptm
   user  system elapsed 
   0.25    0.03    0.31 

@ Userr11852 को धन्यवाद देता हूं कि मुझे यह बताने के लिए कि फ़ंक्शन का उपयोग करते हुए, बाद के पक्ष में, SVD और चोल्स्की के बीच के प्रदर्शन में अंतर की गणना करने का एक बेहतर तरीका है microbenchmark। उनके सुझाव पर, यहाँ परिणाम है:

microbenchmark(chol(corr_matrix), svd(corr_matrix))
Unit: microseconds
              expr     min     lq      mean  median      uq     max neval cld
 chol(corr_matrix)  24.104  25.05  28.74036  25.995  26.467  95.469   100  a 
  svd(corr_matrix) 108.701 110.12 116.27794 111.065 112.719 223.074   100   b

@ user11852 धन्यवाद। मैं सौभाग्य से प्रविष्टि को पढ़ता हूं microbenchmarkऔर इससे वास्तव में फर्क पड़ता है।
एंटोनी परेलाडा

ज़रूर, लेकिन क्या अनुमान प्रदर्शन में अंतर है?
डेमियन

अच्छी बात। मेरे पास पैकेज तलाशने का समय नहीं है।
एंटोनी परेलाडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.