0
votes

Sélection du nombre de nombres de manière aléatoire de la liste des entiers proportionnels à sa magnitude

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> xxx

J'ai écrit le code ci-dessus mais que vous n'obtenez pas la sortie correcte.


3 commentaires

** 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.


4 Réponses :


0
votes

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)


0 commentaires

1
votes

C'est une erreur logique que vous avez faite. Quand vous vérifiez la plage r> = cum_sum [index] et r , vous utilisez réellement le numéro 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}


3 commentaires

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 100 . Pour des échantillons suffisamment importants et un grand générateur de nombres aléatoires, cela fonctionnerait correctement.



0
votes

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 math.inf . Cela garantit que les probabilités sont proportionnelles aux poids ( Voir Wikipedia ). Xxx

Si vos poids ne peuvent pas inclure 0, vous pouvez supprimer la fonction échantillon , et utilisez simplement aléatoire.expovariate directement.

Exemples, montrant les distributions résultantes via compteur :: xxx


0 commentaires

1
votes
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()

0 commentaires