পরিসংখ্যানগত কম্পিউটিংয়ের জন্য সি ++ গ্রন্থাগার


23

আমি একটি নির্দিষ্ট এমসিএমসি অ্যালগরিদম পেয়েছি যা আমি সি / সি ++ তে পোর্ট করতে চাই। ব্যয়বহুল গণনাটির বেশিরভাগ সিটিতে ইতিমধ্যে সিথনের মাধ্যমে রয়েছে, তবে আমি পুরো স্যাম্পলারটি একটি সংকলিত ভাষায় লিখতে চাই যাতে আমি পাইথন / আর / মতলব / যাই হোক না কেন কেবল র্যাপার লিখতে পারি।

চারদিকে ঝাঁকুনির পরে আমি সি ++ এর দিকে ঝুঁকছি। আমার পরিচিত কয়েকটি গ্রন্থাগার হলেন আর্মাদিলো (http://arma.sourceforge.net/) এবং স্কিথ (http://scythe.wustl.edu/)। উভয়ই শিক্ষার বক্ররেখাটি সহজ করার জন্য আর / মতলবের কিছু দিক অনুকরণ করার চেষ্টা করে, যা আমি খুব পছন্দ করি। স্কিথ স্কোয়ারগুলি আমি যা করতে চাই তা দিয়ে কিছুটা ভাল। বিশেষত, এর আরএনজিতে প্রচুর বিতরণ অন্তর্ভুক্ত রয়েছে যেখানে আর্মাদিলোর কেবল অভিন্ন / স্বাভাবিক রয়েছে, যা অসুবিধাজনক। আর্মাডিলো মনে হয় বেশ সক্রিয় বিকাশের মধ্যে রয়েছে যখন স্কিথ ২০০ 2007 সালে তার শেষ প্রকাশটি দেখেছিল।

সুতরাং আমি যেটা ভাবছি তা হ'ল যদি কারও কাছে এই লাইব্রেরিগুলির অভিজ্ঞতা রয়েছে - বা অন্যরাও প্রায় অবশ্যই মিস করেছি - এবং যদি তা হয় তবে পাইথন / আর / মাতালাবের সাথে খুব পরিচিত একজন স্ট্যাটিস্টিশিয়ানদের জন্য অন্যের থেকে সুপারিশ করার মতো কিছু আছে কিনা? তবে কম সংকলিত ভাষাগুলির সাথে (সম্পূর্ণ অজ্ঞ নয়, তবে একেবারে দক্ষ নয় ...)।

উত্তর:


18

আমরা কিছু সময় ব্যয় করেছেন উপার্জন মোড়ানো মধ্যে C ++ থেকে আর (এবং যে বিষয়টি জন্য ব্যাক) অনেক সহজ আমাদের মাধ্যমে Rcpp প্যাকেজ।

যেহেতু রৈখিক বীজগণিত আগে থেকেই এই ধরনের একটি ভালভাবে বোঝা যায় এবং কোডেড-জন্য ক্ষেত্র, আরমাডিলো , একটি বর্তমান, আধুনিক, plesant, ভাল-documted, ছোট, টেমপ্লেট করা, ... গ্রন্থাগার আমাদের প্রথম বর্ধিত মোড়কের জন্য একটি খুব স্বাভাবিক হইয়া ছিল: RcppArmadillo

এটি অন্যান্য এমসিসিএম ব্যবহারকারীদেরও দৃষ্টি আকর্ষণ করেছে। আমি গত গ্রীষ্মে রচেস্টার বিজনেস স্কুল এর ইউ তে এক দিনের কাজ দিয়েছি এবং মিড ওয়েস্টের অন্য গবেষককে অনুরূপ অনুসন্ধানে সহায়তা করেছি। দিন RcppArmadillo ব্যবহার করে দেখুন - এটা ভাল সক্রিয়ভাবে রক্ষা করা হয় কাজ করে, ও সমর্থিত (নতুন আরমাডিলো মুক্তি 1.1.4 আজ, আমি একটি নতুন RcppArmadillo পরে করতে হবে)।

এবং যেহেতু আমি এই উদাহরণটি কেবল এতই লোভ করি, এখানে lm()সহগ এবং স্টাডি.অরফেসগুলি ফেরার দ্রুত "দ্রুত" সংস্করণ রয়েছে :

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
}

