Generazione di vettori casuali con vincoli


10

Devo creare vettori casuali di numeri reali a_i soddisfacendo i seguenti vincoli:

abs(a_i) < c_i;      
sum(a_i)< A;        # sum of elements smaller than A
sum(b_i * a_i) < B; # weighted sum is smaller than B 
aT*A*a < D          # quadratic multiplication with A smaller than D

where c_i, b_i, A, B, D are constants.

Quale sarebbe l'algoritmo tipico per generare in modo efficiente questo tipo di vettore?


1
Cosa intendi con il quarto vincolo, "La grandezza di a è .."
M. Tibbits

Errore mio. Descrizione finita Grazie per il feedback.
LouisChiffre,

In che modo a_isegue la distribuzione p_ied è anche meno c? Questo perché la distribuzione p_iè anche meno c? In quale distribuzione stai pensando?
deps_stats

@deps_stats. Punti molto buoni. Lo pseudo codice non era molto chiaro. La distribuzione che ho in mente è la distribuzione di Poisson. Ogni elemento segue una distribuzione di poisson con una lambda diversa. Con questo in mente, suppongo che la prima condizione (a_i <c) non sia necessaria poiché posso semplicemente ridimensionare a_i alla fine della generazione per soddisfarla.
LouisChiffre,

Vorrei chiedervi un'altra cosa ... sono la c, A, Be lambda fissi?
deps_stats,

Risposte:


4

Se ti capisco correttamente, solo i punti in un piccolo volume di spazio n-dimensionale soddisfano i tuoi vincoli.

Il tuo primo vincolo lo limita all'interno di un'ipersfera, il che mi ricorda le FAQ di comp.graphics.algorithms "Punti casuali uniformi sulla sfera" e Come generare punti distribuiti uniformemente nella sfera dell'unità 3D? Il secondo vincolo si separa un po 'dall'ipersfera e gli altri vincoli si allontanano ulteriormente al volume che soddisfa i tuoi vincoli.

Penso che la cosa più semplice da fare sia uno degli approcci suggeriti dalle FAQ:

  • scegliere un rettangolo di selezione arbitrario allineato all'Asse che sicuramente contiene l'intero volume. In questo caso, -c <a_1 <c, -c <a_2 <c, ... -c <a_n <c contiene l'intero volume vincolato, poiché contiene l'ipersfera descritta dal primo vincolo e gli altri vincoli continuano a diminuire via a quel volume.
  • L'algoritmo seleziona in modo uniforme i punti all'interno di quel rettangolo di selezione. In questo caso, l'algoritmo imposta in modo indipendente ciascuna coordinata di un vettore candidato su un numero casuale distribuito uniformemente indipendente da -c a + c. (Presumo che tu voglia distribuire punti con uguale densità in questo volume. Suppongo che potresti fare in modo che l'algoritmo selezioni alcune o tutte le coordinate con una distribuzione di Poisson o qualche altra distribuzione non uniforme, se avessi qualche motivo per farlo).
  • Una volta che hai un vettore candidato, controlla ogni vincolo. Se fallisce uno di essi, torna indietro e scegli un altro punto.
  • Una volta che hai un vettore candidato, conservalo da qualche parte per un uso successivo.
  • Se non hai abbastanza vettori memorizzati, torna indietro e prova a generarne un altro.

Con un generatore di numeri casuali di qualità sufficientemente elevata, questo ti dà un insieme di coordinate memorizzate che soddisfano i tuoi criteri con densità uniforme (prevista).

Ahimè, se hai una dimensionalità relativamente alta n (cioè se costruisci ogni vettore da un elenco di coordinate relativamente lungo), la sfera inscritta (molto meno il tuo volume ridotto) ha una parte sorprendentemente piccola del volume totale di il riquadro di delimitazione totale, quindi potrebbe essere necessario eseguire molte iterazioni, la maggior parte delle quali genera punti rifiutati all'esterno dell'area vincolata, prima di trovare un punto all'interno dell'area vincolata. Dal momento che i computer al giorno d'oggi sono abbastanza veloci, sarà abbastanza veloce?


Quindi quello che stai suggerendo è efficacemente campionare lo spazio. Ho un problema simile, tranne per il fatto che la ricerca di un rettangolo di selezione non può essere eseguita staticamente (IE, non può essere codificata). Per esperienza, questo si interrompe se i tuoi vincoli sono nella forma. f1(x1) + f2(x2) == CQualche suggerimento qui?
Groostav,

Sì, il metodo di campionamento non funziona se si hanno vincoli di uguaglianza ("=="). Vincoli come punti che si trovano sulla superficie di una sfera, o sulla superficie di un cilindro, ecc. (Raggio == R), anziché all'interno della sfera (raggio <= R). La selezione uniforme dei punti su tutto il volume "non" (mai vicino a 0) raggiungerà la superficie desiderata. Quindi devi in ​​qualche modo selezionare solo i punti che si trovano su quella superficie - cioè, per trovare punti [x1, x2, x3] tali che f1 (x1) + f2 (x2) == C, puoi scegliere casualmente x1 e quindi forzare x2 = inverse_f2 (C - f1 (x1)).
David Cary,

Per il caso speciale di punti distribuiti uniformemente sulla superficie di una sfera, vedere "Punti casuali uniformi sulla sfera" .
David Cary,

@Groostav: Forse la tua domanda è abbastanza diversa dalla domanda originale da poterla pubblicare come nuova domanda di livello superiore? "Mi è appena stato detto che devo pubblicare una domanda di follow-up, perché e come?"
David Cary,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.