2010-09-21 13 views
19

मैं मैन्युअल विनिर्देश के साथ एक बहुआयामी लॉगिट मॉडल का अनुमान लगाने के लिए आर का उपयोग करने की कोशिश कर रहा हूं। मुझे कुछ पैकेज मिल गए हैं जो आपको एमएनएल मॉडल here या here का अनुमान लगाने की अनुमति देते हैं।आर के अनुकूल फ़ंक्शन से आगे बढ़ना

मुझे आपके स्वयं के एमएलई फ़ंक्शन here "रोलिंग" पर कुछ अन्य लेख मिल गए हैं। हालांकि, मेरे खुदाई से - ये सभी कार्य और पैकेज आंतरिक optim फ़ंक्शन पर भरोसा करते हैं।

मेरे बेंचमार्क परीक्षणों में, optim बाधा है। ~ 16000 अवलोकन और 7 पैरामीटर के साथ एक अनुरूपित डेटासेट का उपयोग करके, आर को मेरी मशीन पर लगभग 9 0 सेकंड लगते हैं। Biogeme में समकक्ष मॉडल ~ 10 सेकंड लेता है। एक सहयोगी जो Ox में अपना कोड लिखता है, उसी मॉडल के लिए लगभग 4 सेकंड की रिपोर्ट करता है।

क्या किसी को अपना स्वयं का एमएलई फ़ंक्शन लिखने का अनुभव है या मुझे डिफ़ॉल्ट optim फ़ंक्शन (कोई इरादा नहीं है) से ऑप्टिमाइज़ किए गए किसी चीज़ की दिशा में इंगित कर सकता है?

यदि कोई भी मॉडल को पुन: बनाने के लिए आर कोड चाहता है, तो मुझे बताएं - मैं इसे प्रदान करूंगा। मैंने इसे प्रदान नहीं किया है क्योंकि यह optim फ़ंक्शन को अनुकूलित करने और अंतरिक्ष को संरक्षित करने की समस्या से सीधे प्रासंगिक नहीं है ...

संपादित करें: आपके विचारों के लिए सभी को धन्यवाद। नीचे दी गई टिप्पणियों के असंख्य आधार पर, हम एक ही गेंदबाज में बी को अधिक जटिल मॉडल के लिए बायोगेम के रूप में प्राप्त करने में सक्षम थे, और आर कई छोटे/सरल मॉडल के लिए वास्तव में तेज़ था जो हमने भाग लिया था। मुझे लगता है कि इस समस्या के दीर्घकालिक समाधान में एक अलग अधिकतमकरण समारोह लिखना शामिल है जो कि फोर्टन या सी लाइब्रेरी पर निर्भर करता है, लेकिन निश्चित रूप से अन्य दृष्टिकोणों के लिए खुला हूं।

+3

शैतान विवरण में है। आप 'ऑप्टिमाइम पैरामीटर' के साथ गड़बड़ कर सकते हैं (दस्तावेज़ीकरण में 'नियंत्रण' के बारे में अनुभाग देखें)। आप अपने सहयोगी कोड या बायोगेमे द्वारा उपयोग किए गए डिफ़ॉल्ट पैरामीटर की तुलना कर सकते हैं। क्या वे अलग हैं, अगर हां तो क्यों? – Marek

+0

@ मरेक - बायोगेम सी में लिखे गए एक कस्टम अधिकतमकरण दिनचर्या पर निर्भर करता है और यह ऑक्स के साथ एक समान कहानी है।यह मेरे लिए एक नया क्षेत्र है, लेकिन मैं इस्तेमाल किए गए विभिन्न दृष्टिकोणों के बारे में जानना शुरू कर रहा हूं। – Chase

+0

जहां तक ​​मुझे समझा गया, nlm() और संभवतः आर में अन्य अनुकूलन दिनचर्या पहले ही सी में लिखी गई हैं। मैं आपको सीधे आंतरिक कार्यों तक पहुंच की तलाश करने की सलाह दूंगा ताकि आप व्हील –

उत्तर

18

पहले से ही nlm() फ़ंक्शन के साथ प्रयास किया? पता नहीं है कि यह बहुत तेज है, लेकिन यह गति में सुधार करता है। विकल्प भी जांचें। ऑप्टिमाइज़ डिफ़ॉल्ट रूप से एक धीमी एल्गोरिदम का उपयोग करता है। आप डिफ़ॉल्ट के बजाय Quasi-Newton एल्गोरिदम (विधि = "BFGS") का उपयोग करके> 5-गुना गति प्राप्त कर सकते हैं। यदि आप अंतिम अंकों के बारे में ज्यादा चिंतित नहीं हैं, तो आप अतिरिक्त गति प्राप्त करने के लिए सहिष्णुता के स्तर को एनएलएम() से भी अधिक सेट कर सकते हैं।