শেষ অবধি, আপনি ইনলাইন মাধ্যমে তাত্ক্ষণিক প্রোটোটাইপিং পান যা 'কোড টু টাইম' দ্রুত করতে পারে।


থ্যাঙ্কস ডার্ক - আমার মনে হয়েছিল আপনি উত্তর দেওয়ার চেয়ে শীঘ্রই উত্তর দেবেন :)। প্রদত্ত যে কোডটি আমি চাইছি অন্য সফ্টওয়্যার থেকে (পাইথন মূলত, তবে মতলবও) কল করতে পারি সম্ভবত একটি ভাল ওয়ার্কফ্লো হবে আরসিপি / আরসিপিপিআর্মাদিলোতে প্রোটোটাইপ এবং তারপরে "সরাসরি" আর্মাদিলোতে চলে যেতে? সিনট্যাক্স ইত্যাদি দেখতে খুব মিল রয়েছে।
জেএমএস

1
আশা করি আপনি এটি সহায়ক পেয়েছেন।
ডার্ক এডেলবুয়েটেল

সম্পাদনা থেকে আপনার দ্বিতীয় প্রশ্ন: পুনরায়। আরমাদিলো সামান্য, বা আমাদের ক্ষেত্রে, আর। আরসিপিপি / আরসিপিএআরআমাদিলো ছাড়া আর কিছুই আপনাকে ইন্টারফেস এবং প্রোটোটাইপ কোড পরীক্ষা করতে সহায়তা করবে যা স্ট্যান্ড স্টোন বা পুনরায় ব্যবহৃত হতে পারে এমন পাইথন এবং ম্যাটল্যাব মোড়কের সাহায্যে আপনি পরে যুক্ত করতে পারেন। কনরাডের কোনও কিছুর জন্য পয়েন্টার থাকতে পারে; পাইথন বা মতলবের জন্য আমার কোনও নেই।
ডার্ক এডেলবুয়েটেল

রাগটি টেনে আনার জন্য দুঃখিত :) আমি গাড়ীর ফেরত দেওয়ার জন্য এন্টার কীটি চাই, তবে এটি পরিবর্তে আমার মন্তব্য জমা দেয়। যাইহোক, আপনার সহায়তার জন্য ধন্যবাদ - আমি আজ সারা দিন আরসিপিপি মেলিং তালিকার মাধ্যমে নিজেকে টিঙ্কারিং এবং খনন করে উপভোগ করছি।
জেএমএস

8

আমি দৃ strongly়ভাবে পরামর্শ দেব যে আপনার জন্য একটি প্যাকেজ RCppএবং এর RcppArmadilloজন্য দেখুন R। মূলত, মোড়কগুলি ইতিমধ্যে "অন্তর্ভুক্ত" থাকায় আপনাকে চিন্তার দরকার পড়বে না। তবুও সিনট্যাকটিক চিনি সত্যিই মিষ্টি (পাং উদ্দেশ্যে)।

পার্শ্ববর্তী মন্তব্য হিসাবে, আমি আপনাকে সুপারিশ করব যে আপনার একবার দেখুন JAGS, যা এমসিসিএম করে এবং এর উত্স কোডটি সি ++ এ রয়েছে।


2
আমি এটি দ্বিতীয় করতে চাই। আর সঙ্গে কম্পাইল আপনি একটি দ্রুত এবং সহজ পথে খুঁজছেন ইন্টারফেস কোড, Rcppসঙ্গে RcppArmadilloযেতে উপায়। সম্পাদনা করুন: আরসিপিপি ব্যবহার করে, আপনার সি-কোড অন্তর্নিহিত আর-তে জড়িত সমস্ত আরএনজিগুলিতে অ্যাক্সেসও রয়েছে
ফেবীয়রা

আস্থা ভোট করার জন্য ধন্যবাদ। আমি একই পরামর্শ দিতে
চলেছিলাম

