Un metodo di campionamento di "importanza Gibbs" funzionerebbe?


8

Ho il sospetto che questa sia una domanda abbastanza insolita ed esplorativa, quindi per favore abbi pazienza.

Mi chiedo se si possa applicare l'idea di campionamento di importanza al campionamento di Gibbs. Ecco cosa intendo: nel campionamento di Gibbs, cambiamo il valore di una variabile (o blocco di variabili) alla volta, campionando dalla probabilità condizionale date le variabili rimanenti.

Tuttavia, potrebbe non essere possibile o facile campionare dalla probabilità condizionale esatta. Quindi, invece, proviamo da una distribuzione della proposta e utilizziamo, ad esempio, Metropolis-Hastings (MH).q

Fin qui tutto bene. Ma ecco un percorso divergente: cosa succede se, invece di usare MH, usiamo la stessa idea usata nel campionamento per importanza, vale a dire campioniamo da e manteniamo un peso in peso del campione attuale?qp/q

Più in dettaglio: supponiamo di avere variabili e una distribuzione fattorizzata modo che . Manteniamo la probabilità di proposta utilizzata per campionare il valore corrente di ciascuna variabile . Ad ogni passaggio cambiamo un sottoinsieme delle variabili e aggiorniamo (solo i fattori di e che sono interessati). Prendiamo i campioni e il loro peso di importanza per calcolare qualunque statistica ci interessa.x1,,xnϕ1,,ϕmpi=1mϕiqixip(x)/q(x)pq

Questo algoritmo sarebbe corretto? In caso contrario, eventuali motivi chiari perché no? Intuitivamente per me ha senso in quanto sembra fare la stessa cosa importante per il campionamento, ma con campioni dipendenti.

Ho implementato questo per un modello di camminata casuale gaussiana e ho osservato che i pesi diventano sempre più piccoli (ma non monotonicamente), quindi i campioni iniziali finiscono per avere troppa importanza e dominano la statistica. Sono abbastanza sicuro che l'implementazione non sia buggy, perché ad ogni passo comparo il peso aggiornato con un calcolo esplicito della forza bruta. Si noti che i pesi non scendono indefinitamente a zero, poiché sono dove sia che sono prodotti di un numero finito di densità, e ogni campione è ottenuto da una distribuzione normale che solo raramente sarà zero.p/qpq

Quindi sto cercando di capire perché i pesi scendano in questo modo e se questa sia una conseguenza di questo metodo in realtà non corretto.


Ecco una definizione più precisa dell'algoritmo, applicata a una camminata casuale gaussiana sulle variabili . Il codice segue di seguito.X1,,Xn

Il modello è semplicemente , con fisso su .XiN(Xi1,σ2),i=1,,nX00

Il peso del campione corrente è , dove sono le densità gaussiane e sono le distribuzioni da cui sono stati campionati i valori correnti. Inizialmente, semplicemente campioniamo i valori in avanti, quindi e il peso iniziale è .ip(xi)iq(xi)pqq=p1

Quindi ad ogni passaggio scelgo per cambiare. Ho assaggiare un nuovo valore per da , in modo da questa densità diventa la nuova distribuzione proposta utilizzato per .j{1,,n}xjXjN(Xj1,σ2)Xj

Per aggiornare il peso, lo divido per le densità e del vecchio valore secondo e e moltiplicare per le densità e di nuovo valore secondo e . Questo aggiorna il numeratore del peso.p(xj|xj1)p(xj+1|xj)xjxj1xj+1p(xj|xj1)p(xj+1|xj)xjxj1xj+1p

Per aggiornare il denominatore , moltiplico il peso per la vecchia proposta (rimuovendolo così dal denominatore) e lo divido per .qq(xj)q(xj)

