Comment spécifier des limites supérieure et inférieure lors de l'utilisation de numpy.aléatoire.normal
IOK donc, je veux être en mesure de choisir les valeurs d'une distribution normale qui n'a jamais tomber entre 0 et 1. Dans certains cas, je veux être en mesure de simplement retourner complètement aléatoire de la distribution, et dans d'autres cas, je veux les valeurs de retour cet automne sous la forme d'une gaussienne.
Pour le moment je suis en utilisant la fonction suivante:
def blockedgauss(mu,sigma):
while True:
numb = random.gauss(mu,sigma)
if (numb > 0 and numb < 1):
break
return numb
Il choisit une valeur à partir d'une distribution normale, alors ignore si elle tombe en dehors de l'intervalle de 0 à 1, mais je me sens comme il doit y avoir une meilleure façon de le faire.
Si vous "bloquer" valeurs < 0 > 1, ça va encore être une distribution gaussienne?
il ne sera pas une distribution gaussienne, mais dans certains cas, je ne veux pas d'une distribution gaussienne. je veux retourner une distribution qui est réglable entre une distribution aléatoire (choix à partir d'un très large gaussien), à quelque chose de très proche d'une fonction delta (où la gaussienne devient très étroit)
il ne sera pas une distribution gaussienne, mais dans certains cas, je ne veux pas d'une distribution gaussienne. je veux retourner une distribution qui est réglable entre une distribution aléatoire (choix à partir d'un très large gaussien), à quelque chose de très proche d'une fonction delta (où la gaussienne devient très étroit)
OriginalL'auteur Catherine Georgia | 2013-08-26
Vous devez vous connecter pour publier un commentaire.
Il semble que vous voulez un distribution normale tronquée.
À l'aide de scipy, vous pouvez utiliser
scipy.stats.truncnorm
pour générer des variates de ce type de distribution:La figure du haut montre la distribution normale tronquée, la figure du bas montre la distribution normale avec la même moyenne
mu
et l'écart-typesigma
.OriginalL'auteur unutbu
Je suis tombé sur ce post en cherchant un moyen de revenir à une série de valeurs échantillonnées à partir d'une distribution normale tronquée entre zéro et 1 (c'est à dire les probabilités). Aider quelqu'un d'autre qui a le même problème, je voulais juste noter que scipy.les stats.truncnorm a la capacité intégrée ".les caravanes".
Donc, si vous voulez de 100 000 échantillons, avec une moyenne de 0,5 et une déviation standard de 0,1:
Cela donne un comportement très similaire à numpy.aléatoire.normal, mais dans les limites souhaitées. L'aide de l'seront sensiblement plus rapide que la boucle pour recueillir des échantillons, en particulier pour les grandes valeurs de N.
OriginalL'auteur Greg Alushin
Dans le cas où quelqu'un veut une solution à l'aide de numpy seulement, ici, c'est une simple mise en œuvre à l'aide d'un normal fonction et un clip (le MacGyver de l'approche):
EDIT: ne PAS utiliser ce!! c'est de cette manière que vous ne devriez pas le faire!! par exemple,
a = truncated_normal(np.zeros(10000), 1, -10, 10)
peut regarder comme il fonctionne, mais
b = truncated_normal(np.zeros(10000), 100, -1, 1)
va certainement pas dessiner une normale tronquée, comme vous pouvez le voir dans la suite de l'histogramme:
Désolé pour tout ça, espérons que personne ne se blesse! Je suppose que la leçon est, n'essayez pas de les imiter MacGyver au codage...
Cheers,
Andres
OriginalL'auteur fr_andres
J'ai fait un script d'exemple par la suite. Il montre comment utiliser l'Api pour mettre en œuvre les fonctions dont nous avons voulu, comme générer des échantillons avec des paramètres connus, comment calculer CDF, PDF, etc. J'ai également joindre une image pour le prouver.
OriginalL'auteur FlyFish