7

বুস্ট সি ++ লাইব্রেরি থেকে র্যান্ডম বুস্ট করা আপনার পক্ষে উপযুক্ত হতে পারে। বিভিন্ন ধরণের আরএনজি ছাড়াও, এটি থেকে বিভিন্ন ধরণের বিভিন্ন বিতরণও দেওয়া হয়, যেমন

  • ইউনিফর্ম (বাস্তব)
  • ইউনিফর্ম (ইউনিট গোলক বা স্বেচ্ছাচারিত মাত্রা)
  • বের্নুলির
  • দ্বিপদ
  • কোশি
  • গ্রীক বর্ণমালার তৃতীয় বর্ণ
  • পইসন
  • জ্যামিতিক
  • ত্রিভুজ
  • ব্যাখ্যামূলক
  • সাধারণ
  • 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;
}

আপনি যদি বুস্টটি ব্যবহার করার সিদ্ধান্ত নিয়ে থাকেন তবে আপনি এটির ইউবিএলএস লাইব্রেরিও ব্যবহার করতে পারেন যা বিভিন্ন ম্যাট্রিক্সের বিভিন্ন ধরণের এবং ক্রিয়াকলাপগুলির বৈশিষ্ট্যযুক্ত।


ভকভগক. বুস্টটি আমার ছোট পেরেকের জন্য এক বড় হাতুড়ির মতো দেখাচ্ছে, তবে পরিপক্ক এবং বজায় রয়েছে।
জেএমএস

আমি নিশ্চিত নই যে বুট :: গণিত :: দ্বি দ্বি_পরিষ্কারে দ্বি-পার্শ্বযুক্ত আরবোনমস্টেস্টে প্রয়োগ করা একই কার্যকারিতা রয়েছে। আমি রেফারেন্সটি সন্ধান করেছি এবং এই ফাংশনটি খুঁজে পেলাম না। আমি এটি বাস্তবায়নের চেষ্টা করেছি, এবং এটি তুচ্ছ নয়!
কেমিন চিউ

1

সেখানে প্রচুর সি / সি ++ লাইব্রেরি রয়েছে, বেশিরভাগ নির্দিষ্ট সমস্যা ডোমেনের উপর দৃষ্টি নিবদ্ধ করে (যেমন পিডিই সলভার)। দুটি বিস্তৃত গ্রন্থাগার রয়েছে যা আমি ভাবতে পারি যে আপনি বিশেষত দরকারী বলে মনে হতে পারেন কারণ সেগুলি সিতে লেখা রয়েছে তবে ইতিমধ্যে চমৎকার পাইথন র‍্যাপারগুলি লিখিত রয়েছে।

1) আইএমএসএল সি এবং পাইআইএমএসএল

2) ট্রিলিনোস এবং পাইট্রিলিনোস

কার্যকারিতাটি মূলত সংখ্যা বিশ্লেষণ পদ্ধতিতে হওয়ায় আমি কখনও ট্রিলিনোস ব্যবহার করি নি, তবে আমি পরিসংখ্যানমূলক কাজের জন্য পাইমএসএলকে অনেক বেশি ব্যবহার করি (এবং আগের কাজের জীবনে আমি সফ্টওয়্যারটিও বিকাশ করেছি)।

আরএনজির প্রতি শ্রদ্ধা জানাতে, আইএমএসএল-এ সি এবং পাইথন-এ রয়েছে

বিযুক্ত

  • র্যান্ডম_বাইনোমিয়াল: দ্বিপদী বিতরণ থেকে সিউডোর্যান্ডম দ্বিপদী সংখ্যা তৈরি করে।
  • এলোমেলো_ জ্যামিতিক: জ্যামিতিক বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • random_hypergeometric: একটি হাইপারজ্যামিতিক বিতরণ থেকে সিউডোরান্ডম সংখ্যা উত্পন্ন করে।
  • র্যান্ডম_লগারিদমিক: লগারিদমিক বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_নিগ_বিনোমিয়াল: নেতিবাচক দ্বিপদী বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • র্যান্ডম_পায়সন: পইসন বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_উনিফর্ম_ডিসক্রিট: একটি পৃথক ইউনিফর্ম বিতরণ থেকে সিউডোরান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_জেনারাল_ডিস্ক্রিট: একটি উলামের পদ্ধতি বা বিকল্পভাবে একটি টেবিল দেখার পদ্ধতি ব্যবহার করে একটি সাধারণ পৃথক বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।

