2016-04-30 17:28 GMT+02:00 Francesca Senatore < francesca.senatore1...@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.dal...@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 <barrac...@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@lists.python.it >>> http://lists.python.it/mailman/listinfo/python >>> >>> >> >> _______________________________________________ >> Python mailing list >> Python@lists.python.it >> http://lists.python.it/mailman/listinfo/python >> >> > > _______________________________________________ > Python mailing list > Python@lists.python.it > http://lists.python.it/mailman/listinfo/python > >
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python