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
Répondre
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))
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()
Ce n'est pas la réponse à ma question – user8778850
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
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)
Pourquoi cette question est downvoted. Vous m'avez donné la réponse parfaite – user8778850
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. –
Que voulez-vous dire par « des valeurs quantisation »? – user8153
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
Est-ce que [this] (https://stackoverflow.com/questions/36894191/) Aidez-moi? –