ইউনিভার্সিটি অব্যাহত ডিস্ট্রিবিউট

  • এলোমেলো_বেতা: বিটা বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_কাউচি: একটি কচী বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_চিনি_সকোয়ার্ড: চি-স্কোয়ার ডিস্ট্রিবিউশন থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_স্পষ্টযোগ্য: একটি স্ট্যান্ডার্ড এক্সফোনেনশিয়াল বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_পরিষ্কার_মিক্স: একটি স্ট্যান্ডার্ড এক্সফোনেনশিয়াল বিতরণ থেকে সিউডোরান্ডম মিশ্র সংখ্যাগুলি উত্পাদন করে।
  • এলোমেলো_গ্যামা: একটি স্ট্যান্ডার্ড গামা বিতরণ থেকে সিউডোরান্ডম সংখ্যা উত্পন্ন করে।
  • random_lognormal: লগনরমাল বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • র্যান্ডম_সামান্য: একটি সাধারণ সাধারণ বিতরণ থেকে সিউডোরান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_স্টেবল: একটি সাধারণ বিচ্ছিন্ন বিতরণ থেকে সিউডোরান্ডম সংখ্যা উত্পন্ন করতে একটি সারণী সেট আপ করে।
  • random_student_t: শিক্ষার্থীর টি বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • random_triangular: ত্রিভুজাকার বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে Gene
  • র্যান্ডম_উনিফর্ম: ইউনিফর্ম (0, 1) বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_ভন_মাইজস: ভন মাইজেস বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_উইবুল: একটি ওয়েইবুল বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_জেনারাল_সিদ্ধ: সাধারণ ক্রমাগত বিতরণ থেকে সিউডোরান্ডম সংখ্যা উত্পন্ন করে।

একাধিক ধারাবাহিক বিতরণ

  • এলোমেলো_সামান্য_ মাল্টিভারিয়ট: একটি মাল্টিভারিয়েট সাধারণ বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_অর্থোগোনাল_ম্যাট্রিক্স: একটি সিউডোর্যান্ডম অर्थোগোনাল ম্যাট্রিক্স বা একটি সম্পর্কিত ম্যাট্রিক্স উত্পন্ন করে।
  • এলোমেলো_ম্বর_ফ্রোম_ডেটা: প্রদত্ত নমুনা থেকে নির্ধারিত মাল্টিভারিয়েট বিতরণ থেকে সিউডোরান্ডম সংখ্যা উত্পন্ন করে।
  • random_multinomial: বহু বহুজাতিক বিতরণ থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।
  • এলোমেলো_স্ফিয়ার: ইউনিট বৃত্ত বা কে-মাত্রিক গোলকের সিউডোর্যান্ডম পয়েন্ট উত্পন্ন করে।
  • এলোমেলো_ টেবিল_টওয়োয়া: সিউডোর্যান্ডম দ্বি-মুখী সারণী উত্পন্ন করে।

আদেশ পরিসংখ্যান

  • এলোমেলো_অর্ডার_সামান্য: একটি সাধারণ সাধারণ বিতরণ থেকে সিউডোরঅন্ডম অর্ডার পরিসংখ্যান উত্পন্ন করে।
  • র্যান্ডম_র্ডার_ ইউনিফর্ম: ইউনিফর্ম (0, 1) বিতরণ থেকে সিউডোর্যান্ডম অর্ডার পরিসংখ্যান উত্পন্ন করে Gene

স্টকস্টিক প্রসেস

  • এলোমেলো_আরমা: সিউডোর্যান্ডম এআরএমএ প্রক্রিয়া নম্বর উত্পন্ন করে।
  • এলোমেলো_npp: একটি ননহমোজেনিয়াস পোইসন প্রক্রিয়া থেকে সিউডোর্যান্ডম সংখ্যা উত্পন্ন করে।

