सांख्यिकीय कंप्यूटिंग के लिए सी ++ पुस्तकालय


23

मुझे एक विशेष MCMC एल्गोरिथ्म मिला है जिसे मैं C / C ++ में पोर्ट करना चाहूंगा। महंगे संगणना का अधिकांश भाग पहले से ही साइथन के माध्यम से सी में है, लेकिन मैं चाहता हूं कि पूरे संकलक को संकलित भाषा में लिखा जाए ताकि मैं केवल पायथन / आर / मतलाब / जो भी हो के लिए रैपर लिख सकूं।

इधर-उधर ताकने के बाद मैं सी ++ की ओर झुक रहा हूं। प्रासंगिक पुस्तकालयों की एक जोड़ी मुझे पता है कि आर्मडिलो (http://arma.sourceforge.net/) और Scythe (http://scythe.wustl.edu/) हैं। दोनों ने सीखने की अवस्था को आसान बनाने के लिए R / Matlab के कुछ पहलुओं का अनुकरण करने की कोशिश की, जो मुझे बहुत पसंद है। मुझे लगता है मैं जो करना चाहता हूं, उसके साथ स्कैथ थोड़ा बेहतर है। विशेष रूप से, इसके आरएनजी में बहुत सारे वितरण शामिल हैं जहां आर्मडिलो में केवल वर्दी / सामान्य है, जो असुविधाजनक है। अर्माडिलो बहुत सक्रिय विकास के तहत लगता है, जबकि स्इटेह ने 2007 में अपनी आखिरी रिलीज देखी।

तो मैं क्या सोच रहा हूँ अगर किसी को इन पुस्तकालयों के साथ अनुभव है - या अन्य जो मैंने लगभग निश्चित रूप से याद किया है - और यदि ऐसा है, तो क्या किसी भी व्यक्ति के लिए एक व्यक्ति की सिफारिश करने के लिए कुछ है जो पायथन / आर / मैटलैब से बहुत परिचित है लेकिन संकलित भाषाओं के साथ इतना कम (पूरी तरह से अज्ञानी नहीं है, लेकिन बिल्कुल कुशल नहीं ...)।

जवाबों:


18

हमने अपने Rcpp पैकेज के माध्यम से C ++ से R (और उस मामले के लिए वापस) में रैपिंग बनाने में कुछ समय बिताया है ।

और क्योंकि रेखीय बीजगणित पहले से ही है इस तरह के एक अच्छी तरह से समझा और कोडित-के लिए क्षेत्र, वर्मी , एक वर्तमान, आधुनिक, plesant, अच्छी तरह से documted, छोटे, टेम्प्लेट की गई, ... पुस्तकालय हमारी पहली विस्तारित आवरण के लिए एक बहुत प्राकृतिक फिट था: RcppArmadillo

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

और क्योंकि मैं अभी इस उदाहरण को बहुत लुभाता हूँ, यहाँ lm()वापसी गुणांक और std.err का एक त्वरित "तेज" संस्करण है :

extern "C" SEXP fastLm(SEXP ys, SEXP Xs) {

  try {
    Rcpp::NumericVector yr(ys);                 // creates Rcpp vector 
    Rcpp::NumericMatrix Xr(Xs);                 // creates Rcpp matrix 
    int n = Xr.nrow(), k = Xr.ncol();

    arma::mat X(Xr.begin(), n, k, false);       // avoids extra copy
    arma::colvec y(yr.begin(), yr.size(), false);

    arma::colvec coef = arma::solve(X, y);      // fit model y ~ X
    arma::colvec res = y - X*coef;              // residuals

    double s2 = std::inner_product(res.begin(), res.end(), 
                                   res.begin(), double())/(n - k);
                                            // std.errors of coefficients
    arma::colvec std_err = 
           arma::sqrt(s2 * arma::diagvec( arma::pinv(arma::trans(X)*X) ));  

    return Rcpp::List::create(Rcpp::Named("coefficients") = coef,
                              Rcpp::Named("stderr")       = std_err,
                              Rcpp::Named("df")           = n - k);

  } catch( std::exception &ex ) {
      forward_exception_to_r( ex );
  } catch(...) { 
      ::Rf_error( "c++ exception (unknown reason)" ); 
  }
  return R_NilValue; // -Wall
}

अन्त में, आप इनलाइन के माध्यम से तत्काल प्रोटोटाइप प्राप्त कर सकते हैं जो 'कोड करने का समय' अधिक तेज़ बना सकता है।


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

1
आशा है आपको यह मददगार लगा होगा।
डिर्क एडल्डबुलेटेल

संपादित करें से अपने दूसरे प्रश्न को पुन: सुनिश्चित करें: आर्माडिलो बहुत कम या हमारे मामले पर निर्भर करता है। R. Rcpp / RcppArmadillo के अलावा कुछ भी आपको इंटरफ़ेस और टेस्ट प्रोटोटाइप कोड की मदद करेगा जो स्टैंडअलोन या पायथन और मैटलैब टॉपर के साथ फिर से उपयोग किया जा सकता है। कॉनराड में कुछ के लिए संकेत हो सकते हैं; मेरे पास अजगर या मतलाब के लिए कोई विकल्प नहीं है।
डिर्क एडल्डबुलेटेल

रग को बाहर खींचने के लिए क्षमा करें :) मुझे गाड़ी की वापसी देने के लिए प्रवेश कुंजी चाहिए, लेकिन यह इसके बजाय मेरी टिप्पणी को प्रस्तुत करता है। किसी भी तरह, आपकी मदद के लिए धन्यवाद - मैं आज पूरे दिन Rcpp मेलिंग सूची के माध्यम से खुद को छेड़छाड़ और वापस खोदने का आनंद ले रहा हूं।
JMS

