Non faccio uso di Python, quindi piuttosto che errori di sintassi di rischio Cercherò di descrivere la soluzione algoritmicamente. Questa è un'inversione discreta a forza bruta. Dovrebbe tradurre abbastanza facilmente in Python. Sto assumendo l'indicizzazione basata su 0 per l'array.
Setup:
generare una serie di dimensioni cdf
m
con cdf[0] = 1
come prima voce, cdf[i] = cdf[i-1] + 1/(i+1)**a
per le voci rimanenti.
Ridimensionare tutte le voci dividendo cdf[m-1]
in ciascuna - ora sono effettivamente valori CDF.
Usage:
- Generare i valori casuali per generare un Uniform (0,1) e la ricerca attraverso
cdf[]
fino a trovare una voce più grande del tuo uniforme. Restituisce l'indice + 1 come valore x
.
Ripetere per il numero di valori x
desiderato.
Ad esempio, con a,m = 2,10
, a calcolare le probabilità direttamente come:
[0.6452579827864142, 0.16131449569660355, 0.07169533142071269, 0.04032862392415089, 0.02581031931145657, 0.017923832855178172, 0.013168530260947229, 0.010082155981037722, 0.007966147935634743, 0.006452579827864143]
e CDF è:
[0.6452579827864142, 0.8065724784830177, 0.8782678099037304, 0.9185964338278814, 0.944406753139338, 0.9623305859945162, 0.9754991162554634, 0.985581272236501, 0.9935474201721358, 1.0]
Quando si generano, se ho ottenuto un risultato uniforme di 0,90 mi di ritorno x=4
perché 0.918 ... è la prima voce CDF più grande della mia uniforme.
Se si è preoccupati della velocità, è possibile creare una tabella alias, ma con un decadimento geometrico la probabilità di terminazione anticipata di una ricerca lineare attraverso l'array è piuttosto elevata. Con l'esempio dato, ad esempio, terminerai la prima volta circa i 2/3 del tempo.
Perché non fare solo il campionamento del rifiuto con le distribuzioni di legge di potenza incorporate? –