Utilizzo la funzione random_element()
fornita da SAGE per generare partizioni intere casuali per un dato numero intero (N
) di lunghezza particolare (S
). Sto cercando di generare campioni casuali imparziali dal set di tutte le partizioni per i valori dati di N
e S
. La funzione SAGE restituisce rapidamente partizioni casuali per N (ad esempio Partitions(N).random_element()
).Un algoritmo per la generazione casuale di partizioni intere di una lunghezza particolare, in Python?
Tuttavia, rallenta immensamente quando si aggiunge S
(ad esempio Partitions(N,length=S).random_element()
). Allo stesso modo, il filtraggio delle partizioni casuali di N
di lunghezza pari a S
è incredibilmente lento.
Tuttavia, e spero che questo aiuta qualcuno, ho trovato che nel caso in cui la funzione restituisce una partizione di N
che non corrisponde alla lunghezza S
, che la partizione coniugato è spesso di lunghezza S. Cioè:
S = 10
N = 100
part = list(Partitions(N).random_element())
if len(part) != S:
SAD = list(Partition(part).conjugate())
if len(SAD) != S:
continue
Questo aumenta la velocità di partizioni lunghezza S
si trovano e sembra produrre campioni imparziali (ho esaminato i risultati contro interi set di partizioni per vari valori di N
e S
).
Tuttavia, sto utilizzando i valori di N (ad esempio 10,000
) e S (ad esempio 300
) che rendono questo approccio persino lento. Il commento associato alla funzione random_element()
di SAGE ammette che c'è molto spazio per l'ottimizzazione. Quindi, esiste un modo per generare più rapidamente campioni imparziali (ad esempio casuali) di partizioni intere corrispondenti ai valori dati di N
e S
, forse, non generando partizioni che non corrispondono a S
? Inoltre, l'uso delle partizioni coniugate funziona bene in molti casi per produrre campioni imparziali, ma non posso dire di aver capito esattamente perché.
Grazie per la risposta, ma non vedo come questa funzione produce le partizioni basate su campionamento casuale uniforme. – klocey
@klocey, ho perso il fatto che stai generando elementi casuali dalla sequenza, mi dispiace. –
Ho implementato questa funzione e ho confrontato campioni casuali generati da esso in serie complete di partizioni per diverse combinazioni di N e S. I confronti sono stati effettuati utilizzando le curve di densità del kernel generate dalle varianze delle partizioni. Come ogni altra strategia di campionamento che ho provato, questa funzione produce campioni distorti (partizioni di varianza inferiore al previsto). Apparentemente, è davvero molto difficile generare un campione casuale imparziale dall'insieme di tutte le partizioni per un dato totale N e lunghezza S. La funzione SAGE è la più vicina a cui sono arrivato, ma è tutt'altro che ottimale. – klocey