নমুনা এবং নিষিদ্ধকরণ

  • এলোমেলো_পরিচয়: একটি সিউডোর্যান্ডম ক্রমশক্তি উত্পন্ন করে।
  • এলোমেলো_সামান্য_ সূচি: সূচকগুলির একটি সাধারণ সিডোডোরডম নমুনা উত্পন্ন করে।
  • এলোমেলো_ নমুনা: সীমাবদ্ধ জনসংখ্যার থেকে একটি সাধারণ সিডোডোরডম নমুনা উত্পন্ন করে।

ইউটিলিটি ফাংশন

  • এলোমেলো_শক্তি: ইউনিফর্মটি (0, 1) গুণিতক সংঘবদ্ধ সিউডোরান্ডম সংখ্যা জেনারেটর নির্বাচন করে।
  • random_option_get: ইউনিফর্মটি পুনরুদ্ধার করে (0, 1) বহুসংখ্যক সংশ্লেষপূর্ণ সিউডোরান্ডম সংখ্যা জেনারেটর।
  • random_seed_get: আইএমএসএল এলোমেলো সংখ্যা জেনারেটরে ব্যবহৃত বীজের বর্তমান মান পুনরুদ্ধার করে।
  • এলোমেলো_সুব্রিম_সিড_জেট: একত্রিত জেনারেটরের জন্য এমন একটি বীজ পুনরুদ্ধার করে যা শ্যাফলিং না করে যা আরও 100,000 সংখ্যা বরাবর এলোমেলো সংখ্যা তৈরি করবে gene
  • র্যান্ডম_সীড_সেট: আইএমএসএল এলোমেলো সংখ্যা জেনারেটরে ব্যবহারের জন্য একটি এলোমেলো বীজ সূচনা করে।
  • এলোমেলো_ টেবিল_সেট: বদলানো জেনারেটরে ব্যবহৃত বর্তমান সারণি সেট করে।
  • random_table_get: বদলানো জেনারেটরে ব্যবহৃত বর্তমান টেবিলটি পুনরুদ্ধার করে।
  • এলোমেলো_জিএফএসআর_সেবদ্ধ_সেট: জিএফএসআর জেনারেটরে ব্যবহৃত বর্তমান সারণি সেট করে।
  • এলোমেলো_জিএফএসআর_সামগ্রহীকরণ: জিএফএসআর জেনারেটরে ব্যবহৃত বর্তমান টেবিলটি পুনরুদ্ধার করে।
  • এলোমেলো_এমটি 32_ইনাইট: একটি অ্যারে ব্যবহার করে 32-বিট মেরসেন টুইস্টার জেনারেটর শুরু করে।
  • এলোমেলো_এমটি 32_ টেবিল_জেট: 32-বিট মের্সেন টুইস্টার জেনারেটরে ব্যবহৃত বর্তমান টেবিলটি পুনরুদ্ধার করে।
  • এলোমেলো_এমটি 32_ টেবিল_সেট: 32-বিট মার্সেন টুইস্টার জেনারেটরে ব্যবহৃত বর্তমান সারণি সেট করে।
  • এলোমেলো_এমটি 64৪_ইনাইট: ar৪-বিট মরসেন টুইস্টার জেনারেটর একটি অ্যারে ব্যবহার করে আরম্ভ করে।
  • এলোমেলো_এমটি _৪_সেবিল_গেট: -৪-বিট মের্সেন টোস্টার জেনারেটরে ব্যবহৃত বর্তমান সারণীটি পুনরুদ্ধার করে।
  • এলোমেলো_এমটি 64৪_ টেবিল_সেট: -৪-বিট মেরসেন টুইস্টার জেনারেটরে ব্যবহৃত বর্তমান সারণি সেট করে।

নিম্ন-বিস্ময়কর সিকোয়েন্স

  • faure_next_Point: একটি শিফলেড ফিউয়ার সিকোয়েন্সগুলি গণনা করে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.