8

मैं दृढ़ता से सुझाव दूंगा कि आपके पास एक नज़र है RCppऔर इसके लिए RcppArmadilloपैकेज हैं R। मूल रूप से, आपको रैपरों के बारे में चिंता करने की आवश्यकता नहीं होगी क्योंकि वे पहले से ही "शामिल" हैं। इसके अलावा सिन्गनेटिक शुगर वास्तव में मीठा होता है।

एक पक्ष की टिप्पणी के रूप में, मैं आपको सलाह दूंगा कि आपके पास एक नज़र है JAGS, जो MCMC करता है और इसका स्रोत कोड C ++ में है।


2
मैं यह दूसरा करना चाहूंगा। आर के साथ संकलित आप एक तेज और आसान तरीका के लिए देख रहे हैं के लिए इंटरफ़ेस कोड, Rcppसाथ RcppArmadilloजाने का रास्ता है। संपादित करें: Rcpp का उपयोग करते हुए, आपके पास C-कोड अंतर्निहित
R.G में

विश्वास मत के लिए धन्यवाद। मैं उसी के बारे में सुझाव देने वाला था ;-)
डिर्क एडल्डबुलेटेल

7

बूस्ट सी ++ लाइब्रेरी से रैंडम बूस्ट आपके लिए एक अच्छा फिट हो सकता है। कई प्रकार के आरएनजी के अलावा, यह विभिन्न प्रकार के वितरण प्रदान करता है, जैसे कि

  • वर्दी (असली)
  • वर्दी (इकाई क्षेत्र या मनमाना आयाम)
  • Bernoulli
  • द्विपद
  • कॉची
  • गामा
  • प्वासों
  • ज्यामितिक
  • त्रिभुज
  • घातीय
  • साधारण
  • lognormal

इसके अलावा, बूस्ट मैथ उपरोक्त वितरणों का पूरक है जिससे आप कई वितरणों के कई घनत्व कार्यों के साथ नमूना कर सकते हैं। इसमें कई स्वच्छ सहायक कार्य भी हैं; बस आपको एक विचार देने के लिए:

