Générer des variables aléatoires Discrètes avec des poids à l'aide de SciPy ou NumPy
Je suis à la recherche d'une simple fonction qui permet de générer un tableau de certaines valeurs aléatoires basés sur leur correspondant (également spécifié) des probabilités. J'ai seulement besoin de générer des valeurs float, mais je ne vois pas pourquoi il ne devrait pas être en mesure de générer une fonction scalaire. Je peux penser à de nombreux moyens de ce bâtiment de fonctions existantes, mais je pense que j'ai probablement raté un évident SciPy ou de fonction NumPy.
E. g.:
>>> values = [1.1, 2.2, 3.3]
>>> probabilities = [0.2, 0.5, 0.3]
>>> print some_function(values, probabilities, size=10)
(2.2, 1.1, 3.3, 3.3, 2.2, 2.2, 1.1, 2.2, 3.3, 2.2)
Remarque: j'ai trouvé scipy.les stats.rv_discrete mais je ne comprends pas comment il fonctionne. Plus précisément, je ne comprends pas ce que cette (ci-dessous) moyens, ni ce qu'il doit faire:
numargs = generic.numargs
[ <shape(s)> ] = ['Replace with resonable value', ]*numargs
Si rv_discrete est ce que je devrais être à l'aide, pourriez-vous svp me fournir un exemple et une explication de l'au-delà "forme" déclaration?
Vous devez vous connecter pour publier un commentaire.
Dessin à partir d'une distribution discrète est directement intégré dans numpy.
La fonction est appelée aléatoire.choix (difficile à trouver sans aucune référence à des distributions dans les numpy docs).
elements
etprobabilites
aurait pu être ordinairelist
s au lieu denumpy.array
s et le code devrait fonctionner de la même.Voici un court, relativement simple fonction qui retourne des valeurs pondérées, il utilise NumPy est
digitize
,accumulate
, etrandom_sample
.Il fonctionne comme ceci:
accumulate
nous créer des bacs.0
, et1
) à l'aide derandom_sample
digitize
de voir les poubelles de ces chiffres tombent.numpy.cumsum()
, qui peut être utilisé à la place denp.add.accumulate()
(np.add()
n'est pas très couramment utilisé, donc je recommande d'utilisercumsum()
).numpy.digitize()
! Cependant, SciPy offre en fait une fonction qui répond directement à la question—voir ma réponse.random_sample()
renvoie des nombres dans [0; 1), de sorte que les bacs ne peuvent se prolonger au-delà de cette plage (si les probabilités serait somme supérieure à 1).Vous allez dans la bonne direction: intégré
scipy.stats.rv_discrete()
assez crée directement une variable aléatoire discrète. Voici comment cela fonctionne:La distribution
distrib
ci-dessus revient donc index de lavalues
liste.Plus généralement,
rv_discrete()
prend une séquence de entier valeurs dans les premiers éléments de sonvalues=(…,…)
argument, et renvoie ces valeurs, dans ce cas, il n'est pas nécessaire de convertir spécifiques (float) les valeurs. Voici un exemple:où (entier) valeurs d'entrée sont directement retournées à la bonne probabilité.
rv_discrete
, et puis revenir derv_discrete
une approximation de la distribution, j'ai commencé avec. est-il possible d'utiliser de l'utilisateur défini par les équations directement avecscipy
?numpy
pour le prélèvement d'échantillons à partir d'une distribution de Poisson (np.random.poisson
). la même, je suis sûr que c'est vrai de la plupart des distributions. ma question reste sans réponse, bien que, pour les plus idiosyncrasiques des distributions.rv_discrete()
n'a pas une option pour cela. Je ne suis pas sûr de ce que la méthode pour ce faire est. (Je ne peux que penser un peu compliqué les variations de la méthode habituelle qui transforme une variable aléatoire uniforme dans une variable avec une distribution non uniforme, où la probabilité cumulative est calculée uniquement pour les valeurs les plus courantes et prolongée au-delà qu'en cas de besoin.)Vous pouvez également utiliser Lea, un pur Python package dédié à des distributions de probabilité.
Et voilà!
La plus simple de BRICOLAGE solution serait que la somme des probabilités dans une distribution cumulée.
De cette façon, vous divisez l'unité de l'intervalle en sous-intervalles de longueur égale à l'original de votre probabilités. Maintenant générer un seul nombre aléatoire uniforme sur [0,1), et de et de voir à quel intervalle les terres.