Sélectionnez un numéro de manière aléatoire avec une probabilité proportionnelle à sa magnitude de la matrice donnée de n éléments Considérons une expérience, sélectionnant un élément de la liste une probabilité proportionnelle de manière aléatoire à sa magnitude. Supposons que nous effectuons la même expérience à 100 fois avec remplacement, dans chaque expérience, vous imprimerez un numéro sélectionné au hasard de A.
EX 1: A = [0 5 27 6 13 28 100 45 10 79]
Soit F (x) désignant le nombre de fois x réside dans 100 expériences.
F (100)> F (79)> F (45)> F (27)> F (27)> F (3)> F (6)> F (5)> F (0) < / p> J'ai écrit le code ci-dessus mais que vous n'obtenez pas la sortie correcte. p> p>
4 Réponses :
Numpy a le choix à une fonction aléatoire supplémentaire pour tenir compte de la distribution probablity. Vous devriez utiliser ceci.
from numpy.random import choice A = [0,5,27,6,13,28,100,45,10,79] sumA=sum(A) probability=[item/sumA for item in A] for i in range(1,100): number = choice(A, 1, p=probability) print(number)
C'est une erreur logique que vous avez faite. Quand vous vérifiez la plage
r> = cum_sum [index] et r
A [index + 1] code> et non
A [ Index] code>.
{100: 35, 5: 1, 45: 15, 79: 20, 28: 8, 13: 8, 6: 2, 27: 9, 10: 1}
Où vous avez exactement apporté les changements?
Bonjour Raj, il ne donne toujours pas de sortie correct petit nombre imprimé plus de temps que le nombre supérieur.
Il ne peut pas être analysé en utilisant uniquement des échantillons de test code> 100 code>. Pour des échantillons suffisamment importants et un grand générateur de nombres aléatoires, cela fonctionnerait correctement.
Si vous avez une liste de poids> 0, vous pouvez échantillonner à partir d'une distribution de probabilité en fonction de ces poids en mappant chaque poids à un échantillon à partir d'une distribution exponentielle, puis en choisissant l'élément avec le résultat le plus bas. Il n'est pas possible d'avoir une distribution exponentielle avec le paramètre 0, mais nous pouvons gérer 0 par mappage vers Si vos poids ne peuvent pas inclure 0, vous pouvez supprimer la fonction Exemples, montrant les distributions résultantes via compteur a >:: p> math.inf code>. Cela garantit que les probabilités sont proportionnelles aux poids ( Voir Wikipedia ).
échantillon code>, et utilisez simplement
aléatoire.expovariate code> directement. p>
from random import uniform def pick_a_number_from_list(A): # picking an element from with the probability propotional to its magnitude #Find the sum of the elements of List A sum=0 for ele in A: sum+=ele #print(sum) #Normalizing the values using the sum D=[] for ele in A: d=ele/sum e=round(d,5) D.append(e) #print(D) #Cumulative Normalized Values C=[0] c=0 for ele in D: c=c+ele f=round(c,5) C.append(f) #print(len(C)) #print(C) #Find the Ramdom sampling by using uniform() between 0 to 1 r=uniform(0.0,1.0) ran=round(r,5) #print(ran) # proportional Sampling #number=0 for i in range(len(C)-1): if(r>=C[i] and r <C[i+1]): #print(A[i]) return A[i] #return number def sampling_based_on_magnitued(): A=[] n=int(input("Enter the length of List\n")) print("Enter the Elements between 1 to 100 in List A") for i in range(n): A.append(float(input())) print("The Elements in a List A are\n") print("A =",A) B=[] print("The Random Numbers generated between 1 to 100 are \n") for i in range(1,100): number = pick_a_number_from_list(A) B.append(number) print(B) #print(number) # To Print the Count of no of occurence of Number Ramdonly c=(sorted(A, reverse=True)) print(c) for ele in c: print("count of {} is".format(ele),B.count(ele)) sampling_based_on_magnitued()
** J'ai écrit le code ci-dessus mais n'abandonne pas la bonne sortie. Peut-on aider quelqu'un s'il vous plaît aidez-moi à comprendre où je fais mal.
Quel est le problème à laquelle vous êtes confronté?
Selon le problème, il doit renvoyer le 100 de la liste de temps maximum et 0 min de fois, mais le code ne renvoie pas la sortie attendue.