2016-07-05 3 views
0

Comment générer une distribution exponentielle pour un ensemble de données en utilisant boost C++.Génération d'une distribution exponentielle pour un ensemble de données en utilisant boost C++

J'ai un vecteur contenant des variables flottantes nommées vararr et en utilisant Boost C++ et je veux ajuster la distribution exponentielle et obtenir le paramètre de taux respectif (lambda) pour l'ajustement. Le code equivalance en Matlab est:

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

J'ai besoin de le mettre en œuvre en C++

+0

AFAIK boost n'a * pas de méthode * pour adapter les données à une distribution, uniquement pour générer des données. Je me souviens que Numerical Recipes a, bot pour votre santé mentale, j'espère que vous trouverez une meilleure option. vous pourriez, par exemple. consigner tous les éléments, puis appliquer une régression linéaire. – peterchen

Répondre

1

la distribution Exponentielle est là pour générer un nombre aléatoire suivant une certaine distribution. Pour utiliser la distribution exponentielle, vous faites quelque chose comme ça:

#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; 
} 

Maintenant, je pense que vous voulez faire quelque chose, mais il est pas si clair pour moi. Vous voulez trier ou quoi? Choisissez un nombre aléatoire dans votre vecteur?

Editer: OK. En bref et court, même si vous avez accès à C++ 11, vous ne pouvez pas aller très loin. La plupart des générateurs aléatoires sont maintenant dans la norme. Mais pas le PDF. Si vous êtes curieux de savoir pourquoi: ici, c'est: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1398.html. Donc, vous avez vraiment besoin de la boîte à outils boost.math, c'est votre seule façon de calculer votre PDF. Voici quelques exemples de code pour vous:

#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; 
} 

En bref: pour l'utilisation de boost PDF, vous n'avez pas besoin en soi le vecteur provoque la fonction PDF sait comment calculer sa distribution.

Édition 2: Donc, si vous avez besoin de remplir un vecteur avec une distribution, vous pouvez simplement utiliser std::generate et lui appliquer la distribution, voici un exemple avec std::exponential_distribution (C++ 11, mais vous pouvez utiliser boost) .

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; 

Le code que je montre ici remplit un vector de 20 éléments avec une distribution exponentielle. Vous pouvez passer à un std::array, changer le flotteur selon ce dont vous avez besoin, augmenter la taille du vecteur ou du tableau.

Vous pouvez également jeter un oeil à cette ancienne bibliothèque C++ (aujourd'hui une bibliothèque pytonique) qui fait ce dont vous avez besoin: http://myfitter.hepforge.org/. C'est probablement votre meilleur pari. Il utilise une méthode non paramétrique. La version C++ est assez ancienne et je ne suis pas si sûr de la fonctionnalité mais peut-être que ça ira pour vous.

+0

J'ai un vecteur contenant des variables flottantes nommées ** vararr ** et en utilisant Boost C++ et je veux l'adapter à la distribution exponentielle et obtenir le paramètre de débit respectif pour l'ajustement. Le code d'équivalence dans Matlab est: PD = fitdist (vararr, 'exponentiel'); vararr = sort (vararr); fxx = pdf (PD, vararr); –

+0

OK J'ai ajouté une explication supplémentaire. – Gibet

+0

Autant que je comprends OP, il veut * adapter * les données à une distribution exponentielle. – peterchen