2016-07-05 11 views
0

ブーストC++を使用してデータセットの指数分布を生成する方法。ブーストC++を使用してデータセットの指数分布を生成する

私はベクトルvararrという名前のfloat型変数を含むとブーストC++を使用して、私はそれを指数分布に合うようにしたいとフィット感のために、それぞれのレートパラメータ(ラムダ)を取得しています。 MATLABでequivalanceコード:

PD = fitdist(vararr,'exponential'); 
vararr = sort(vararr); 
fxx = pdf(PD,vararr); 

IはC++

+0

AFAIK boostには、データをディストリビューションに適合させる方法はありません。データを生成するためにのみ使用します。私は数値レシピが持っていることを覚えている、あなたの正気のためのボット私はあなたがより良いオプションを見つけることを願っています。あなたはできます。すべての要素を記録し、線形回帰を適用します。 – peterchen

答えて

1

指数分布は、特定の分布に従う乱数を生成することがあるそれを実装する必要があります。 が指数分布を使用するには、そのような何かを:

#include <iostream> 
#include <boost/random.hpp> 

int main() { 
    boost::mt19937 seed(5u); 
    boost::variate_generator<boost::mt19937&, boost::exponential_distribution<>> random_n(seed, boost::exponential_distribution<>()) ; 
    cout << random_n() << endl; return 0; 
} 

は今、私はあなたが何かをしたいが、それは私のためそれほど明確ではないと思います。あなたは何かを並べ替えたいですか?あなたのベクトルの乱数を選びますか?

編集: OK。要約すると、たとえC++ 11へのアクセス権があっても、それほど遠くに行くことはできません。ほとんどのランダムジェネレータは標準になっています。しかし、PDFではありません。なぜあなたが好奇心が強いのであれば、ここにそれがあります:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1398.html。 boost.mathツールキットが必要です。これはPDFを計算する唯一の方法です。ここではあなたのためにいくつかのサンプルコードは次のとおりです。

要するに
#include <boost/math/distributions/exponential.hpp> 

int main() { 
    const auto lbda = 1.0; 
    const auto d = exponential_distribution<> { lbda }; 
    cout << pdf(d, 0) << endl; // e(0) = 1 
    cout << pdf(d, 1) << endl; // e(-1) = 0.3678 
    return 0; 
} 

:ブーストPDFを使用するために、あなたは、ベクターは、PDF機能は、その分布を計算する方法を知っている原因そのものは必要ありません。

編集2:ベクターをいくつかのディストリビューションに取り込む必要がある場合は、単にstd::generateを使用してディストリビューションを適用してください。ここにはstd::exponential_distributionの例があります(C++ 11ですが、 。

std::vector<float> v(20); 

random_device rd; 
mt19937_64 gen(rd()); 
exponential_distribution<float> dis(1); 
auto rand = bind(dis, gen); 
generate(begin(v), end(v), rand); 
for (auto& e : v) cout << e << endl; 

私はここに示していますコードは、指数分布vector 20の要素を充填されています。 std::arrayに切り替えることができます。必要に応じて浮動小数点数を変更し、ベクトルまたは配列のサイズを増やします。

また、必要なことをするこの古いC++ライブラリ(今はピノニックなもの)を見てみることもできます:http://myfitter.hepforge.org/。これはおそらくあなたの最善の策です。それは非パラメトリックな方法を使用します。 C++のバージョンはかなり古いですが、私は完全に機能しているとは確信していませんが、おそらくこれはあなたのために行くでしょう。

+0

私は、** vararr **という名前の浮動小数点変数を含むベクトルを持ち、Boost C++を使用しています。これを指数関数分布に適合させ、適合のためのそれぞれのレートパラメータを取得したいと思います。 Matlabの等価コードは次のとおりです。PD = fitdist(vararr、 'exponential'); vararr = sort(vararr); fxx = pdf(PD、vararr); –

+0

私はいくつか余分な説明を追加しました。 – Gibet

+0

私はOPを理解する限り、指数分布にデータをフィットさせたいと思っています。 – peterchen

関連する問題