[Python] np.random aiuto!!!
Francesca Senatore
francesca.senatore1983 a gmail.com
Sab 30 Apr 2016 17:28:58 CEST
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]
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
>
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20160430/d4fd5ab5/attachment-0001.html>
Maggiori informazioni sulla lista
Python