students_t dist(5);

cout << "CDF at t = 1 is " << cdf(dist, 1.0) << endl;
cout << "Complement of CDF at t = 1 is " << cdf(complement(dist, 1.0)) << endl;

for(double i = 10; i < 1e10; i *= 10)
{
   // Calculate the quantile for a 1 in i chance:
   double t = quantile(complement(dist, 1/i));
   // Print it out:
   cout << "Quantile of students-t with 5 degrees of freedom\n"
           "for a 1 in " << i << " chance is " << t << endl;
}

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


पारितोषिक के लिए धन्यवाद। बूस्ट मेरे छोटे नाखून के लिए एक बड़े हथौड़े की तरह दिखता है, लेकिन परिपक्व और बनाए रखा जाता है।
JMS

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

1

वहाँ कई C / C ++ पुस्तकालय हैं, जिनमें से अधिकांश एक विशेष समस्या डोमेन (जैसे PDE सॉल्वर) पर ध्यान केंद्रित कर रहे हैं। दो व्यापक पुस्तकालय हैं जिनके बारे में मैं सोच सकता हूं कि आप विशेष रूप से उपयोगी हो सकते हैं क्योंकि वे सी में लिखे गए हैं लेकिन पहले से लिखे गए उत्कृष्ट पायथन रैपर हैं।

1) IMSL C और PyIMSL

2) ट्रिलिनो और पाइटरिलिनो

मैंने कभी ट्रिलिनो का उपयोग नहीं किया है क्योंकि कार्यक्षमता मुख्य रूप से संख्यात्मक विश्लेषण विधियों पर है, लेकिन मैं सांख्यिकीय कार्य के लिए PyIMSL का उपयोग करता हूं (और पिछले कार्य जीवन में मैंने सॉफ्टवेयर भी विकसित किया है)।

RNG के संबंध में, यहाँ IMSL में C और पायथन में हैं

असतत

  • random_binomial: एक द्विपद वितरण से छद्म आयामी द्विपद संख्या उत्पन्न करता है।
  • random_geometric: ज्यामितीय वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_hypergeometric: हायपरजियोमेट्रिक वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_logarithmic: एक लघुगणक वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_neg_binomial: एक नकारात्मक द्विपद वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_poisson: एक Poisson वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_uniform_discrete: असतत वर्दी वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_general_discrete: अलसी विधि या वैकल्पिक रूप से एक टेबल लुकअप विधि का उपयोग करके सामान्य असतत वितरण से छद्म आयामी संख्या उत्पन्न करता है।

निजी संपर्क कार्यक्रम

  • random_beta: बीटा वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_cauchy: एक कॉची वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_chi_squared: ची-चुकता वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_exponential: एक मानक घातांक वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_exponential_mix: एक मानक घातांक वितरण से छद्म आयामी मिश्रित संख्या उत्पन्न करता है।
  • random_gamma: मानक गामा वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_lognormal: एक lognormal वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_normal: मानक सामान्य वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_stable: सामान्य असतत वितरण से छद्म आयामी संख्या उत्पन्न करने के लिए एक तालिका सेट करता है।
  • random_student_t: एक छात्र के वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_triangular: त्रिकोणीय वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_uniform: एक समान (0, 1) वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_von_mises: वॉन Mises वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_weibull: एक Weibull वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_general_continuous: सामान्य निरंतर वितरण से छद्म आयामी संख्या उत्पन्न करता है।

