2010-06-30 14 views
39

मैं काफी बड़े डेटासेट के साथ मशीन लर्निंग के साथ काम करता हूं (वे अभी भी स्मृति में फिट हैं) और मैंने आर में कुछ गणना लिखी है जो मुझे बहुत धीमी लगती है। इस प्रकार मैं प्रोग्राम के "महत्वपूर्ण हिस्सों" को संकलित कोड के साथ प्रतिस्थापित करना चाहता हूं जिसे मैं आर से कॉल करूंगा। उदाहरण के लिए मेरे पास एक उदाहरण समस्या forward-backward algorithm लागू कर रही है।क्या मुझे आर का विस्तार करने के लिए फोरट्रान या सी ++ सीखना चाहिए?

मेरा सवाल यह है कि मुझे ऐसा करने के लिए फोरट्रान या सी ++ सीखना चाहिए? मुझे केवल संख्यात्मक वैक्टर या मैट्रिस के साथ काम करने की आवश्यकता है। मुझे मुख्य रूप से दिलचस्पी है कि कौन सी भाषा सीखना आसान है और आर से इंटरफ़ेस और मुझे वास्तव में परवाह नहीं है कि मेरे सीवी पर कौन सा बेहतर दिखता है।

मैंने आर एक्सटेंशन मैनुअल पढ़ा है और कुछ साधारण फोरट्रान और सी ++ कोड के साथ इनलाइन पैकेज के साथ थोड़ा सा खेला है। मेरा वर्तमान प्रभाव यह है कि फोरट्रान 95 सीखना आसान होगा, हालांकि आरसीपीपी पैकेज भी बहुत दिलचस्प लग रहा है। मैं वर्तमान में आर, पायथन और Matlab पता है।

+0

क्या आपका आर कोड पहले से ही वेक्टरकृत है? बाहरी सी ++/फोर्टन कोड के बिना आर कोड को अनुकूलित करने के कई तरीके हैं। वैसे भी अच्छा सवाल, +1। – Marek

+0

हां मैंने जो भी कर सकता हूं उसे सदिश बनाने की कोशिश की है। मुझे कुछ पुनरावृत्तियों को चलाने की जरूरत है कि (AFAIK) को सदिश नहीं बनाया जा सकता है और मुझे लूप का उपयोग करने की आवश्यकता है। –

+1

आपने सी नहीं माना है? – Shane

उत्तर

19

की आसानी पर सब पर टिप्पणी नहीं कर सकता, तो यह कौन-सी भाषा बेहतर पसंद पर निर्भर हो सकता है, या कर सकते हैं बेहतर/तेज सीखो। हालांकि Rcpp आपको आर ऑब्जेक्ट्स को सी ++ में और अधिक आसानी से प्राप्त करने में बढ़त दे सकता है। इसके अलावा, 0.8.3 में सबसे हालिया जोड़ आपको संकलित कोड में आर-समान वेक्टर अभिव्यक्ति देते हैं।

दूसरी तरफ यदि आप मौजूदा पुस्तकालयों का उपयोग/पुन: उपयोग/अनुकूलन योजना बनाते हैं, तो मैं पर एक अच्छा नज़र डालेगा।mloss.org और देखें कि कौन सी भाषा आपको सबसे उपयोगी मशीन लर्निंग लाइब्रेरी प्रदान करती है और यह आपके निर्णय को भी मार्गदर्शन देती है।

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

+0

नई विशेषताएं आरसीपीपी वास्तव में बहुत आकर्षक लगती है। पैकेज पर कड़ी मेहनत के लिए बहुत धन्यवाद! क्या आरपीपीएआरडमिलिलो के साथ नए वेक्टरिज्ड कथन का उपयोग करना संभव है? –

+2

हां - आर्मडिलो का अभिव्यक्ति टेम्पलेट जादू है, और आरसीपीपी अब इसके रूपों को इसके साथ लाता है। आपको याद है, 'आरसीपीपी चीनी' हमारे वैक्टरों पर काम करती है, न कि आर्मडिलोस। यह संभवतः ब्रिज किया जा सकता है।ओह, और अगर आप यही कर रहे हैं तो यह जवाब स्वीकार करने के लिए स्वतंत्र महसूस करें :) –

+0

मुझे यह देखने और अंतिम स्वीकार्य उत्तर क्या है पर पुनर्विचार :) समस्या यह है कि मुझे बहुत कम सी ++ पता है इसलिए फोरट्रान के साथ शुरू करना आसान है, लेकिन मैं सी ++ के साथ और अधिक संभावनाएं देखता हूं। मेरे पास अभी सीखने के लिए बहुत अधिक समय नहीं है, लेकिन मैं वास्तव में कुछ गणना तेज करना चाहता हूं। –

