आर में मैट्रिक्स व्युत्क्रम की कुशल गणना


21

मुझे मैट्रिक्स व्युत्क्रम की गणना करने की आवश्यकता है और solveफ़ंक्शन का उपयोग कर रहा है। जबकि यह छोटे मेट्रिसेस पर अच्छा काम करता है, solveबड़े मेट्रिसेस पर बहुत धीमी गति से चलता है । मैं सोच रहा था कि क्या कोई अन्य फ़ंक्शन या फ़ंक्शन (एसवीडी, क्यूआर, एलयू, या अन्य अपघटन कार्यों के माध्यम से) का संयोजन है जो मुझे तेजी से परिणाम दे सकता है।


2
क्या आप अधिक जानकारी प्रदान कर सकते हैं? अनुमानित आयाम क्या हैं? क्या मैट्रिक्स में कोई विशेष संरचना (समरूपता, विरलता, आदि) है? "धीमी" की आपकी मात्रात्मक परिभाषा क्या है? और तेज"?
कार्डिनल

अनुमानित आयाम 2000x2000 की तरह हैं। मैट्रिक्स में कोई विशेष संरचना नहीं है। ठीक है, solveविधि निश्चित रूप से मेरा काम करती है लेकिन मैं चाहता हूं कि एल्गोरिथ्म तेज हो। इसलिए, मैं सोच रहा हूं कि क्या इस तरह के बड़े आकार के मैट्रिक्स के लिए व्युत्क्रम की गणना करने के लिए एक अधिक कुशल (समय के संदर्भ में) फ़ंक्शन है।
जितेंद्र

1
क्या आपने सहायता पृष्ठ पर किसी अन्य सुझाव के लिए प्रयास किया है solve? बेशक, विशेष संरचना अनुपस्थित है, आप सामान्य मैट्रिक्स व्युत्क्रम पर सैद्धांतिक जटिलता सीमा से बच नहीं सकते।
कार्डिनल

3
@ कार्डिनल वास्तविक अनुप्रयोग से संबंधित जांच को आगे बढ़ाने के लिए है, जैसा कि आप जानते हैं, कई मामलों में मैट्रिक्स को निष्क्रिय करना अनावश्यक है (और समय लेने वाली और त्रुटि-प्रवण)।
whuber

@ वाउचर: यह एक बहुत अच्छा बिंदु है। मुझे लगता है कि कभी-कभी मैं इन सवालों के बारे में थोड़ा-बहुत सीधे संपर्क करता हूं।
कार्डिनल

जवाबों:


23

क्या आपने कोशिश की है कि कार्डिनल ने क्या सुझाव दिया और व्युत्क्रम की गणना के लिए कुछ वैकल्पिक तरीकों का पता लगाया? आइए एक विशिष्ट उदाहरण पर विचार करें:

library(MASS)

k   <- 2000
rho <- .3

S       <- matrix(rep(rho, k*k), nrow=k)
diag(S) <- 1

dat <- mvrnorm(10000, mu=rep(0,k), Sigma=S) ### be patient!

R <- cor(dat)

system.time(RI1 <- solve(R))
system.time(RI2 <- chol2inv(chol(R)))
system.time(RI3 <- qr.solve(R))

all.equal(RI1, RI2)
all.equal(RI1, RI3)

तो, यह एक सहसंबंध मैट्रिक्स का एक उदाहरण है जिसके लिए हम व्युत्क्रम चाहते हैं। मेरे लैपटॉप पर (Core-i5 2.50Ghz), 8-9 सेकंड लेता है, 4 सेकंड से थोड़ा अधिक लगता है , और 17-18 सेकंड लगते हैं (कोड के कई रन स्थिर परिणाम प्राप्त करने के लिए सुझाए गए हैं)।2000×2000solvechol2inv(chol())qr.solve()

तो चोल्स्की अपघटन के माध्यम से व्युत्क्रम लगभग दोगुना तेज है solve। बेशक ऐसा करने के और भी तेज़ तरीके हो सकते हैं। मैंने यहाँ कुछ सबसे स्पष्ट लोगों को खोजा। और जैसा कि पहले ही टिप्पणियों में उल्लेख किया गया है, अगर मैट्रिक्स की एक विशेष संरचना है, तो यह संभवतः अधिक गति के लिए शोषण किया जा सकता है।


इस समाधान के लिए बहुत बहुत धन्यवाद। मैं, कम से कम, एक विधि जानता हूं जो इसे आधे समय की तुलना में हल कर सकता है solve:-)
जितेंद्र

8
चॉल्स्की अपघटन सहसंयोजक / सहसंबंध मैट्रिक्स के लिए एक अच्छा विकल्प है लेकिन ध्यान रखें कि सामान्य रूप से मैट्रिक्स को हर्मिटियन होना चाहिए (वास्तविक मेट्रिक्स के मामले में जो सममित का मतलब है), सकारात्मक निश्चित मैट्रिक्स। LU अपघटन के लिए आवश्यक स्मृति का आधा उपयोग करता है।
Raxel
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.