बहुभाषी संपर्क कार्यक्रम

  • random_normal_multivariate: एक बहुभिन्नरूपी सामान्य वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_orthogonal_matrix: एक छद्म आयामी ओर्थोगोनल मैट्रिक्स या एक सहसंबंध मैट्रिक्स उत्पन्न करता है।
  • random_mvar_from_data: एक दिए गए नमूने से निर्धारित बहुभिन्नरूपी वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_multinomial: बहुपद वितरण से छद्म आयामी संख्या उत्पन्न करता है।
  • random_sphere: एक इकाई वृत्त या K- आयामी क्षेत्र पर छद्म बिंदु उत्पन्न करता है।
  • random_table_twoway: एक छद्म आयामी दो-तरफ़ा तालिका बनाता है।

आदेश सांख्यिकी

  • random_order_normal: एक मानक सामान्य वितरण से छद्म आयामी आँकड़ों को उत्पन्न करता है।
  • random_order_uniform: एक समान (0, 1) वितरण से छद्म-आयामी आदेश आँकड़े उत्पन्न करता है।

स्टचास्तिक प्रोसेसेज़

  • random_arma: pseudorandom ARMA प्रक्रिया संख्या उत्पन्न करता है।
  • random_npp: एक अमानवीय पॉइसन प्रक्रिया से छद्म आयामी संख्या उत्पन्न करता है।

नमूने और अनुमोदन

  • random_permutation: एक छद्म आयामी क्रमपरिवर्तन उत्पन्न करता है।
  • random_sample_indices: सूचकांकों का एक सरल छद्म आयामी नमूना उत्पन्न करता है।
  • random_sample: एक परिमित जनसंख्या से एक सरल छद्म आयामी नमूना उत्पन्न करता है।

उपयोगिता समारोह

  • random_option: वर्दी का चयन करता है (0, 1) गुणक congruential छद्म आयामी संख्या जनरेटर।
  • random_option_get: एक समान (0, 1) गुणक गुणसूत्रीय छद्म संख्या जनरेटर को पुनः प्राप्त करता है।
  • random_seed_get: IMSL यादृच्छिक संख्या जनरेटर में उपयोग किए गए बीज के वर्तमान मूल्य को पुनः प्राप्त करता है।
  • random_substream_seed_get: बधाई देने वाले जनरेटर के लिए एक बीज प्राप्त करता है जो फेरबदल नहीं करता है जो 100,000 संख्याओं की शुरुआत के साथ यादृच्छिक संख्या उत्पन्न करेगा।
  • random_seed_set: IMSL यादृच्छिक संख्या जनरेटर में उपयोग के लिए एक यादृच्छिक बीज को आरम्भ करता है।
  • random_table_set: फेरबदल जनरेटर में प्रयुक्त वर्तमान तालिका सेट करता है।
  • random_table_get: फेरबदल जनरेटर में प्रयुक्त वर्तमान तालिका को पुनः प्राप्त करता है।
  • random_GFSR_table_set: GFSR जनरेटर में प्रयुक्त वर्तमान तालिका सेट करता है।
  • random_GFSR_table_get: GFSR जनरेटर में प्रयुक्त वर्तमान तालिका को पुनः प्राप्त करता है।
  • random_MT32_init: एक सरणी का उपयोग करके 32-बिट Mersenne ट्विस्टर जनरेटर की शुरुआत करता है।
  • random_MT32_table_get: 32-बिट Mersenne ट्विस्टर जनरेटर में प्रयुक्त वर्तमान तालिका को पुनः प्राप्त करता है।
  • random_MT32_table_set: 32-बिट Mersenne ट्विस्टर जनरेटर में इस्तेमाल की जाने वाली वर्तमान तालिका सेट करता है।
  • random_MT64_init: एक सरणी का उपयोग करके 64-बिट Mersenne ट्विस्टर जनरेटर की शुरुआत करता है।
  • random_MT64_table_get: 64-बिट Mersenne ट्विस्टर जनरेटर में प्रयुक्त वर्तमान तालिका को पुनः प्राप्त करता है।
  • random_MT64_table_set: 64-बिट Mersenne ट्विस्टर जनरेटर में प्रयुक्त वर्तमान तालिका सेट करता है।

कम-प्रदर्शन की सीमा

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