3

यदि आप अकादमिक में हैं, तो बहुत से लोग अभी भी फोरट्रान का उपयोग करते हैं, इसलिए यह एक अच्छा प्लस हो सकता है। और संख्या के माध्यम से चबाने में फोर्टन वास्तव में अच्छा है।

+0

मैं विश्वविद्यालय में काम करता हूं और मेरा क्षेत्र कृषि इंजीनियरिंग है, मुझे पता है कि मेरे विभाग में पशु ब्रीडर फोर्ट्रान का उपयोग करते हैं। –

+0

तो मैं फिर फोर्टन के साथ जाने का सुझाव दूंगा। –

+0

मैं वास्तव में उनके साथ कोई कोड साझा नहीं करता हूं इसलिए वास्तविक तालमेल नहीं है ... मुझे लगता है कि मुझे कुछ सलाह मिल सकती है। मुझे निश्चित रूप से उन्हें बताने की ज़रूरत होगी कि आर से फोरट्रान सबराउटिन को इंटरफेसिंग करना अपेक्षाकृत आसान है। –

39

मैं फोर्ट्रान का एक उचित हिस्सा लिखता हूं, मैटलैब के बहुत सारे, और हाल ही में गंभीरता से सी ++ सीखना शुरू कर दिया। मुझे लगता है कि यदि आप सी ++ की बजाय फोरट्रान के साथ जाते हैं तो आप जल्द ही अपनी नई भाषा में उत्पादक बनेंगे। मैं इस मस्तिष्क को ध्यान में रखता हूं:

  • मुझे लगता है कि आप जिस संख्या में क्रंचिंग करना चाहते हैं वह संख्याओं के बड़े सरणी को संसाधित करना है। फोरट्रान इस पर बहुत अच्छा है और इसमें पूर्ण-सरणी संचालन के लिए मौलिक भाषा संरचनाएं और आंतरिक कार्य हैं (हमेशा आपको दिमाग से बेहतर प्रदर्शन नहीं करते हैं)। सी ++ इन विशेषताओं को याद करता है, आपको या तो उन्हें स्वयं प्रोग्राम करना होगा या बूस्ट जैसे लाइब्रेरी का उपयोग करना होगा (लोगों द्वारा अत्यधिक अनुशंसित लोगों द्वारा अत्यधिक अनुशंसित)।
  • कई प्रकार की विशेषताएं जो सी ++ को विभिन्न प्रकार के अनुप्रयोग प्रकारों (टेम्पलेट्स जैसी सुविधाएं, सभी ओओ सामान, पॉइंटर्स, संदर्भ, आदि) के लिए एक आकर्षक भाषा बनाती हैं, वे आपके डोमेन के भीतर बहुत उपयोगी नहीं हैं। मुझे संदेह है कि यदि आपको 'चालाक' प्रोग्रामिंग करने की आवश्यकता है तो आप इसे आर में करेंगे, जिससे फोर्ट्रान को सरल भारी उठाने के लिए छोड़ दिया जाएगा। फोरट्रान में इनमें से अधिकतर सुविधाएं भी हैं, लेकिन फोर्ट्रान कम्युनिटी में उनका व्यापक रूप से उपयोग नहीं किया जाता है।
  • फोरट्रान मानसिकता Matlab मानसिकता से बहुत दूर नहीं है, इसलिए बाद वाले से पूर्व में छलांग बहुत बड़ी नहीं है। अभी भी, मेरा विचार यह है कि आपके डोमेन में पर्याप्त फोर्ट्रान उत्पादक होने के लिए सीखना पर्याप्त सी ++ सीखने से तेज़ होगा।
  • फोरट्रान और सी ++ के सापेक्ष प्रदर्शन के लिए: जब तक आपके सामने माप नहीं है तब तक कुछ भी विश्वास न करें। लेकिन मुझे लगता है कि फोर्ट्रान प्रदर्शन से मेल खाने के लिए आपको सी ++ प्राप्त करने के लिए कठिन और स्मार्ट काम करना होगा। यह निश्चित रूप से किया जा सकता है, लेकिन मुझे लगता है कि यह प्रोग्रामर के कौशल की अधिक मांग है। फोरट्रान कंपाइलर्स के पास 50 से अधिक वर्षों का काम था और फोरट्रान प्रोग्रामर के लिए निष्पादन गति के लिए अनुकूलन बहुत महत्वपूर्ण है।

आप सभी कोड अपने आप को लिख दिया जाएगा अगर मैं एकीकृत अनुसंधान और फोरट्रान या सी ++