f <- function(x) sum((x-1:length(x))^2) 

a <- 1:5 

system.time(replicate(500, 
    optim(a,f) 
)) 
    user system elapsed 
    0.78 0.00 0.79 

system.time(replicate(500, 
    optim(a,f,method="BFGS") 
)) 
    user system elapsed 
    0.11 0.00 0.11 

system.time(replicate(500, 
    nlm(f,a) 
)) 
    user system elapsed 
    0.10 0.00 0.09 

system.time(replicate(500, 
     nlm(f,a,steptol=1e-4,gradtol=1e-4) 
)) 
    user system elapsed 
    0.03 0.00 0.03 
+2

जोरीस को पुन: आविष्कार करने के बजाय ओवरहेड से छुटकारा पा सकें, क्या आप समझा सकते हैं * यह नहीं पता कि यह बहुत तेज़ है, लेकिन यह गति में सुधार करता है * एक बार और? मेरे पास आज केवल दो कॉफी थे। क्या आपका मतलब है "तेज़, लेकिन कितना अनिश्चित"? –

+2

एरर, कुंजीपटल के इस तरफ भी अधिक कॉफी की आवश्यकता है ... असल में, यह उन कार्यों पर तेज़ है जिन पर मैंने परीक्षण किया था, कभी-कभी मामूली रूप से, कभी-कभी थोड़ा सा। यह कोड में सचित्र के रूप में नियंत्रण सेटिंग्स पर भी निर्भर करता है। –

+0

nlm() पर टिप के लिए धन्यवाद। ऊपर बताए गए कदम और ढाल को बदलने के बाद यह सबसे तेज़ हो गया। – Chase

2

एफडब्ल्यूआईडब्ल्यू, मैंने इसे OPTIF9 का उपयोग करके सी-आईएसएच में किया है। आप उससे तेज जाने के लिए कड़ी मेहनत करेंगे। कुछ धीमे होने के लिए बहुत सारे तरीके हैं, जैसे आर

जोड़ा गया: टिप्पणियों से, यह स्पष्ट है कि OPTIF9 को ऑप्टिमाइज़िंग इंजन के रूप में उपयोग किया जाता है। इसका मतलब है कि अधिकतर समय में आर में उद्देश्य कार्य का मूल्यांकन करने में काफी समय व्यतीत होता है। हालांकि यह संभव है कि कुछ कार्यों के लिए सी कार्यों का उपयोग किया जा रहा है, फिर भी दुभाषिया ओवरहेड है। यह निर्धारित करने का एक त्वरित तरीका है कि आर में कोड और फ़ंक्शन कॉल की कौन सी रेखाएं अधिकांश समय के लिए ज़िम्मेदार हैं, और इसे एस्केप कुंजी के साथ रोकना और स्टैक की जांच करना है। यदि किसी कथन का समय X% है, तो यह उस समय के एक्स एक्स स्टैक पर है। आप पाते हैं कि ऐसे ऑपरेशन हैं जो सी नहीं जा रहे हैं और होना चाहिए। जब आप आर निष्पादन को समानांतर करने का कोई तरीका ढूंढते हैं तो आपको इस तरह से प्राप्त होने वाला कोई भी गति कारक संरक्षित किया जाएगा।

+0

आर के कुछ अंतर्निहित दिनचर्या सी या फोरट्रान में हैं। तो सैद्धांतिक रूप से, आर गति में सी के करीब होने में सक्षम होना चाहिए। अब यह अच्छा कार्यान्वयन खोजने का मामला है। पता नहीं है कि OPTIF9 का उपयोग किया जाता है, लेकिन यह अतिरिक्त पैकेज के लिए एक अच्छा विचार होगा ;-) –

+0

डेनिस-स्केनाबेल एल्गोरिदम 'optif9' आरएल में आरएल में लागू किया गया है। (आर स्रोत कोड पर एक त्वरित रूप से पता चलता है कि यह पुराने फोर्टन सबराउटिन का सी पुनः लिखना है)। – eyjo

+0

@eyjo: @ जोरीस: यह अच्छा है, और यही वह है जो मैं उम्मीद करता हूं। फिर उस समय का बड़ा हिस्सा उपयोगकर्ता में कोडित उद्देश्य समारोह में खर्च किया जाएगा। यदि इसे एक कंपाइलर भाषा में अनुवाद करना संभव था तो यह सी –

संबंधित मुद्दे