[Python] np.random aiuto!!!

Stefano Dal Pra s.dalpra a gmail.com
Sab 30 Apr 2016 17:56:31 CEST


2016-04-30 17:28 GMT+02:00 Francesca Senatore <
francesca.senatore1983 a gmail.com>:

> Ciao ragazzi,
> vi ringrazio per i vostri consigli. Scusate se rispondo solo ora ma causa
> influenza sono costretta a letto.
>
> Avete ragione! Non credo di essermi spiegata molto bene. Cerco di
> spiegarmi meglio dicendovi cosa esattamente devo fare. Io voglio simulare
> una distribuzione di exposures (a e b sono secondi di osservazione da 5.6e3
> a 2.5e6 secondi).  La distribuzione che devo simulare è fatta in questo
> modo:
>
> l' 88.5% delle exposures cade nell'intervallo [2.5e6,1e5]
> il 9.5% delle exposure cade nell'intervallo [1e5,2.5e4]
> 0.7% delle exposures cade nell'intervallo [2.5e4,1.1e4]
> 1.4% delle exposures cade nell'intervallo [1.1e4,6.3e3]
>
>
Io cambierei cosi' il pezzo di codice messo prima:

probs = [0.88514, 0.0946, 0.006757, 0.01351]
vals = [(1e5,2.5e6),(2.5e4,1e5),(1.1e4,2.5e4),(6.3e3,1.1e4)]
t = zip(probs,vals)
def myrnd():
    cs,x = 0,random.random()
    for k,v in t:
        cs += k
        if x <= cs :
            return v[0] + x * (v[1]-v[0])
    return v[0] + x * (v[1]-v[0])


In pratica : x e' un random tra 0 e 1;
guardando probs trovi in quale segmento si trova
se e' il secondo, trasformi x per essere un random
all'interno di quel segmento:

<offset> + x * <ampiezza del segmento>

Puo' andare?
Stefano


> Sulla base di questo, la cosa più giusta da fare mi è sembrata quella di
> generare numeri random seguendo questa distribuzone di probabilità.
> np.random.choice fa una cosa di questo genere ma non so come applicarla ai
> miei intervalli. Se io considero il vettore [1,2,3,4] e associo le mie
> probabilità ottengo l'88.5% delle volte 1, 9.5% delle volte 2 eccc. Questo
> è ciò che fa choice!!!
> Io invece voglio che l' 88.5% delle volte vengano generati numeri nel
> primo intervallo, il 9.5% delle volte nel secondo intervallo, e così via.
> Credo che devo usare un diverso approccio. Il tutto è complicato dal fatto
> che non sono una cima in programmazione e in python.
> Spero di essere stata più chiara ora. Ovviamente se avete delle dritte da
> darmi sono bene accette.
> Ciao e grazie ancora.
>
> Fra
>
> Il giorno 30 aprile 2016 15:46, Stefano Dal Pra <s.dalpra a gmail.com> ha
> scritto:
>
>> Se ho capito vuoi estrarre dei valori "vals" con le probabilita' "probs".
>> Io ho provato cosi':
>>
>> import random
>>
>> #vale: sum(probs) == 1.0
>> probs = [0.88514, 0.0946, 0.006757, 0.01351]
>> vals  = range(len(probs))
>> t = zip(probs,vals)
>>
>> def myrnd():
>>     cs,x = 0,random.random()
>>     for k,v in t:
>>         cs += k
>>         if x <= cs : return v
>>     return v
>>
>> E myrnd ti restituisce 0 con probabilita' 0.88514,
>> 1con prob. 0.0946 eccetera.
>>
>> Per verificare se piu' o meno ci siamo facciamo un milione di prove
>> e vediamo le le frequenze sono in linea con le probabilita':
>>
>> #Test:
>> dt = dict(zip(vals,[0 for x in vals]))
>> N = 1000000
>> for n in range(N):
>>     k = myrnd()
>>     dt[k] += 1
>>
>> for k,v in dt.items():
>>     print k,(v+0.0)/N
>>
>> e a me da
>> 0 0.884842
>> 1 0.094789
>> 2 0.006818
>> 3 0.013551
>>
>> Se confronti con
>> probs = [0.88514, 0.0946, 0.006757, 0.01351]
>>
>> direi che ci siamo.
>> Stefano
>>
>> 2016-04-30 13:59 GMT+02:00 Christian Barra <barrachri a gmail.com>:
>>
>>> A me pare che lei abbia una serie di eventi con probabilità note (il suo
>>> vettore)  e gli interessa generare numeri secondo quella distribuzione di
>>> probabilità, in pratica generare sample da una funzione di probabilità che
>>> ha definito lei.
>>>
>>> Credo che il link faccia al caso suo.
>>>
>>> _______________________________________________
>>> Python mailing list
>>> Python a lists.python.it
>>> http://lists.python.it/mailman/listinfo/python
>>>
>>>
>>
>> _______________________________________________
>> Python mailing list
>> Python a lists.python.it
>> http://lists.python.it/mailman/listinfo/python
>>
>>
>
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20160430/50c0c2b7/attachment.html>


Maggiori informazioni sulla lista Python