(Poiché dal normale centrato su , è sempre uguale a quindi si annullano e l'implementazione non in realtà non li usano).xjxj1q(xj)p(xj|xj1)

Come ho detto prima, nel codice comparo questo calcolo del peso incrementale con il calcolo esplicito effettivo solo per essere sicuro.


Ecco il codice di riferimento.

println("Original sample: " + currentSample);
int flippedVariablesIndex = 1 + getRandom().nextInt(getVariables().size() - 1);
println("Flipping: " + flippedVariablesIndex);
double oldValue = getValue(currentSample, flippedVariablesIndex);
NormalDistribution normalFromBack = getNormalDistribution(getValue(currentSample, flippedVariablesIndex - 1));
double previousP = normalFromBack.density(oldValue);
double newValue = normalFromBack.sample();
currentSample.set(getVariable(flippedVariablesIndex), newValue);
double previousQ = fromVariableToQ.get(getVariable(flippedVariablesIndex));
fromVariableToQ.put(getVariable(flippedVariablesIndex), normalFromBack.density(newValue));
if (flippedVariablesIndex < length - 1) {
    NormalDistribution normal = getNormalDistribution(getValue(currentSample, flippedVariablesIndex + 1));
    double oldForwardPotential = normal.density(oldValue);
    double newForwardPotential = normal.density(newValue);
    // println("Removing old forward potential " + oldForwardPotential);
    currentSample.removePotential(new DoublePotential(oldForwardPotential));
    // println("Multiplying new forward potential " + newForwardPotential);
    currentSample.updatePotential(new DoublePotential(newForwardPotential));
}

// println("Removing old backward potential " + previousP);
currentSample.removePotential(new DoublePotential(previousP));
// println("Multiplying (removing from divisor) old q " + previousQ);
currentSample.updatePotential(new DoublePotential(previousQ));

println("Final sample: " + currentSample);
println();

// check by comparison to brute force calculation of weight:
double productOfPs = 1.0;
for (int i = 1; i != length; i++) {
    productOfPs *= getNormalDistribution(getValue(currentSample, i - 1)).density(getValue(currentSample, i));
}
double productOfQs = Util.fold(fromVariableToQ.values(), (p1, p2) -> p1*p2, 1.0);
double weight = productOfPs/productOfQs;
if (Math.abs(weight - currentSample.getPotential().doubleValue()) > 0.0000001) {
    println("Error in weight calculation");
    System.exit(0);
}

Il campionamento dell'importanza non fornisce campioni dalla distribuzione target (in questo caso, i condizionali completi di ). Quindi la dinamica del kernel Markov che produce convergenza MCMC, non regge. Senza guardare il tuo codice, non riesco a capire perché i pesi stanno andando a 0.ϕi
Greenparker,

Grazie. Immagino che dovrò approfondire i teoremi della convergenza MCMC. Ho inserito il codice per ogni evenienza, è abbastanza semplice. Grazie.
user118967

1
Invece di includere il codice non elaborato (o in aggiunta), puoi spiegare come stai implementando l'algoritmo? Qual è la distribuzione target, quali sono i condizionali completi, qual è la distribuzione della proposta, come stai combinando i pesi, ecc. Ecc.
Greenparker

Grazie. L'ho fatto, per favore fatemi sapere se questo è fonte di confusione da qualche parte.
user118967,

@ Xi'an: qui, il campionamento di importanza viene applicato al capovolgimento di una singola variabile. Invece di accettare la proposta o meno come in Metropolis Hastings, la accettiamo sempre, ma manteniamo una misura di importanza di tale capovolgimento dividendo la probabilità p per la proposta q per la variabile che viene capovolta.
user118967

Risposte:


4

Questa è un'idea interessante, ma vedo diverse difficoltà con essa:

  1. contrariamente al campionamento di importanza standard, o persino al campionamento di importanza metropolita, la proposta non agisce nello stesso spazio della distribuzione target, ma in uno spazio di dimensione inferiore, pertanto la convalida non è chiara [e potrebbe imporre di mantenere pesi attraverso iterazioni, quindi affrontando la degenerazione]
  2. le costanti normalizzanti mancanti in tutti i condizionali cambiano ad ogni iterazione ma non sono considerate [vedi sotto]
  3. i pesi non sono limitati, in quanto lungo le iterazioni alla fine ci saranno simulazioni con un peso molto grande, a meno che non si tenga traccia dell'ultima occorrenza di un aggiornamento per lo stesso indice , che potrebbe scontrarsi con la validazione markoviana del campionatore Gibbs . L'esecuzione di un esperimento modesto con e iterazioni mostra una gamma di pesi da a .jn=2T=1037.656397e-073.699364e+04

Per ulteriori dettagli, prendere in considerazione un obiettivo bidimensionale , inclusa la costante normalizzante corretta, e implementare l'importanza del campionatore Gibbs con le proposte e . I pesi di importanza corretta [nel senso di produrre l'attesa corretta, cioè uno stimatore imparziale, per una funzione arbitraria di ] per le simulazioni successive sono dove e sono i margini di . O in modo equivalente p(,)qX(|y)qY(|x)(X,Y)

p(xt,yt1)qX(xt|yt1)mY(yt1)orp(xt1,yt)qY(yt|xt1)mX(xt1)
mX()mY()p(,)
pX(xt|yt1)qX(xt|yt1)orpY(yt|xt1)qY(yt|xt1)
In entrambi i casi, ciò richiede le densità marginali [intrattabili di e sotto l'obiettivo .XYp(,)

Vale la pena confrontare ciò che accade qui con l' algoritmo Metropolis ponderato per l'importanza parallela . (Vedi ad esempio Schuster e Klebanov, 2018 ). Se l'obiettivo è di nuovo e la proposta è , l'importanza peso è corretto [verso la produzione di una stima imparziale] e non aggiorna il peso precedente ma inizia da zero ad ogni iterazione.p(,)q(,|x,y)

p(x,y)q(x,y|x,y)

(C.) Una correzione all'importanza originale della proposta di Gibbs è quella di proporre un nuovo valore per l'intero vettore, ad esempio, , dalla proposta di Gibbs , perché allora l'importanza peso è corretta [manca un possibile normalizzazione costante che ora è veramente costante e non trasporta dalle precedenti iterazioni di Gibbs] .(x,y)qX(xt|yt1)qY(yt|xt)

p(xt,yt)qX(xt|yt1)qY(yt|xt)

Un'ultima nota: per il target di camminata casuale considerato nel codice, la simulazione diretta è fattibile a cascata: simula , quindi dato , e tc.X1X2X1

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.