+1

प्रदर्शन पर एक नोट के रूप में: मेरा मानना ​​है कि फोर्ट्रान प्रोग्राम आमतौर पर सी/सी ++ से बेहतर होते हैं जब सरणी संसाधित करते हैं क्योंकि फोरट्रान में कोई पॉइंटर्स नहीं होता है। एक फर्मन कंपाइलर तब इस तथ्य के आधार पर अनुकूलन निष्पादित कर सकता है कि एक सरणी केवल इसके नाम (Google "एलियासिंग समस्या" के माध्यम से अधिक जानकारी के लिए उपयोग की जाती है)। –

+1

@Alexandre: ठीक है, वास्तव में, फोरट्रान में पॉइंटर्स हैं। लेकिन मुझे लगता है, जैसा कि आप करते हैं, कि वे सरणी प्रसंस्करण के लिए आवश्यक नहीं हैं। अंतर्दृष्टि के लिए –

+0

धन्यवाद। मैं मानता हूं कि जब आप Matlab को जानते हैं तो फोरट्रान सिंटैक्स पढ़ना बहुत आसान है। मैंने पाया कि आर्मडिलो लाइब्रेरी और आरपीपीएआरडमिलिलो उन सरणी संचालन प्रदान करने लगते हैं जिन्हें मुझे सी ++ के लिए जरूरी है और यहां मैटलैब उपयोगकर्ताओं के लिए एक वाक्यविन्यास रूपांतरण तालिका http://arma.sourceforge.net/docs.html#syntax भी है। मुझे लगता है कि मैं दोनों भाषाओं में कुछ छोटी परियोजनाओं को लागू करने की कोशिश करूंगा और जो अधिक प्राकृतिक लगता है उसके साथ जाऊंगा। –

5

फोरट्रान एचपीसी का जावा है। आप सी ++ में बहुत ही कुशल प्रोग्राम लिख सकते हैं लेकिन फोरट्रान में एक ही प्रोग्राम लिखना आसान है, जब तक कि यह संख्या क्रंचिंग के लिए उपयुक्त न हो। फोरट्रान में कोई भी गंभीरता से जीयूआई आवेदन नहीं लिखता है, लेकिन एचपीसी में यह गति और एकता में नामुमकिन है।

15

फोरट्रान पहली प्रोग्रामिंग भाषा थी जिसे मैंने सीखा था, तब से मैंने सी और कुछ सी ++ भी उठाए हैं। मेरे दो सेंट यह है कि यदि आपको कुछ मैट्रिक्स प्रोसेसिंग को तेज़ करने की ज़रूरत है, तो निश्चित रूप से फोरट्रान के साथ जाएं। कारण हैं:

  • फोरट्रान संख्यात्मक डेटा प्रसंस्करण पर कुशलता से वास्तव में अच्छा है, खासकर जब यह मैट्रिक्स या सरणियों में संग्रहित है। इस प्रकार का काम भाषा का 'मीठा स्थान' है।

  • क्योंकि फोरट्रान संख्यात्मक परिचालनों पर एक संकीर्ण ध्यान केंद्रित करता है, इसकी सी और सी ++ की तुलना में कम सीखने की वक्र होती है। सीखने के लिए कम भाषा सुविधाएं और quirks हैं और आपको पॉइंटर्स से निपटने की ज़रूरत नहीं है। यह एक बड़ी जीत है यदि आप जो कुछ करना चाहते हैं वह कुछ गणनाओं को जितनी जल्दी हो सके तेज़ी से बढ़ाएं और अपने काम के साथ आगे बढ़ें।

  • बहुआयामी Arrays और सरणी संचालन फोरट्रान भाषा में प्रथम श्रेणी के नागरिक हैं। सी या सी ++ के साथ आपको एक ही कार्यक्षमता प्रदान करने के लिए बाहरी पुस्तकालयों या लेखन कार्यों/मैक्रोज़ का उपयोग करने की चिंता करने की आवश्यकता है।

दूसरी ओर, सी और सी ++ संख्यात्मक गणना के दायरे के बाहर सामान्य उद्देश्य प्रोग्रामिंग कार्यों के लिए निश्चित रूप से बेहतर उपयुक्त हैं। यदि आप अपने भविष्य में बहुत सी स्ट्रिंग मैनिपुलेशन की तरह कुछ की संभावना देखते हैं तो शायद आप फोरट्रान के अलावा किसी अन्य भाषा में अपना समय निवेश करना चाहते हैं।

अद्यतन

