2017-10-15 2 views
-1

J'essaie de générer des données pour, par exemple, l'âge par rapport au nombre d'heures consacrées au débordement de la pile en une semaine. J'ai essayé d'utiliser la fonction randn mais cela ne me permet pas de contrôler la plage de valeurs générées et la quantification des valeurs. J'ai essayé quelques algorithmes tels que box muller méthode mais le même problème se pose là aussi. Les deux variables uniformes peuvent être générées mais quel est le contrôle sur les valeurs de la distribution normale? Quelqu'un peut-il m'expliquer, comment je peux le faire en python?Python génère des pseudo-données de distribution normale

+0

Que voulez-vous dire par « des valeurs quantisation »? – user8153

+0

Je ne veux pas que l'âge soit de 12,3 ans, ce ne devrait être que des entiers où les heures peuvent être du multiple de 0,5 heures @ user8153 – user8778850

+0

Est-ce que [this] (https://stackoverflow.com/questions/36894191/) Aidez-moi? –

Répondre

0

Je pense que c'est ce que vous cherchez:

def get_truncated_normal(mean=0, sd=1, low=0, upp=10): 
    return truncnorm(
     (low - mean)/sd, (upp - mean)/sd, loc=mean, scale=sd) 

X = get_truncated_normal(mean=15, sd=2, low=0, upp=1000) 
a=(X.rvs(100)) 
0

Le random.normal de Numpy fera l'affaire. Vous devez fournir la médiane, SD et la taille désirée.

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.stats as stats 

M = 25 
SD = 5 
n = 100 
age = np.random.normal(M, SD, n) 
sorted_age = sorted(age) 

pdf = stats.norm.pdf(sorted_age, M, SD) 
plt.plot(sorted_age, pdf) 
plt.show() 

enter image description here

+0

Ce n'est pas la réponse à ma question – user8778850

+0

ce que je veux est le pdf pour être dans une certaine gamme et qui me donne des valeurs quantifiées pour, par exemple. âge d'être seulement des nombres naturels entre 12 à 50. J'ai besoin des valeurs réelles de l'âge – user8778850

1

Je suppose que les deux variables sont indépendantes. C'est une façon de faire juste l'âge.

>>> import numpy as np 

Générez un échantillon aléatoire, normale univariée de la taille 50 avec l'emplacement et l'échelle à la fois 30.

>>> ages = np.random.normal(30,30,50) 

Jeter les valeurs inférieures à zéro. Si vous avez besoin d'une taille d'échantillon fixe, vous devrez faire quelque chose d'un peu plus intelligent. Obtenez la plus grande valeur d'âge, pour savoir quelle doit être la plus grande limite de la poubelle.

>>> max(ages) 
90.513300401178611 

Créer des bacs auquel attribuer les âges, 0 à 1, 1 à 2, etc.

>>> bins = np.arange(0,92,1) 

Vérifiez que la limite du dernier bac est assez grand pour accueillir le plus grand âge.

>>> max(bins) 
91 

Affectez les âges aux emplacements.

>>> sample = np.digitize(ages, bins) 

Afficher le résultat.

>>> sample 
array([20, 82, 73, 21, 7, 39, 56, 23, 37, 15, 9, 21, 46, 6, 51, 13, 89, 
     47, 46, 4, 78, 33, 29, 26, 74, 72, 62, 52, 2, 48, 39, 91, 40, 38, 
     40, 12, 59, 77, 52, 65, 35, 69, 31, 74, 18], dtype=int64) 
+0

Pourquoi cette question est downvoted. Vous m'avez donné la réponse parfaite – user8778850

+0

Probablement parce que vous n'avez pas montré le code que vous aviez écrit en essayant de résoudre le problème par vous-même. Je ne fais que deviner. Je déteste les votes négatifs parce qu'il est si difficile de savoir ce que l'électeur conteste. En fait, si vous regardez mon profil, vous constaterez que je n'ai voté qu'une seule fois. –