एक अन्य महत्वपूर्ण विचार कैसे अपने डेटा संग्रहीत और आर पक्ष पर कार्रवाई कर रहा है। यदि आप फोर्टन का उपयोग करते हैं तो आपको संकलित दिनचर्या में बहुत ही बुनियादी तरीके से अपने डेटा को पास करना होगा- स्केलर्स, वैक्टर आदि। कोई सूचियां या फैंसी ऑब्जेक्ट्स नहीं।

चूंकि आर सी में लागू किया गया है, वहां एक समृद्ध इंटरफ़ेस उपलब्ध है जो आपको सी और सी ++ दिनचर्या के लिए मनमानी आर ऑब्जेक्ट्स को सीधे पास करने की अनुमति देता है और फिर मनमानी आर ऑब्जेक्ट्स लौटाता है। आप कॉलबैक निष्पादित भी कर सकते हैं जो आपको संकलित सी कोड के भीतर से आर फ़ंक्शन निष्पादित करने की अनुमति देता है।

13

मैंने अब फोरट्रान, सी ++ और आर का उपयोग करने में कुछ प्रयोग किए हैं और मुझे लगता है कि अब मैं अपने प्रश्न का उत्तर देने के लिए कम से कम आधा तैयार हूं। मैं ++ दोनों फोरट्रान और सी में diff समारोह (और कुछ अन्य छोटे परीक्षण) लेखन और आर

से बुला शुरुआत मैं किसी को भी इस समस्या का सामना करना पड़ Writing R extensions, Rcpp introduction और Rcpp FAQ पढ़ना चाहिए लगता है के लिए समाप्त हो गया।

मैं अब आर कि अभी तक जवाब में शामिल नहीं किया गया है से कोड इंटरफ़ेस के बारे में कुछ महत्वपूर्ण बिंदुओं की खोज की है: इनलाइन पैकेज

  • Rcpp साथ बुला सी ++ आर अत्यंत आसान से बनाता है और यहां तक ​​कि का ख्याल रखता है एक्सटेंशन को संकलित करना (आरसीपीपी एफएक्यू देखें), आप उस सब कुछ को निर्दिष्ट कर सकते हैं जिसे आप फ़ंक्शन में नहीं जाना चाहते हैं और आप बाहर निकलना नहीं चाहते हैं।
  • आरसीपीपी और आरपीपीएआरडमिलिलो का उपयोग करके कुशल कंप्यूटेशंस लिखना संभव है और सी ++ के बहुत बुनियादी ज्ञान के साथ उन्हें आसानी से आर से कॉल करना संभव बनाता है।
  • फोरट्रान के लिए आर इंटरफेस "फोर्ट्रान" बहुत सीमित है, आपको इसे करने के लिए एक सबराउटिन का उपयोग करने की आवश्यकता है और आपको उन सभी पैरामीटर को पारित करने की आवश्यकता है, जिन्हें आप बाहर निकलना नहीं चाहते हैं। यह है (जैसा कि मैं समझता हूं) कि आपको परिणाम वेक्टर (ओं) (या सरणी) को subroutine को प्रीलोकेट और पास करने की आवश्यकता है और सबराउटिन भी सभी पैरामीटर देता है। यह मुश्किल नहीं है, लेकिन बहुत अधिक त्रुटि प्रवण, थकाऊ और सीमित है।
  • आप एक पोर्टेबल पैकेज आप उपयोग करने की आवश्यकता लिखने के लिए wan't तो F77 एक निष्कर्ष के रूप में here.

तो देखें: मैं क्या लिख ​​जरूरत फोरट्रान और सी ++ (वर्मी के साथ) के लिए लगता है ~ उतना ही आसान (या मुश्किल), लेकिन आर से सी ++ कोड इंटरफेसिंग आरसीपीपी के साथ एक बहुत आसान है।

+0

कूल! यह इतना है कि हम इसे लिखने के लिए क्या लक्ष्य रखते हैं, इसलिए यह देखने के लिए काफी प्रसन्नता है कि यह वास्तव में आपके लिए काम करता है! ;-) –

+2

मैंने अभी वही कर लिया जो मैं चाहता था और 70 गुना तेजी से कोड का सबसे धीमा हिस्सा बनाने में सक्षम था! मुझे केवल कुछ घंटों का समय लगता है, मुझे नहीं लगता कि असली परियोजना के लिए आरसीपीपी, आर्मडिलो और सी ++ का उपयोग करने के लिए पहली बार बुरा लगता है! महान पैकेज के लिए फिर से धन्यवाद! –

+5

फोरट्रान 77 में कोड लिखना पोर्टेबल आर पैकेज के लिए कोई आवश्यकता नहीं है। – Sharpie

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