0% acharam este documento útil (0 voto)
4 visualizações157 páginas

Metodos Computacionais

O documento aborda a simulação estocástica, apresentando conceitos fundamentais de probabilidade, variáveis aleatórias e métodos de simulação. Ele explora tanto variáveis discretas quanto contínuas, além de técnicas como Monte Carlo e amostragem por importância. O conteúdo é estruturado em seções que detalham algoritmos e aplicações práticas em simulação.

Enviado por

AlexandreSouza
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
4 visualizações157 páginas

Metodos Computacionais

O documento aborda a simulação estocástica, apresentando conceitos fundamentais de probabilidade, variáveis aleatórias e métodos de simulação. Ele explora tanto variáveis discretas quanto contínuas, além de técnicas como Monte Carlo e amostragem por importância. O conteúdo é estruturado em seções que detalham algoritmos e aplicações práticas em simulação.

Enviado por

AlexandreSouza
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Simulação Estocástica

Thiago Rodrigo Ramos

10 de novembro de 2025
2
Sumário

1 Introdução 7
1.1 Um conselho: a importância de ser ruim antes de ser bom . . . . . . . . . . . . . . . 7

2 Elementos básicos de probabilidade 9


2.1 Axiomas da probabilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1.1 Probabilidade condicional e independência . . . . . . . . . . . . . . . . . . . . 9
2.2 Variáveis aleatórias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Valor esperado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4 Variância . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4.1 Covariância . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.5 Desigualdades básicas de concentração . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.6 Teoremas assintóticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3 Variáveis discretas e como simulá-las 17


3.1 Variáveis com suporte finito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 Bernoulli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.3 Distribuição binomial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3.1 Simulando via Bernoullis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3.2 Simulando via identidade recursiva . . . . . . . . . . . . . . . . . . . . . . . . 22
3.3.3 Aspectos computacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3.4 Número médio de passos em algoritmos de inversão recursiva . . . . . . . . 24
3.4 Distribuição geométrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.4.1 Simulando via Bernoullis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.4.2 Simulando a geométrica via inversão . . . . . . . . . . . . . . . . . . . . . . . 26
3.5 Distribuição de Poisson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.5.1 Simulação a Poisson via inversão e recursão . . . . . . . . . . . . . . . . . . . 28
3.5.2 Algoritmo melhorado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.5.3 Relação com a binomial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.6 Distribuição binomial negativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.6.1 Simulando via Bernoullis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.6.2 Simulando via soma de geométricas . . . . . . . . . . . . . . . . . . . . . . . . 32
3.6.3 Simulando via inversão recursiva . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.6.4 Por que o nome “Binomial Negativa”? . . . . . . . . . . . . . . . . . . . . . . 34

3
4 SUMÁRIO
3.7 Distribuição hipergeométrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.7.1 Simulando a Hipergeométrica . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4 Variáveis contínuas e como simulá-las 37


4.1 Método da Inversão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.1.1 Distribuição exponencial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.2 Método da rejeição-aceitação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.2.1 Distribuição normal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.3 Distribuição Gamma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.3.1 Simulando quando α é inteiro . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.3.2 Simulando quando α > 1 via aceitação–rejeição com Exponencial . . . . . . . 48
4.3.3 Simulando quando α < 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.4 Distribuição Beta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.4.1 Simulando a Beta via aceitação–rejeição com proposta uniforme . . . . . . . 52
4.4.2 Simulando a Beta via Gammas independentes . . . . . . . . . . . . . . . . . . 53
4.5 Transformações de Variáveis Aleatórias . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.5.1 Geração de Normais via Método de Box–Muller . . . . . . . . . . . . . . . . . 54
4.5.2 Geração da normal bivariada . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.5.3 Distribuição Qui-quadrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.5.4 Simulando a distribuição t de Student . . . . . . . . . . . . . . . . . . . . . . . 61

5 Simulação via Monte Carlo 63


5.1 Estimando médias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.1.1 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.2 Intervalos de Confiança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

6 Redução de variância 69
6.1 Uso de variáveis antitéticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.2 O uso de variáveis de controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
6.3 Redução de Variância por Condicionamento . . . . . . . . . . . . . . . . . . . . . . . 77

7 Amostragem por importância 81


7.1 Densidades Inclinadas (Tilted Densities) . . . . . . . . . . . . . . . . . . . . . . . . . . 82
7.2 Desigualdade de Chernoff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.3 Variância sob Inclinação Exponencial . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
7.4 Variáveis Sub-Gaussianas e Desigualdade de Hoeffding . . . . . . . . . . . . . . . . 88
7.5 Por que a Inclinação Exponencial? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

8 Cadeias de Markov e MCMC 93


8.1 Cadeias de Markov (Resumo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
8.1.1 Classificação dos estados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
8.1.2 Distribuição estacionária . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
8.1.3 Reversibilidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
8.2 Markov Chain Monte Carlo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
SUMÁRIO 5
8.3 Algoritmo de Metropolis–Hastings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
8.4 Amostragem de Gibbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

9 Processos de Difusão 119


9.1 Movimento Browniano e SDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
9.2 Equação de Fokker–Planck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
9.3 Amostragem de Langevin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
9.4 Denoising Score Matching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
9.4.1 Estimando o score na prática . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
9.4.2 Etapa de Inferência via Langevin . . . . . . . . . . . . . . . . . . . . . . . . . . 129

10 Bootstrap 133
10.1 Uma visão pragmática de Bootstrap . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
10.2 Uma visão teórica de Bootstrap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
10.2.1 A desigualdade de Dvoretzky–Kiefer–Wolfowitz . . . . . . . . . . . . . . . . 136
10.2.2 Bootstrap e pontes brownianas . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

11 Estratégias para acelerar códigos em Python 145


11.1 Profiling com cProfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
11.2 Paralelização com [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
11.3 Compilação Just-In-Time com Numba . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
11.4 Paralelismo simples em Bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
6 SUMÁRIO
Capítulo 1

Introdução

1.1 Um conselho: a importância de ser ruim antes de ser bom


É natural que, quando começamos a fazer algo, a gente faça essa coisa muito malfeita ou cheia
de defeitos. Isso é comum em qualquer processo de aprendizagem, e sempre foi assim, desde o
início dos tempos.
Quando comecei a programar em Python, muita coisa sobre a linguagem eu aprendi por
conta própria, apesar de já ter feito alguns cursos básicos em C. Programei de forma amadora
em Python por muitos anos, até que, no doutorado, precisei aprender a programar de forma mais
organizada e profissional. Lembro que, nessa época, um amigo da pós-graduação me apresentou
ao "submundo da programação". Foi aí que aprendi muito do que sei hoje sobre terminal do
Linux, Git, e foi também quando comecei a usar o Vim.
Uma das coisas que esse amigo me mostrou foi o Pylint, que nada mais é do que um verifi-
cador de bugs e qualidade de código para Python. O Pylint é bem rigoroso na análise, e ainda
te dá, ao final, uma nota que vai até 10. Nessa fase, apesar de já ter evoluído bastante, meus
códigos ainda recebiam notas por volta de 6 ou 7. Resolvi então rodar o Pylint nos meus códigos
antigos pra ter uma noção de quão ruins eles eram — e a nota final foi -900. Pois é, existe um
limite superior para o quão bem você consegue fazer algo, mas aparentemente o fundo do poço
é infinito.
O que eu queria mostrar com essa história é que faz parte do processo de aprendizado ser
ruim no começo e melhorar com o tempo. Falo isso porque, hoje em dia, com o crescimento
dos LLMs, a gente fica tentado a pular essa etapa de errar muito até acertar, e ir direto pra
fase em que escrevemos códigos limpos, bem comentados, identados e organizados. Mas não
se enganem: apesar da aparência profissional, depender de LLMs pra escrever tudo atrapalha
justamente essa parte essencial de aprender errando.
Neste curso, vários exercícios envolvem escrever códigos em Python. Meu conselho é: não
tenham vergonha de errar, de escrever soluções ruins ou confusas. Isso é absolutamente normal.
Vocês estão aqui para evoluir — e errar faz parte do processo.

7
8 CAPÍTULO 1. INTRODUÇÃO
Capítulo 2

Elementos básicos de probabilidade

2.1 Axiomas da probabilidade


Um espaço de probabilidade é uma tupla composta por três elementos: o espaço amostral, o conjunto
de eventos e uma distribuição de probabilidade:

• Espaço amostral Ω: Ω é o conjunto de todos os eventos elementares ou resultados possíveis


de um experimento. Por exemplo, ao lançar um dado, Ω = {1, 2, 3, 4, 5, 6}.

• Conjunto de eventos F : F é uma σ-álgebra, ou seja, um conjunto de subconjuntos de Ω


que contém Ω e é fechado sob complementação e união enumerável (e, consequentemente,
também sob interseção enumerável). Um exemplo de evento é: “o dado mostra um número
ímpar”.

• Distribuição de probabilidade P: P é uma função que associa a cada evento de F um


número em [0, 1], tal que P[Ω] = 1, P[∅] = 0 e, para eventos mutuamente exclusivos
A1 , . . . , An , temos:

n
P [ A1 ∪ · · · ∪ A n ] = ∑ P[ A i ].
i =1

A distribuição de probabilidade discreta associada ao lançamento de um dado justo pode ser


definida como P[ Ai ] = 1/6 para i ∈ {1, . . . , 6}, onde Ai é o evento “o dado mostra o valor i”.

2.1.1 Probabilidade condicional e independência

A probabilidade condicional do evento A dado o evento B é definida como a razão entre a


probabilidade da interseção A ∩ B e a probabilidade de B, desde que P[ B] ̸= 0:

P[ A ∩ B ]
P[ A | B ] = .
P[ B ]

Dois eventos A e B são ditos independentes quando a probabilidade conjunta P[ A ∩ B] pode ser
fatorada como o produto P[ A]P[ B]:

P[ A ∩ B ] = P[ A ]P[ B ].

9
10 CAPÍTULO 2. ELEMENTOS BÁSICOS DE PROBABILIDADE
De forma equivalente, a independência entre A e B pode ser expressa afirmando que P[ A | B] =
P[ A], sempre que P[ B] ̸= 0.
Além disso, uma sequência de variáveis aleatórias é dita i.i.d. (independentes e identicamente
distribuídas) quando todas as variáveis da sequência são mutuamente independentes e seguem
a mesma distribuição de probabilidade.
Seguem algumas propriedades importantes:

P[ A ∪ B ] = P[ A ] + P[ B ] − P[ A ∩ B ] (regra da soma)
" #
n n
P ∑ P[ A i ]
[
Ai ≤ (desigualdade da união)
i =1 i =1
P[ B | A ]P[ A ]
P[ A | B ] = (fórmula de Bayes)
P[ B ]
" # " #
n −1
n\
P A i = P[ A1 ]P[ A2 | A1 ] · · · P A n |
\
Ai (regra da cadeia)
i =1 i =1

Exercício 1. Prove os resultados acima.

2.2 Variáveis aleatórias


Uma variável aleatória X é uma função mensurável X : Ω → R, ou seja, tal que, para qualquer
intervalo I ⊂ R, o conjunto
{ω ∈ Ω : X (ω ) ∈ I }
pertence à σ-álgebra de eventos.
No caso discreto, a função de massa de probabilidade de X é dada por

x 7 → P[ X = x ].

Quando a distribuição de X é absolutamente contínua, existe uma função densidade de probabilidade


f tal que, para todo a, b ∈ R,
Z b
P[ a ≤ X ≤ b ] = f ( x ) dx.
a
A função f é chamada função densidade de probabilidade da variável aleatória X. A relação entre
a função de distribuição acumulada F (·) e a densidade f (·) é
Z a
F ( a ) = P{ X ≤ a } = f ( x ) dx.
−∞

Derivando ambos os lados, obtemos


d
F ( a ) = f ( a ),
da
ou seja, a densidade é a derivada da função de distribuição acumulada.
Uma interpretação mais intuitiva de f pode ser obtida observando que, para ε > 0 pequeno,
Z a+ε/2
 ε ε
P a− < X < a+ = f ( x ) dx ≈ ε f ( a).
2 2 a−ε/2
2.3. VALOR ESPERADO 11
Assim, f ( a) quantifica a probabilidade de X assumir valores próximos de a.

Em muitos contextos, o interesse recai não apenas sobre variáveis aleatórias individuais, mas
também sobre o relacionamento entre duas ou mais variáveis. Para descrever a dependência
entre X e Y, definimos a função de distribuição acumulada conjunta como

F ( x, y) = P{ X ≤ x, Y ≤ y},

que fornece a probabilidade de X ser menor ou igual a x e, simultaneamente, Y ser menor ou


igual a y.
Se X e Y forem variáveis aleatórias discretas, a função de massa de probabilidade conjunta é

p( x, y) = P{ X = x, Y = y}.

Se forem conjuntamente contínuas, existe uma função densidade de probabilidade conjunta f ( x, y) tal
que, para quaisquer conjuntos C, D ⊂ R,
ZZ
P{ X ∈ C, Y ∈ D } = f ( x, y) dx dy.
x ∈C, y∈ D

As variáveis X e Y são independentes se, para quaisquer C, D ⊂ R,

P{ X ∈ C, Y ∈ D } = P{ X ∈ C } P{Y ∈ D }.

De forma intuitiva, isso significa que conhecer o valor de uma das variáveis não altera a distri-
buição da outra.
No caso discreto, X e Y são independentes se, e somente se, para todo x, y,

P{ X = x, Y = y} = P{ X = x } P{Y = y}.

Se forem conjuntamente contínuas, a independência é equivalente a

f ( x, y) = f X ( x ) f Y (y), ∀ x, y,

onde f X e f Y são as densidades marginais de X e Y, respectivamente.

2.3 Valor esperado


A esperança ou valor esperado de uma variável aleatória X é denotada por E[ X ] e, no caso
discreto, é definida como
E[ X ] = ∑ x P[ X = x ].
x

Exemplo 1. Se I é uma variável aleatória indicadora do evento A, isto é,



1, se A ocorre,
I=
0, se A não ocorre,

então
E[ I ] = 1 · P( A ) + 0 · P( A c ) = P( A ).
Portanto, a esperança de uma variável indicadora de um evento A é exatamente a probabilidade de que A
ocorra.
12 CAPÍTULO 2. ELEMENTOS BÁSICOS DE PROBABILIDADE
No caso contínuo, quando X possui uma função densidade de probabilidade f ( x ), a espe-
rança é dada por Z ∞
E[ X ] = x f ( x ) dx.
−∞
Além disso, dado uma função qualquer g, temos que:
Z ∞
E[ g( X )] = g( x ) f ( x ) dx.
−∞

Uma propriedade fundamental da esperança é sua linearidade. Isto é, para quaisquer variá-
veis aleatórias X e Y e constantes a, b ∈ R, temos:

E[ aX + bY ] = aE[ X ] + bE[Y ].

2.4 Variância
A variância de uma variável aleatória X é denotada por Var[ X ] e definida como

Var[ X ] = E[( X − E[ X ])2 ].

O desvio padrão de X é denotado por σX e definido como


q
σX = Var[ X ].

Para qualquer variável aleatória X e qualquer constante a ∈ R, as seguintes propriedades


básicas são válidas:
Var[ X ] = E[ X 2 ] − E[ X ]2 ,

Var[ aX ] = a2 Var[ X ].

Além disso, se X e Y forem independentes, então

Var[ X + Y ] = Var[ X ] + Var[Y ].

Exercício 2. Prove os resultados anteriores.

2.4.1 Covariância

A covariância entre duas variáveis aleatórias X e Y é denotada por Cov( X, Y ) e definida por

Cov( X, Y ) = E [( X − E[ X ])(Y − E[Y ])] .

Exercício 3. Prove que


Cov( X, Y ) = E [ XY ] − E [ X ] E [Y ] .

Dizemos que X e Y são não correlacionadas quando Cov( X, Y ) = 0. Se X e Y forem indepen-


dentes, então certamente são não correlacionadas, mas a recíproca nem sempre é verdadeira.

Exercício 4. Seja X uniforme no intervalo [−1, 1] e seja Y = X 2 . Mostre que Cov ( X, Y ) = 0 mas X, Y
não são independentes.
2.4. VARIÂNCIA 13
Observação 1. Considere uma variável aleatória contínua X centrada em zero, ou seja, E[ X ] = 0, com
densidade de probabilidade par e definida em um intervalo do tipo (− a, a), com a > 0. Seja Y = g( X )
para uma função g. A questão é: para quais funções g( X ) temos Cov( X, g( X )) = 0?
Sabemos que
Cov( X, g( X )) = E[ Xg( X )] − E[ X ]E[ g( X )].

Como E[ X ] = 0, segue que Cov( X, g( X )) = E[ Xg( X )]. Denotando a densidade de X por f ( x ), temos
Z a
Cov( X, g( X )) = xg( x ) f ( x )dx.
−a

Uma maneira de garantir que Cov( X, g( X )) = 0 é exigir que g( x ) seja uma função par. Assim,
xg( x ) f ( x ) será uma função ímpar e a integral em (− a, a) se anulará, ou seja,
Z a
xg( x ) f ( x )dx = 0.
−a

Portanto, Cov( X, f ( X )) = 0 e como Y = g( X ), teremos que ambas são dependentes.


Dessa forma, podemos concluir que a distribuição precisa de X não afeta a condição, desde que p( x )
seja simétrica em torno da origem. Qualquer função par f (·) satisfará Cov( X, f ( X )) = 0.

A covariância é uma forma bilinear simétrica e semi-definida positiva, com as seguintes pro-
priedades:

• Simetria: Cov( X, Y ) = Cov(Y, X ) para quaisquer variáveis X e Y.

• Bilinearidade: Cov( X + X ′ , Y ) = Cov( X, Y ) + Cov( X ′ , Y ) e Cov( aX, Y ) = a Cov( X, Y ) para


qualquer a ∈ R.

• Semi-definida positiva: Cov( X, X ) = Var[ X ] ≥ 0 para qualquer variável X.

Além disso, vale a desigualdade de Cauchy-Schwarz, que afirma que para variáveis X e Y
com variância finita, q
|Cov( X, Y )| ≤ Var[ X ] Var[Y ].

Perceba a semelhança do resultado acima com a desigualdade de Cauchy-Schwarz!

Exercício 5. Prove os resultados acima.

A matriz de covariância de um vetor de variáveis aleatórias X = ( X1 , . . . , X p ) é a matriz em


Rn × ndenotada por C(X) e definida por
h i
C(X) = E (X − E[X])(X − E[X])⊤ .

Portanto, C(X) é a matriz cujos elementos são Cov( Xi , X j ). Além disso, é imediato mostrar
que
C(X) = E[XX⊤ ] − E[X] E[X]⊤ .
14 CAPÍTULO 2. ELEMENTOS BÁSICOS DE PROBABILIDADE
2.5 Desigualdades básicas de concentração

Nesta seção, apresentamos duas desigualdades fundamentais que estabelecem limites superiores
para a probabilidade de uma variável aleatória assumir valores distantes de sua média. Tais
resultados são amplamente utilizados em probabilidade, estatística e teoria da informação para
analisar o comportamento de caudas de distribuições.
A primeira delas é a Desigualdade de Markov, que fornece um limite simples para variáveis
aleatórias não-negativas em função apenas de sua esperança.

Teorema 1 (Desigualdade de Markov). Seja X uma variável aleatória não-negativa (X ≥ 0 quase


certamente) com valor esperado E[ X ] < ∞. Então, para todo t > 0, temos:

E[ X ]
P( X ≥ t ) ≤ .
t
Exercício 6. Prove a desigualdade de Markov. Dica: use o fato de que x
t ≥ I { x ≥ t }.

A próxima desigualdade é um refinamento da anterior. Conhecida como Desigualdade de


Chebyshev, ela aplica a desigualdade de Markov à variável aleatória ( X − µ)2 e relaciona o desvio
da média com a variância da distribuição.

Teorema 2 (Desigualdade de Chebyshev). Seja X uma variável aleatória com valor esperado µ = E[ X ]
e variância finita Var( X ) = σ2 . Então, para todo ε > 0, vale:

σ2
P(| X − µ| ≥ ε) ≤ .
ε2

Exercício 7. Prove a desigualdade de Chebyshev a partir da desigualdade de Markov aplicada a ( X − µ)2 .

2.6 Teoremas assintóticos

Em muitas aplicações de probabilidade e estatística, estamos interessados no comportamento de


sequências de variáveis aleatórias quando o número de observações tende ao infinito. Os teoremas
assintóticos fornecem resultados fundamentais que descrevem como certos estimadores ou somas
de variáveis aleatórias se comportam no limite, ou seja, quando o tamanho da amostra n cresce
indefinidamente.

Teorema 3 (Lei Fraca dos Grandes Números). Seja ( Xn )n∈N uma sequência de variáveis aleatórias
independentes, todas com a mesma esperança µ e variância σ2 < ∞. Definindo a média amostral por

1 n
n i∑
Xn = Xi ,
=1

então, para qualquer ε > 0,


lim P

X n − µ ≥ ε = 0.
n→∞

Exercício 8. Prove a Lei Fraca dos Grandes números utilizando a desigualdade de Chebyshev.
2.6. TEOREMAS ASSINTÓTICOS 15
Teorema 4 (Teorema Central do Limite). Seja X1 , . . . , Xn uma sequência de variáveis aleatórias i.i.d.
com esperança µ, variância σ2 e momento de ordem 3 finito. Definimos a média amostral como

1 n
n i∑
Xn = Xi .
=1

Então, √
n( X n − µ) d
−→ N (0, 1).
σ
Demonstração. Suponha, sem perda de generalidade, que µ = 0 e σ = 1. Defina

1 n 1 n
A n = √ ∑ Xi e Bn = √ ∑ Ni ,
n i =1 n i =1

i.i.d.
onde Ni ∼ N (0, 1) independentes de tudo. Note que Bn ∼ N (0, 1) para todo n.
d
Para provar que An → N (0, 1), é suficiente mostrar que, para qualquer função de teste f
suave e com crescimento controlado,

E[ f ( An )] − E[ f ( Bn )] −→ 0.

Passo 1: Construção telescópica. Considere as variáveis intermediárias


(0)
Cn = √1 ( X1 + X2 + · · · + X n ) ,
n
(1)
Cn = √1 ( N1 + X2 + · · · + X n ) ,
n
(2)
Cn = √1 ( N1 + N2 + X3 + · · · + Xn ),
n
..
.
(n)
Cn = √1 ( N1 + N2 + · · · + Nn ).
n

(0) (n)
Claramente, Cn = An e Cn = Bn .
Assim,

(0) (n)
E[ f ( An )] − E[ f ( Bn )] = E[ f (Cn )] − E[ f (Cn )]
n
= ∑ ∆k ,
k =1

onde
( k −1) (k)
∆k := E[ f (Cn ) − f (Cn )].
(k) ( k −1)
Passo 2: Isolando o termo que difere. Entre Cn e Cn , o único termo diferente é o k-ésimo.
Definamos
(k)
√1

Dn = n
N1 + · · · + Nk−1 + 0 + Xk+1 + · · · + Xn ,
(k) ( k −1)
isto é, a parte comum entre Cn e Cn , mas com o k-ésimo termo anulado.
Assim,
(k) (k) Nk ( k −1) (k) Xk
Cn = Dn + √
n
, Cn = Dn + √
n
.
16 CAPÍTULO 2. ELEMENTOS BÁSICOS DE PROBABILIDADE
Portanto, h    i
(k) Xk (k) Nk
∆ k = E f Dn + √
n
− f Dn + √
n
.
(k)
Passo 3: Expansão de Taylor condicional. Fixe Dn = d. Aplicando Taylor em torno de d, temos:
Xk2 ′′ Xk3
 
Xk Xk ′
f d+ √ n
= f ( d ) + √
n
f ( d ) + 2n f ( d ) + 6n3/2
f (3) ( d + ξ X ) ,
N2 Nk3
 
Nk
f d+ √ n
= f (d) + √Nnk f ′ (d) + 2nk f ′′ (d) + 6n3/2 f (3) ( d + ξ N ) ,
√ √
para alguns ξ X , ξ N entre 0 e Xk / n ou Nk / n.
Subtraindo,
   
Xk Nk
f d+ √ n
− f d + √
n
= √1n f ′ (d)( Xk − Nk ) + 1 ′′ 2
2n f ( d )( Xk − Nk2 ) + Rk (d),

onde  
Rk (d) = 1
6n3/2
Xk3 f (3) (d + ξ X ) − Nk3 f (3) (d + ξ N ) .
Passo 4: Tomando esperança condicional. Voltamos para
h    i
(k) Xk (k) Nk
∆ k = E f Dn + √ n
− f Dn + √
n
.
(k)
Usando a decomposição anterior e condicionando em Dn , temos:
h i
(k)
∆k = E √1n f ′ ( Dn )( Xk − Nk )
h i
1 ′′ (k)
+ E 2n f ( Dn )( Xk − Nk )
2 2

+ E[ R k ].
(k)
Agora, como Xk e Nk são independentes de Dn , obtemos:
(k) (k)
E[ f ′ ( Dn )( Xk − Nk )] = E[ f ′ ( Dn )] · (E[ Xk ] − E[ Nk ]) = 0,
(k) (k)
E[ f ′′ ( Dn )( Xk2 − Nk2 )] = E[ f ′′ ( Dn )] · (E[ Xk2 ] − E[ Nk2 ]) = 0.

Portanto, só resta
∆ k = E[ R k ].
Passo 5: Controle do resto. Do termo Rk , temos
1  
| Rk | ≤ 3/2 | Xk |3 sup | f (3) | + | Nk |3 sup | f (3) | .
6n
Tomando esperança,
C
|E[ Rk ]| ≤ 3/2 E[| X1 |3 ] + E[| N1 |3 ] ,

n
1 ( 3 )
onde C = 6 sup | f |.
Somando sobre k,
n
C  
∑ ∆k E[| X1 |3 ] + E[| N1 |3 ] = O √1n → 0.

≤ n·
k =1
n3/2
Logo,
E[ f ( An )] − E[ f ( Bn )] → 0,
d
e como Bn ∼ N (0, 1) para todo n, segue que An → N (0, 1).
Capítulo 3

Variáveis discretas e como simulá-las

O ponto de partida do nosso curso será sempre o mesmo: só podemos utilizar variáveis unifor-
mes para gerar todas as demais distribuições. Ou seja, assumimos que temos disponível uma
variável aleatória
U ∼ Uniforme(0, 1),

e a partir dela construiremos algoritmos para simular outras variáveis.


A propriedade fundamental dessa variável é:

P( a < U < b) = b − a, 0 ≤ a < b ≤ 1.

Isto é, a probabilidade de U cair em um subintervalo do intervalo (0, 1) é igual ao comprimento


desse subintervalo.

Exercício 9. Seja U ∼ Uniforme(0, 1). Mostre que, para quaisquer números 0 ≤ a < b ≤ 1,

P( a < U < b) = b − a.

Para variáveis discretas, essa ideia pode ser usada da seguinte forma: suponha que X assuma
valores x1 , x2 , . . . , xm com probabilidades p1 , p2 , . . . , pm , onde
m
p k = P( X = x k ), pk ≥ 0, ∑ pk = 1.
k =1

Definimos as probabilidades acumuladas

k
Fk = ∑ pi , k = 1, . . . , m.
i =1

Então, o algoritmo de simulação é:

1. Gerar U ∼ Uniforme(0, 1);

2. Encontrar o menor índice k tal que U ≤ Fk ;

3. Retornar X = xk .

17
18 CAPÍTULO 3. VARIÁVEIS DISCRETAS E COMO SIMULÁ-LAS
A propriedade P( a < U < b) = b − a garante que

P( X = x k ) = p k .

De forma intuitiva, dividimos o intervalo (0, 1) em subintervalos consecutivos de compri-


mentos pk . Ao sortearmos U ∼ Uniforme(0, 1), o valor de X será aquele correspondente ao
subintervalo no qual U cair. Esse procedimento é conhecido como método da inversão para variá-
veis discretas.
A Figura 3.1 ilustra esse processo para uma variável Bernoulli.

Figura 3.1: Particionamento do intervalo (0, 1) para simular uma variável Bernoulli com p = 0.7.
Sorteia-se U ∼ Uniforme(0, 1); se U cair na região azul, definimos X = 0, e caso contrário, X = 1.

A mesma ideia se aplica quando o conjunto de valores possíveis de X é infinito (ou muito
grande). Nesse caso, o intervalo (0, 1) é particionado em uma sequência de subintervalos, cada
um correspondente a um valor de X, como ilustrado na Figura 3.2.

Figura 3.2: Particionamento do intervalo (0, 1) para simular uma variável discreta com suporte
infinito.

O nome método da inversão vem do fato de que a simulação utiliza a função de distribuição
acumulada (CDF) e sua inversa generalizada. Seja X uma variável aleatória com CDF F ( x ). Então,
se U ∼ Uniforme(0, 1), vale que
X = F −1 (U ) ,
onde a inversa generalizada é definida por

F −1 (u) = min{ x : F ( x ) ≥ u}, 0 < u < 1.

No caso discreto, isto corresponde exatamente ao passo do algoritmo em que escolhemos o


menor k tal que U ≤ Fk . Ou seja, sorteamos U, e depois “invertemos” a CDF para recuperar uma
realização de X na sua escala original.
3.1. VARIÁVEIS COM SUPORTE FINITO 19

Esse procedimento pode parecer um pouco abstrato neste momento, já que a noção de inversa
de uma função acumulada fica mais clara quando lidamos com variáveis contínuas. Por isso,
retornaremos a esse método mais adiante, ao estudarmos a simulação de variáveis contínuas via
inversão. Antes, porém, vale formalizar essa ideia de maneira geral.

Exercício 10. Seja X uma variável aleatória com função de distribuição acumulada FX . Considere U ∼
Uniforme(0, 1) e defina

Y = FX−1 (U ), onde FX−1 (u) = min{ x : FX ( x ) ≥ u}.

Prove que Y tem a mesma distribuição que X.

Esse resultado mostra que, a partir de uma variável uniforme, podemos simular qualquer
outra distribuição usando a CDF e sua inversa generalizada. Com essa ferramenta em mãos,
passamos agora ao estudo de algumas distribuições discretas fundamentais, que servirão de
exemplo concreto dessa ideia.

3.1 Variáveis com suporte finito


Comecemos com o caso em que X assume um número finito de valores x1 , x2 , . . . , xm , cada um
com probabilidade p j = P( X = x j ).
Por exemplo, suponha que

p1 = 0.20, p2 = 0.15, p3 = 0.25, p4 = 0.40.

Uma maneira direta de simular X é gerar U ∼ Uniforme(0, 1) e aplicar:

• Se U < 0.20, definir X = 1 e pare;

• Se U < 0.35, definir X = 2 e pare;

• Se U < 0.60, definir X = 3 e pare;

• Caso contrário, definir X = 4.

Embora possamos reordenar os testes para tornar a verificação mais eficiente, a ideia central
permanece a mesma: dividir o intervalo (0, 1) em partes de comprimentos p j e identificar onde
U caiu.
20 CAPÍTULO 3. VARIÁVEIS DISCRETAS E COMO SIMULÁ-LAS

De forma geral, se X é uma variável com suporte finito S = { x1 , x2 , . . . , xm }, sua distribuição


é completamente determinada pela função de probabilidade

p X ( x k ) = P( X = x k ), xk ∈ S,

a qual satisfaz
p X (k) ≥ 0 para todo k ∈ S, ∑ pX (k) = 1.
k∈S

Exemplo 2. Seja S = { x1 , x2 , . . . , xK } um conjunto de K valores distintos. Dizemos que X tem distri-


buição uniforme discreta em S quando
1
p X ( xi ) = , i = 1, 2, . . . , K.
K
Nesse caso, cada valor é igualmente provável e temos
K K
1
∑ p X ( xi ) = ∑K = 1.
i =1 i =1

Um caso especial é a uniforme discreta nos inteiros 1, 2, . . . , n, em que


1
P( X = j ) = , j = 1, . . . , n.
n
Neste cenário, o método se torna extremamente simples: basta gerar U ∼ Uniforme(0, 1) e definir

X = ⌊nU ⌋ + 1,

onde ⌊ x ⌋ indica a parte inteira de x (maior inteiro menor ou igual a x).


De fato, X = j se e somente se j − 1 ≤ nU < j, o que ocorre com probabilidade n1 . Variáveis
uniformes discretas são particularmente importantes em simulação, pois permitem gerar inteiros
equiprováveis de forma extremamente eficiente.

3.2 Bernoulli
A distribuição de Bernoulli modela experimentos com dois resultados possíveis, tipicamente
denominados “sucesso” (valor 1) e “fracasso” (valor 0). Dizemos que X ∼ Bernoulli( p) se

P( X = 1) = p e P( X = 0) = 1 − p,
3.3. DISTRIBUIÇÃO BINOMIAL 21
onde 0 ≤ p ≤ 1 representa a probabilidade de sucesso.
A função de probabilidade (pmf) pode ser escrita de forma compacta como

p X ( k ) = p k (1 − p )1− k , k ∈ {0, 1}.

As principais características dessa distribuição são:

E[ X ] = p, Var( X ) = p(1 − p).

Exercício 11. Prove as propriedades acima, isto é, calcule a esperança e a variância de uma variável
Bernoulli.

No contexto de simulação, a Bernoulli é um caso particular da uniforme discreta em {0, 1}


com probabilidades 1 − p e p, respectivamente. O algoritmo é simples: sorteamos U ∼ Uniforme(0, 1)
e definimos 
1, se U ≤ p,
X=
0, caso contrário.

Exercício 12. Mostre que o procedimento acima gera corretamente uma variável Bernoulli, isto é, verifique
que P( X = 1) = p e P( X = 0) = 1 − p.

3.3 Distribuição binomial


A distribuição binomial modela o número de sucessos em n repetições independentes de um
experimento de Bernoulli com probabilidade de sucesso p.
Sejam X1 , X2 , . . . , Xn variáveis aleatórias independentes, todas com distribuição Bernoulli( p).
Definimos
n
X= ∑ Xi .
i =1

Nesse caso, dizemos que X ∼ Binomial(n, p), cuja função de probabilidade é


 
n k
P( X = k ) = p (1 − p)n−k , k = 0, 1, . . . , n.
k
As principais propriedades são:

E[ X ] = np, Var( X ) = np(1 − p).

Exercício 13. Prove as propriedades acima.

3.3.1 Simulando via Bernoullis

Uma forma simples e direta de simular uma variável aleatória binomial é a partir de variáveis de
Bernoulli independentes.
Recorde que se X ∼ Binomial(n, p), então X pode ser escrito como
n
X= ∑ Bi ,
i =1
22 CAPÍTULO 3. VARIÁVEIS DISCRETAS E COMO SIMULÁ-LAS
onde B1 , B2 , . . . , Bn são variáveis independentes e identicamente distribuídas, cada uma com

Bi ∼ Bernoulli( p).

Assim, o algoritmo de simulação da binomial segue naturalmente:

1. Para i = 1, . . . , n, gerar Bi ∼ Bernoulli( p);

2. Retornar X = ∑in=1 Bi .

Em outras palavras, uma variável binomial conta o número de sucessos em n tentativas inde-
pendentes, cada uma com probabilidade de sucesso p. Portanto, simular uma binomial se reduz
a repetir n vezes o procedimento de simulação da Bernoulli e somar os resultados.

3.3.2 Simulando via identidade recursiva

Uma alternativa mais eficiente utiliza o método da inversão, aproveitando a identidade recursiva
da função massa de probabilidade da Binomial.
Se X ∼ Binomial(n, p), então
 
n i
P( X = i ) = p (1 − p ) n −i , i = 0, 1, . . . , n.
i

Essas probabilidades satisfazem uma relação de recorrência simples. De fato, começando em


 
n
P( X = i + 1) = p i +1 (1 − p ) n − i −1 ,
i+1

observamos que 1

n−i n−i n
   
n n! n!
= = = .
i+1 ( i + 1) ! ( n − i − 1) ! i + 1 i! (n − i )! i+1 i
Substituindo essa relação,

n−i n
 
P( X = i + 1) = p i +1 (1 − p ) n − i −1 .
i+1 i

Reorganizando,
n−i p
P( X = i + 1) = · P( X = i ).
i+1 1− p
Assim, conhecendo P( X = 0) = (1 − p)n , podemos calcular P( X = 1), P( X = 2), . . . de
forma recursiva, sem reavaliar coeficientes binomiais nem potências.
Isso leva ao seguinte algoritmo de simulação via inversão:

1. Gerar U ∼ Uniforme(0, 1);


1 Por exemplo, se n = 10, i = 6 e i + 1 = 7, então

10! 10! · 4 10! 4


= =
7! 3! 7 · 6! · 4 · 3! 6! · 4! 7
3.3. DISTRIBUIÇÃO BINOMIAL 23

2. Inicializar o índice i = 0, a probabilidade atual pi = (1 − p)n e a soma acumulada F = pi ;

3. Enquanto U > F, atualizar

n−i p
p i +1 = · pi , i ← i + 1, F ← F + pi ;
i+1 1− p

4. Retornar X = i.

Esse procedimento verifica primeiro se X = 0, depois se X = 1, e assim por diante, até


encontrar o valor de X sorteado. Em média, o número de passos necessários é aproximadamente
1 + np, o que pode ser bem mais eficiente do que gerar n variáveis de Bernoulli quando n é
grande.

Exemplo 3. Considere n = 5 e p = 0.3. Temos P( X = 0) = (1 − 0.3)5 = 0.16807. Suponha que


geramos U = 0.4. Como U > 0.16807, passamos ao próximo valor:

5 − 0 0.3
p1 = · · 0.16807 ≈ 0.36015, F = 0.16807 + 0.36015 = 0.52822.
1 0.7
Agora U = 0.4 < F, logo o algoritmo retorna X = 1.
Portanto, neste caso específico, o sorteio resultou em exatamente um sucesso entre as cinco tentativas.

3.3.3 Aspectos computacionais

A escolha do método para simular variáveis binomiais tem implicações diretas em termos de
eficiência. Dois fatores fundamentais influenciam o desempenho: o número de tentativas n e a
probabilidade de sucesso p.
No método da soma de Bernoullis, o custo de cada amostra é proporcional a n, já que é
necessário realizar n sorteios independentes. Esse custo não depende do valor de p: tanto para
valores pequenos quanto grandes de p, o algoritmo precisa sempre gerar todas as n Bernoullis.
Já no método da inversão recursiva, o número médio de passos é da ordem de 1 + np, pois o
procedimento acumula probabilidades até ultrapassar o valor sorteado U. Quando p é pequeno,
24 CAPÍTULO 3. VARIÁVEIS DISCRETAS E COMO SIMULÁ-LAS
o valor típico da variável X também é pequeno, e o algoritmo tende a parar cedo, podendo ser
competitivo em relação à soma de Bernoullis. Por outro lado, quando p é moderado ou grande, o
valor esperado np cresce e, com ele, o número de passos, tornando a inversão significativamente
mais lenta.

Figura 3.3: Comparação de tempo de execução (em segundos) entre o método da inversão recur-
siva e a soma de Bernoullis para n = 100 e N = 2000 amostras, variando p.

A Figura 3.3 ilustra essa comparação em implementações com loops explícitos, para n = 100
e diferentes valores de p. Enquanto o tempo da soma de Bernoullis cresce linearmente apenas
com n e não é afetado por p, o tempo do método da inversão cresce proporcionalmente a np,
aumentando de forma acentuada à medida que p se aproxima de 1. Na prática, bibliotecas como
NumPy utilizam algoritmos especializados para a binomial, ainda mais rápidos do que ambos
os métodos discutidos aqui, de modo que a utilidade principal desses algoritmos é didática e
comparativa, permitindo compreender os diferentes custos computacionais associados a cada
abordagem.

3.3.4 Número médio de passos em algoritmos de inversão recursiva

Nos algoritmos recursivos de inversão, a lógica é sempre a mesma: dado um número aleatório
U ∼ Uniforme(0, 1), acumulamos as probabilidades da distribuição até que a soma ultrapasse
U. O valor de X sorteado é exatamente o índice k em que essa condição se verifica pela primeira
vez.
Assim, se o valor sorteado é X = k, o algoritmo precisou verificar todos os valores 0, 1, 2, . . . , k −
1 e só então aceitou k. Isso significa que o número total de passos é

S = k + 1.

Como X é a variável aleatória que estamos simulando, temos

E[S] = E[ X + 1] = E[ X ] + 1.
3.4. DISTRIBUIÇÃO GEOMÉTRICA 25
Esse resultado é geral para qualquer algoritmo de inversão recursiva que inicie a busca no
valor mínimo do suporte e avance de forma sequencial. No caso da binomial X ∼ Bin(n, p), por
exemplo, o número esperado de passos é

E[S] = 1 + np,

uma vez que E[ X ] = np.


Portanto, o custo médio do algoritmo está diretamente ligado ao valor esperado da distri-
buição sorteada: distribuições concentradas em valores pequenos produzem simulações muito
rápidas, enquanto distribuições centradas em valores grandes exigem proporcionalmente mais
passos.

3.4 Distribuição geométrica


A distribuição geométrica modela o número de ensaios de Bernoulli até a ocorrência do primeiro
sucesso. Seja p a probabilidade de sucesso em cada tentativa, com 0 < p ≤ 1. Definimos X como
o número de ensaios necessários até o primeiro sucesso. Dizemos que X ∼ Geom( p) se

P( X = k ) = (1 − p)k−1 p, k = 1, 2, 3, . . .

Nesse caso:
1 1− p
E[ X ] = , Var( X ) = .
p p2
Exercício 14. Prove que a função de probabilidade acima satisfaz ∑∞
k =1 P( X = k ) = 1.

Exercício 15. Prove as propriedades acima.

3.4.1 Simulando via Bernoullis

A distribuição geométrica modela o número de tentativas até a ocorrência do primeiro sucesso,


em uma sequência de experimentos de Bernoulli independentes com probabilidade p ∈ (0, 1) de
sucesso. Essa definição leva naturalmente a um algoritmo de simulação baseado em Bernoullis.
A ideia é repetir experimentos de Bernoulli até obter sucesso pela primeira vez:

1. Inicializar o contador X ← 1;

2. Gerar B ∼ Bernoulli( p);

3. Enquanto B = 0, repetir:

• X ← X + 1;
• Gerar novo B ∼ Bernoulli( p);

4. Retornar X.

Note que esse procedimento reflete exatamente a definição da variável: contar quantas tenta-
tivas são necessárias até que ocorra o primeiro sucesso.
26 CAPÍTULO 3. VARIÁVEIS DISCRETAS E COMO SIMULÁ-LAS
Exemplo 4. Se p = 0.3, então a probabilidade de obter um sucesso logo na primeira tentativa é 0.3. Se a
primeira tentativa falha, a segunda terá chance 0.3, e assim por diante.
Suponha que, ao simular, os primeiros valores de Bernoulli gerados foram 0, 0, 1. Isso indica duas falhas
seguidas e um sucesso na terceira tentativa. Portanto, o algoritmo retorna X = 3.

3.4.2 Simulando a geométrica via inversão

A função de distribuição acumulada é

P( X ≤ j) = 1 − P( X > j) = 1 − P(primeiras j tentativas são falhas) = 1 − (1 − p) j .

Assim, podemos usar o método da inversão para gerar X. Seja U ∼ Uniforme(0, 1). Definimos
X = j se
1 − (1 − p ) j −1 ≤ U < 1 − (1 − p ) j ,
ou seja,
(1 − p ) j < 1 − U ≤ (1 − p ) j −1 ,
o que equivale a
X = min{ j : (1 − p) j < 1 − U }.

Como 0 < 1 − p < 1, temos log(1 − p) < 0. Aplicando logaritmos,

(1 − p ) j < 1 − U ⇐⇒ j log(1 − p) < log(1 − U ).

Logo,
n log(1 − U ) o
X = min j : j > .
log(1 − p)
Portanto, obtemos a fórmula fechada
log(1 − U )
 
X = + 1.
log(1 − p)
Como 1 − U ∼ Uniforme(0, 1), podemos substituir 1 − U por U sem perda de generalidade,
resultando em  
log(U )
X = + 1.
log(1 − p)
Exemplo 5. Considere uma variável geométrica X ∼ Geom( p) com p = 0.3 e seja U = 0.52 uma
realização de uma variável uniforme (0, 1). Usando a fórmula fechada da inversão, temos
log(1 − U )
 
X = + 1,
log(1 − p)
3.5. DISTRIBUIÇÃO DE POISSON 27
e, substituindo os valores, obtemos
 
log(0.48)
X = + 1 ≈ ⌊2.06⌋ + 1 = 3.
log(0.7)

Outra forma é aplicar a inversão direta da CDF, que é dada por

F ( j ) = P( X ≤ j ) = 1 − (1 − p ) j .

Procuramos o menor j tal que F ( j) ≥ U. Para p = 0.3, temos

F (1) = 0.3, F (2) = 0.51, F (3) ≈ 0.657.

Como F (2) = 0.51 < U = 0.52 mas F (3) = 0.657 ≥ 0.52, o menor j que satisfaz é j = 3.

3.5 Distribuição de Poisson


A distribuição de Poisson modela o número de ocorrências de um evento em um intervalo fixo
de tempo ou espaço, assumindo que tais ocorrências sejam raras e independentes.
Dizemos que X ∼ Poisson(λ) se sua função de probabilidade for

e−λ λk
P( X = k ) = , k = 0, 1, 2, . . . ,
k!
onde λ > 0 representa a taxa média de ocorrências no intervalo considerado.
A média e a variância são dadas por

E[ X ] = λ, Var( X ) = λ.

Exercício 16. Prove que ∑∞


k =0 P( X = k ) = 1.

Exercício 17. Prove as propriedades acima. Dica: para a variância, calcule primeiro E[ X ( X − 1)] e use o
fato de que
2
Var( X ) = E[ X ( X − 1)] + E[ X ] − E[ X ] .
28 CAPÍTULO 3. VARIÁVEIS DISCRETAS E COMO SIMULÁ-LAS
3.5.1 Simulação a Poisson via inversão e recursão

Seja X ∼ Poisson(λ). A função de probabilidade é

λi
P( X = i ) = e − λ , i = 0, 1, 2, . . .
i!
e essa expressão satisfaz a relação de recorrência

λ
P( X = i + 1) = P( X = i ).
i+1
i +1
Para ver isso, basta observar que P( X = i + 1) = e−λ (iλ+1)! . Separando um fator λ/(i + 1),
i
obtemos P( X = i + 1) = i+λ1 e−λ λi! , que nada mais é do que i+λ1 P( X = i ). Assim, conhecendo
p0 = P( X = 0) = e−λ , é possível calcular recursivamente p1 = λp0 , depois p2 = (λ/2) p1 , e
assim sucessivamente. Esse raciocínio evita a recomputação de fatoriais a cada passo e fornece
um procedimento numericamente mais estável.
O algoritmo clássico para gerar uma variável de Poisson com parâmetro λ funciona da se-
guinte maneira:

1. Gerar U ∼ Uniforme(0, 1);

2. Inicializar i = 0, p0 = e−λ e F = p0 ;

3. Enquanto U > F, atualizar

λ
i ← i + 1, pi ← p i −1 , F ← F + pi ;
i

4. Retornar X = i.

Esse procedimento verifica primeiro se X = 0, depois se X = 1, e assim por diante, até


encontrar o valor sorteado. O número médio de passos necessários é 1 + λ, de modo que o
algoritmo é eficiente para λ pequeno, mas se torna custoso para valores grandes de λ.

Exemplo 6. Considere λ = 3 e suponha que o número aleatório gerado seja U = 0.35.

• Primeiro, calculamos p0 = e−3 ≈ 0.0498 e F = p0 ≈ 0.0498. Como U = 0.35 > F, avançamos


para o próximo valor.

• Calculamos p1 = 13 p0 ≈ 0.1494 e atualizamos F ≈ 0.0498 + 0.1494 = 0.1992. Ainda temos


U = 0.35 > F, logo seguimos adiante.

• Agora p2 = 32 p1 ≈ 0.2240 e F ≈ 0.1992 + 0.2240 = 0.4232. Como U = 0.35 < F, o algoritmo


para aqui e retornamos X = 2.

Portanto, neste exemplo, o valor simulado da variável aleatória foi X = 2.


3.5. DISTRIBUIÇÃO DE POISSON 29

3.5.2 Algoritmo melhorado

Uma forma mais eficiente de implementar o método é iniciar a busca em torno do valor mais
provável da variável, que está próximo de λ. Seja m = ⌊λ⌋. Calcula-se a probabilidade acumulada

F ( m ) = P( X ≤ m ),

usando a recorrência das probabilidades. Em seguida, gera-se U ∼ Uniforme(0, 1) e procede-se


assim:

• se U < F (m), faz-se a busca recursiva para baixo (m − 1, m − 2, . . .);

• se U ≥ F (m), faz-se a busca recursiva para cima (m + 1, m + 2, . . .).

Note que a mesma identidade recursiva que relaciona P( X = i + 1) a P( X = i ) também pode


ser escrita no sentido inverso:
i+1
P( X = i ) = P( X = i + 1).
λ
Assim, a partir de pm = P( X = m), é possível atualizar as probabilidades tanto para cima quanto
para baixo, sem necessidade de recalcular fatoriais. Isso garante que a busca em torno de m seja
realizada de forma eficiente, explorando o valor sorteado em ambas as direções.
Neste caso, o número de passos não depende mais diretamente de X, mas sim da distância
entre X e λ: para localizar o valor sorteado, precisamos primeiro verificar m, e depois avançar
| X − m| passos adicionais. Assim, o número de passos é

T = 1 + | X − m |.
30 CAPÍTULO 3. VARIÁVEIS DISCRETAS E COMO SIMULÁ-LAS
Como m ≈ λ, o custo médio pode ser aproximado por

E[ T ] = 1 + E[| X − λ|].

3.5.3 Relação com a binomial

A distribuição de Poisson pode ser vista como um caso limite da distribuição binomial.
Seja X ∼ Binomial(n, p), que modela o número de sucessos em n tentativas independentes,
cada uma com probabilidade p de sucesso. Suponha agora que

n → ∞, p → 0, de modo que λ = np permaneça constante.

Nesse regime, dizemos que a binomial entra no chamado limite de Poisson, e temos

d
Binomial(n, p) −
→ Poisson(λ).

A função de probabilidade da binomial é

 
n k
P( X = k ) = p (1 − p ) n − k .
k

Substituindo p = λ/n, obtemos

λ n−k
   k  
n λ
P( X = k ) = 1− .
k n n

Para analisar o limite, consideramos cada fator separadamente. O coeficiente binomial pode
ser escrito como
n ( n − 1) · · · ( n − k + 1)
 
n
= .
k k!
Dividindo numerador e denominador por nk , temos

n k n ( n − 1) · · · ( n − k + 1) nk n n − 1 n−k+1
 
n
= · k
= · ··· .
k k! n k! n n n
3.6. DISTRIBUIÇÃO BINOMIAL NEGATIVA 31
Cada termo do produto no numerador pode ser escrito como
n−j j
= 1− , j = 0, 1, . . . , k − 1,
n n
e portanto
nk k−1
      
n 1 2
= · 1− 1− ··· 1− .
k k! n n n
Quando n → ∞, cada termo do produto tende a 1, de modo que
nk
 
n
∼ .
k k!
Além disso,
 n  −k
λ −λ λ
1− −→ e , 1− −→ 1
n n
Juntando os três resultados, obtemos
 k
nk λ λk −λ
P( X = k ) ∼ e−λ · 1 = e .
k! n k!
Portanto,
e−λ λk
lim P( X = k ) =
,
n→∞ k!
que é exatamente a função de massa de probabilidade da distribuição Poisson(λ).

3.6 Distribuição binomial negativa


Seja X o número de ensaios necessários para obter um total de r sucessos, considerando que cada
ensaio é independente e resulta em sucesso com probabilidade p. Nesse caso, dizemos que X
segue uma distribuição binomial negativa (também chamada Pascal) com parâmetros p e r.
Sua função de probabilidade é dada por:
n−1 r
 
P( X = n ) = p (1 − p) n−r , n = r, r + 1, r + 2, . . .
r−1
Essa fórmula é justificada pelo fato de que, para que sejam necessários exatamente n ensaios
para obter r sucessos, os primeiros n − 1 ensaios devem conter exatamente r − 1 sucessos — o
que ocorre com probabilidade
n − 1 r −1
 
p (1 − p ) n −r
r−1
— e, em seguida, o n-ésimo ensaio deve ser um sucesso, com probabilidade p.
Seja Xi , i = 1, . . . , r, o número de ensaios necessários após o (i − 1)-ésimo sucesso para
obter o i-ésimo sucesso. É fácil ver que X1 , X2 , . . . , Xr são variáveis aleatórias independentes com
distribuição Geom( p). Assim, como

X = X1 + X2 + · · · + X r ,

temos, usando os resultados da distribuição geométrica:


r r
r r (1 − p )
E[ X ] = ∑ E [ Xi ] = p
, Var( X ) = ∑ Var(Xi ) = p2
.
i =1 i =1
32 CAPÍTULO 3. VARIÁVEIS DISCRETAS E COMO SIMULÁ-LAS
Exercício 18. Prove que a função de probabilidade acima é válida, isto é, que ∑∞
n=r P( X = n ) = 1.

Exercício 19. Prove as fórmulas da média e variância usando o fato de que X é a soma de r variáveis
independentes com distribuição Geom( p).

3.6.1 Simulando via Bernoullis

Uma forma direta de gerar uma variável Binomial Negativa é simular sucessivos ensaios de
Bernoulli(p) até obter o r-ésimo sucesso.
De fato, por definição, X representa o número total de ensaios necessários até a ocorrência de
r sucessos. Assim, o algoritmo pode ser descrito da seguinte forma:

1. Inicializar n = 0 (contador de ensaios) e s = 0 (contador de sucessos);

2. Enquanto s < r:

(a) Gerar B ∼ Bernoulli( p);


(b) Atualizar n ← n + 1;
(c) Se B = 1, atualizar s ← s + 1;

3. Retornar X = n.

Esse método é conceitualmente simples e corresponde exatamente à definição da distribuição


Binomial Negativa. No entanto, quando p é pequeno e r é grande, o número esperado de ensaios
E[ X ] = r/p pode ser elevado, tornando o algoritmo computacionalmente mais custoso.

3.6.2 Simulando via soma de geométricas

Recorde que se X ∼ NegBin(r, p), então X pode ser decomposto como

X = X1 + X2 + · · · + X r ,

onde X1 , . . . , Xr são variáveis independentes com

Xi ∼ Geom( p), i = 1, . . . , r,

no suporte {1, 2, . . .} (número de ensaios até o primeiro sucesso).


Assim, podemos simular uma Binomial Negativa somando r geométricas independentes,
cada uma gerada via o método da inversão:

log(1 − Ui )
 
Xi = + 1, Ui ∼ Uniforme(0, 1).
log(1 − p)

O algoritmo de simulação segue:

1. Para i = 1, . . . , r, gerar Xi ∼ Geom( p) via inversão;

2. Retornar X = ∑ri=1 Xi .
3.6. DISTRIBUIÇÃO BINOMIAL NEGATIVA 33
3.6.3 Simulando via inversão recursiva

Outra forma de simular a Binomial Negativa é aplicar diretamente o método da inversão, apro-
veitando a relação de recorrência da sua função de probabilidade.
Se X ∼ NegBin(r, p), então

n−1 r
 
P( X = n ) = p (1 − p ) n −r , n = r, r + 1, r + 2, . . .
r−1

Essas probabilidades satisfazem a seguinte relação recursiva:

P( X = n + 1) n
= (1 − p ).
P( X = n ) n−r+1

Exercício 20. Prove a identidade recursiva acima.

Portanto, conhecendo P( X = r ) = pr , podemos calcular recursivamente as demais probabili-


dades. Isso leva ao seguinte algoritmo:

1. Gerar U ∼ Uniforme(0, 1);

2. Inicializar n = r, pn = pr , F = pn ;

3. Enquanto U > F, atualizar

n
p n +1 = p n · (1 − p ), n ← n + 1, F ← F + p n +1 ;
n−r+1

4. Retornar X = n.

O número esperado de passos T no método recursivo não coincide diretamente com E[ X ],


pois o algoritmo já inicia em n = r, que é o menor valor possível para a variável X ∼ NegBin(r, p).
De fato, se o sorteio resultar em X = n, o número de passos dados pelo algoritmo é

T = (n − r ) + 1,

pois começamos verificando o valor n = r (primeiro passo) e avançamos até alcançar n.


Assim, em termos de valor esperado,

r
E[ T ] = E[ X − r ] + 1 = − r + 1.
p

Esse termo −r aparece porque, embora E[ X ] = r/p, o procedimento de inversão não percorre
todos os valores desde 0, mas já parte de r.
Quando p é pequeno, E[ T ] pode ainda ser bastante grande, tornando o método recursivo
lento. Nessas situações, a versão ingênua baseada na soma de geométricas pode ser mais eficiente
na prática.
34 CAPÍTULO 3. VARIÁVEIS DISCRETAS E COMO SIMULÁ-LAS
3.6.4 Por que o nome “Binomial Negativa”?

O nome Binomial Negativa tem origem na conexão com a expansão binomial para expoentes
negativos. Para um inteiro n ≥ 0 e p + q = 1, o teorema binomial fornece
  n
n k n−k
1 = ( p + q) = ∑ n
p q .
k =0
k

Essa identidade estende-se a expoentes reais (expansão binomial generalizada):



α+k−1
 
(1 − p ) −α
= ∑ k
pk , | p| < 1.
k =0

Tomando α = r ∈ {1, 2, . . .},



r+k−1
 
(1 − p ) −r
= ∑ k
pk .
k =0

Os coeficientes (r+kk−1) são precisamente os que aparecem na parametrização da Binomial Nega-


tiva em termos do número de falhas k antes do r-ésimo sucesso:
r+k−1
 
P (Y = k ) = pr (1 − p ) k , k = 0, 1, 2, . . .
k

Para ver a equivalência com a forma escrita em função do número total de ensaios n, deta-
lhamos a reparametrização. Defina n = r + k (isto é, k = n − r). Então

r+k−1 (r + k − 1) ! ( n − 1) ! n−1
   
= = = .
k k! (r − 1)! ( n − r ) ! (r − 1) ! n−r

Pela simetria binomial, (ba) = ( a−a b); aplicando com a = n − 1 e b = n − r obtemos

n−1 n−1 n−1


     
= = .
n−r ( n − 1) − ( n − r ) r−1

Substituindo k = n − r em P(Y = k ) e usando as igualdades acima,

r + (n − r ) − 1
 
P ( X = n ) = P (Y = n − r ) = p r (1 − p ) n −r
n−r
n−1
 
= p r (1 − p ) n −r , n = r, r + 1, . . .
r−1

Mostramos, assim, passo a passo, que as duas formas da PMF — em função de k (falhas) ou de
n (ensaios) — são exatamente equivalentes; trata-se apenas de uma reparametrização.

3.7 Distribuição hipergeométrica


A distribuição hipergeométrica modela experimentos de seleção sem reposição a partir de uma
população finita contendo dois tipos de elementos. Por exemplo, suponha uma urna com N + M
bolas, das quais N são claras e M são escuras. Retiramos, de forma aleatória e sem reposição,
uma amostra de tamanho n. Seja X o número de bolas claras na amostra.
3.7. DISTRIBUIÇÃO HIPERGEOMÉTRICA 35
Nesse caso, cada subconjunto de tamanho n é igualmente provável, e a probabilidade de
observar exatamente k bolas claras é
( Nk )(nM
−k )
P( X = k ) = , max(0, n − M ) ≤ k ≤ min(n, N ).
( N +n M)
Dizemos então que X ∼ Hipergeom( N, M, n).
As principais propriedades dessa distribuição são:
N N M N+M−n
E[ X ] = n · , Var( X ) = n · · · .
N+M N+M N+M N+M−1
Exercício 21. Prove que a função de probabilidade acima é válida, isto é, que
min(n, N )
∑ P( X = k ) = 1.
k=max(0, n− M )

Exercício 22. Prove as fórmulas da média e variância acima. Dica: considere o sorteio sequencial das n
bolas e defina Xi como a variável indicadora do evento “a i-ésima bola é clara”. Para a variância, use a
decomposição
n
Var( X ) = ∑ Var(Xi ) + 2 ∑ Cov( Xi , X j ).
i =1 1≤ i < j ≤ n

3.7.1 Simulando a Hipergeométrica

Uma maneira natural de simular X ∼ Hipergeom( N, K, n) é reproduzir o sorteio sem reposição.


Basta imaginar uma população com K sucessos e N − K fracassos, e retirar n elementos dela. O
valor de X será o número de sucessos observados. Isso leva ao seguinte algoritmo:

1. Construir a população formada por K uns (sucessos) e N − K zeros (fracassos);

2. Sortear n elementos dessa população sem reposição;

3. Definir X como a soma dos elementos sorteados;

4. Retornar X.

Para realizar o sorteio sem reposição, podemos usar um procedimento eficiente baseado no
embaralhamento parcial de Fisher–Yates. A ideia é que não precisamos embaralhar toda a população,
apenas selecionar n elementos distintos de forma aleatória. O algoritmo funciona assim:

1. Coloque os elementos da população em um vetor de tamanho N;

2. Para cada posição i = 1, 2, . . . , n:

(a) Sorteie um índice j uniformemente entre i e N;


(b) Troque os elementos das posições i e j.

3. Os n primeiros elementos do vetor agora constituem a amostra sem reposição.

Esse método garante que cada subconjunto de tamanho n tem a mesma probabilidade de ser
escolhido, e é mais eficiente do que embaralhar toda a população.
36 CAPÍTULO 3. VARIÁVEIS DISCRETAS E COMO SIMULÁ-LAS

Figura 3.4: Distribuição Hipergeométrica com parâmetros N = 50 (população total), K = 20


(número de sucessos) e n = 10 (tamanho da amostra).

Tabela de referência

Distribuição Técnica utilizada Dica/Obs


Suporte finito Inversão simples Separar em intervalos
Bernoulli Inversão simples Caso particular do suporte finito com m = 2
Binomial Soma de Bernoullis ou inversão recursiva Relação de recorrência evita coeficientes binomiais
Poisson Inversão recursiva Relação pi+1 = i+λ1 pi evita fatoriais
log(1−U )
Geométrica Inversão direta (CDF) Retornar X = ⌊ log(1− p) ⌋ + 1
Binomial negativa Soma de geométricas ou inversão recursiva Soma de r geométricas independentes
Hipergeométrica Sorteio sem reposição (Fisher–Yates) Selecionar n elementos distintos e contar sucessos
Capítulo 4

Variáveis contínuas e como simulá-las

Nosso objetivo agora é estudar algoritmos para simular variáveis aleatórias contínuas, isto é,
variáveis cuja distribuição é descrita por uma função densidade de probabilidade.
Como no caso discreto, o ponto de partida será sempre o mesmo: assumimos que temos
acesso a uma variável
U ∼ Uniforme(0, 1),
e construiremos a partir dela procedimentos para gerar amostras de outras distribuições.
A principal diferença em relação ao caso discreto é que, para variáveis contínuas, muitas vezes
não é possível escrever a função de distribuição acumulada (CDF) de forma explícita, ou mesmo
obter sua inversa em forma fechada. Com isso, diversos métodos alternativos são necessários.
Neste capítulo, organizamos os métodos de simulação em três grandes grupos:

• Métodos por inversão: funcionam diretamente a partir da CDF da distribuição;

• Métodos por rejeição ou aceitação: baseiam-se em gerar propostas e aceitar com certa
probabilidade;

• Métodos por transformação: aplicam funções determinísticas a variáveis já conhecidas.

4.1 Método da Inversão


O método da inversão é uma das formas mais diretas de simular variáveis aleatórias contínuas.
A ideia central é simples: se conhecemos a função de distribuição acumulada (CDF) F de
uma variável contínua X, e se essa função é estritamente crescente, então podemos inverter F e
definir
X = F −1 (U ), com U ∼ Uniforme(0, 1).

Exemplo 7. Prove o fato acima.

Esse procedimento garante que X terá exatamente a distribuição desejada, pois a probabi-
lidade de X cair em qualquer intervalo será proporcional ao comprimento correspondente no
domínio de U.
Esse método é particularmente útil quando a inversa de F pode ser escrita de forma explícita,
como ocorre com as distribuições Exponencial, Uniforme e Pareto, por exemplo.

37
38 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS
4.1.1 Distribuição exponencial

A distribuição exponencial modela o tempo de espera até a ocorrência de um evento em um


processo de Poisson, isto é, um processo no qual eventos ocorrem de forma contínua e inde-
pendente, a uma taxa constante. Seja λ > 0 a taxa de ocorrência dos eventos. Dizemos que
X ∼ Exponencial(λ) se
f X ( x ) = λe−λx , x ≥ 0.

A função de distribuição acumulada (CDF) é dada por:

FX ( x ) = P( X ≤ x ) = 1 − e−λx , x ≥ 0.

As principais características da distribuição são:

1 1
E[ X ] = , Var( X ) = .
λ λ2
R∞
Exercício 23. Verifique que f X ( x ) é uma densidade de probabilidade, isto é, 0
f X ( x ) dx = 1.

Exercício 24. Prove as expressões da média e variância acima.

A distribuição exponencial é um exemplo clássico onde o método da inversão pode ser apli-
cado diretamente. Sabemos que a CDF é

F ( x ) = 1 − e−λx ,

e queremos encontrar sua inversa, portanto, basta resolver a equação F ( x ) = U, com U ∼


Uniforme(0, 1). Isso nos leva a:

1
1 − e−λx = U ⇒ x=− log(1 − U ).
λ
Como 1 − U ∼ Uniforme(0, 1), podemos reescrever de forma equivalente:

1
X=− log(U ), com U ∼ Uniforme(0, 1).
λ

Assim, o algoritmo para simular uma variável X ∼ Exponencial(λ) via inversão é:

1. Gerar U ∼ Uniforme(0, 1);


1
2. Calcular X = − log(U );
λ
3. Retornar X.

Relação com a distribuição geométrica

A distribuição exponencial pode ser vista como o análogo contínuo da distribuição geométrica.
Na distribuição geométrica, X ∼ Geom( p), interpretamos X como o número de tentativas
independentes até a ocorrência do primeiro sucesso, em uma sequência de ensaios de Bernoulli
com probabilidade p de sucesso.
4.1. MÉTODO DA INVERSÃO 39
A distribuição exponencial, por sua vez, modela o tempo contínuo até a ocorrência de um
evento, sob uma taxa constante λ > 0. Embora uma seja discreta e a outra contínua, existe uma
relação direta entre essas duas distribuições, que pode ser formalizada por um limite.
Seja Xn ∼ Geom( pn ), com pn = λ/n, e defina a variável reescalada

Xn
Tn = .
n
A variável Tn representa o tempo até o primeiro sucesso quando fazemos n tentativas por uni-
dade de tempo, cada uma com probabilidade de sucesso pn = λ/n. À medida que n → ∞, as
tentativas se tornam mais frequentes e individualmente menos prováveis, mas o número espe-
rado de sucessos por unidade de tempo permanece constante: n · pn = λ.
Vamos mostrar que Tn converge em distribuição para uma variável exponencial de parâmetro
λ. De fato, temos:  
Xn
P( Tn > t) = P > t = P( Xn > ⌊nt⌋).
n
Como Xn é geométrica com parâmetro pn = λ/n, segue que:
 ⌊nt⌋
λ
P( Xn > k ) = (1 − p n ) ,
k
logo P( Tn > t) = 1− .
n

Quando n → ∞, vale que ⌊nt⌋ ∼ nt, e obtemos:


 nt
λ
1− −→ e−λt .
n

Portanto,
P( Tn ≤ t) → 1 − e−λt ,

que é a função de distribuição acumulada da exponencial Exp(λ). Isso conclui a demonstração


da convergência.
40 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS
Essa convergência tem uma interpretação intuitiva. Inicialmente, a variável Xn conta o nú-
mero de tentativas até o sucesso. Se cada tentativa leva um tempo fixo de 1/n segundos, então o
tempo total até o sucesso é Tn = Xn /n.
A divisão por n serve justamente para transformar o número de tentativas em tempo contí-
nuo. Por exemplo, se cada tentativa leva 0.01 segundo e o sucesso ocorre na 17ª tentativa, então
o tempo até o sucesso foi 17 × 0.01 = 0.17 segundos.
À medida que n cresce, as tentativas são feitas cada vez mais rapidamente (a cada 1/n uni-
dades de tempo), e a chance de sucesso em cada uma cai proporcionalmente (pn = λ/n). O
resultado final é que o tempo total até o sucesso — Tn — se aproxima de uma variável contínua
exponencial com taxa λ.

Essa relação também pode ser observada diretamente nas fórmulas de inversão utilizadas
para simulação.
Seja U ∼ Uniforme(0, 1). A inversão da CDF da exponencial dá:
1
T=− ln(U ).
λ
Já no caso da geométrica Xn ∼ Geom( pn ), a fórmula de inversão baseada na CDF discreta é:
 
ln(U ) λ
Xn = , com pn = .
ln(1 − pn ) n
Dividindo por n, temos:
Xn 1 ln(U )
Tn = ≈ · .
n n ln(1 − λ/n)
Sabemos que para n grande,
λ
ln(1 − λ/n) ≈ − ,
n
então:
1
Tn ≈ −ln(U ),
λ
o que mostra que, no limite, a fórmula de simulação da geométrica reescalada tende para a
fórmula da exponencial.

Relação com a Poisson

A distribuição exponencial pode ser entendida como o análogo contínuo da distribuição geomé-
trica, e sua relação com a distribuição de Poisson surge naturalmente ao considerarmos divisões
finas de um intervalo fixo em pequenos subintervalos com experimentos de Bernoulli raros.
Considere o intervalo de tempo [0, 1] dividido em n subintervalos de comprimento 1/n. Em
cada subintervalo, ocorre um evento (ou sucesso) com probabilidade pn = λ/n, de forma inde-
pendente. Este é exatamente o modelo da variável binomial

Xn ∼ Binomial(n, λ/n),

que conta o número total de eventos no intervalo. Sabemos que, quando n → ∞,


d
Xn −
→ Poisson(λ).
4.2. MÉTODO DA REJEIÇÃO-ACEITAÇÃO 41
Por outro lado, podemos perguntar: quanto tempo leva até o primeiro evento acontecer? A
resposta a essa pergunta leva à distribuição exponencial.
Seja Xn ∼ Geom( pn ) com pn = λ/n, modelando o número de subintervalos até o primeiro
sucesso. O tempo contínuo correspondente é então

Xn
Tn = .
n
Como visto anteriormente, temos
d
Tn −
→ Exponencial(λ).

Portanto, podemos pensar nessas distribuições da seguinte forma:

• A distribuição Poisson modela o número total de eventos no intervalo.

• A distribuição geométrica modela a posição discreta do primeiro sucesso.

• A distribuição exponencial modela o tempo contínuo até o primeiro evento.

4.2 Método da rejeição-aceitação


Embora o método da inversão funcione muito bem para distribuições cuja função de distribuição
acumulada (CDF) possa ser invertida de forma analítica ou computacionalmente eficiente, ele
se torna inviável em casos como o da distribuição normal padrão. A função de distribuição
acumulada da normal, denotada por Φ( x ), não possui inversa em forma fechada, o que impede
a aplicação direta da fórmula X = Φ−1 (U ). Embora existam aproximações numéricas para Φ−1 ,
elas podem ser computacionalmente custosas ou introduzir erros de arredondamento. Nesses
casos, recorre-se a métodos alternativos que não exigem a inversão da CDF — como o método
da rejeição-aceitação.

O método de aceitação-rejeição é uma técnica geral para gerar variáveis aleatórias com uma
dada densidade f ( x ), partindo de uma densidade auxiliar g( x ) mais simples, da qual é fácil
simular. A ideia central é gerar candidatos a partir de g e aceitá-los com uma certa probabilidade
que depende da razão f ( x )/g( x ).
42 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS
Suponha que desejamos gerar uma variável aleatória X com densidade alvo f ( x ), mas não
dispomos de um método direto para isso. Por outro lado, assumimos que sabemos simular uma
variável Y com densidade auxiliar g( x ), e que existe uma constante c > 0 tal que

f (x)
≤c para todo x.
g( x )

Essa condição garante que a função f está sempre abaixo da curva cg, ou seja, f ( x ) ≤ cg( x )
f (x)
para todo x. Além disso, isso assegura que a razão está sempre entre 0 e 1, podendo ser
cg( x )
interpretada como uma probabilidade de aceitação. Note que, ao integrar ambos os lados da
desigualdade f ( x ) ≤ cg( x ), obtemos f ( x ) dx ≤ cg( x ) dx, ou seja, 1 ≤ c, e portanto 1c ≤ 1.
R R

O procedimento do método de rejeição-aceitação é o seguinte:

1. Gere um candidato Y ∼ g.

2. Gere um número aleatório U ∼ Uniforme(0, 1), independente de Y.


f (Y )
3. Se U < , aceite Y como amostra e retorne X = Y.
cg(Y )
4. Caso contrário, rejeite Y e retorne ao passo 1.

Para entender por que o método de rejeição-aceitação funciona, vamos construir uma intuição
passo a passo com um exemplo concreto. Suponha que queremos gerar uma variável aleatória
X ∼ f , com densidade definida por

f ( x ) = 20x (1 − x )3 , x ∈ [0, 1].

Essa é uma densidade válida sobre o intervalo [0, 1], mas sua função de distribuição acumulada
F ( x ) não possui inversa em forma fechada já que envolve resolver uma equação polinomial de
grau 5, o que inviabiliza o uso direto do método da inversão. Por isso, recorremos ao método de
rejeição.
Nesse caso, utilizamos como densidade auxiliar a uniforme g( x ) = 1 sobre [0, 1], que é fácil
de simular. O procedimento funciona da seguinte forma:

1. Escolhemos uma constante c > 0 tal que f ( x ) ≤ cg( x ) para todo x ∈ [0, 1]. Como g( x ) = 1,
essa condição se torna f ( x ) ≤ c. Para garantir isso, basta determinar o valor máximo da
função f ( x ) no intervalo [0, 1], o que pode ser feito derivando:

f ( x ) = 20x (1 − x )3 = 20x − 60x2 + 60x3 − 20x4 ,

2. Geramos um candidato Y ∼ g, ou seja, escolhemos um ponto Y aleatório uniformemente


em [0, 1].

3. Geramos um valor U ∼ Unif(0, 1), que usaremos para introduzir variabilidade vertical.

4. Calculamos a altura U · cg(Y ). Como g(Y ) = 1, isso equivale a U · c, ou seja, sorteamos um


ponto dentro do retângulo de altura c sobre o intervalo [0, 1].
4.2. MÉTODO DA REJEIÇÃO-ACEITAÇÃO 43
5. Comparamos essa altura com o valor da densidade f (Y ). Se

U · cg(Y ) < f (Y ),

aceitamos o valor Y como amostra de X; caso contrário, rejeitamos e repetimos o processo.

A interpretação geométrica é simples: estamos sorteando pontos aleatórios dentro do retân-


gulo delimitado por x ∈ [0, 1] e altura c. Esses pontos têm coordenadas (Y, U · cg(Y )). Aceitamos
apenas os que caem abaixo da curva f ( x ). Dessa forma, os pontos aceitos se acumulam na região
sob f , replicando a forma da densidade desejada.

Teorema 5. Sejam f e g funções de densidade de probabilidade com suporte em um conjunto X ⊆ R, e


suponha que existe uma constante c > 0 tal que

f (x)
≤c para todo x ∈ X .
g( x )
Considere o algoritmo de geração:

1. Gere Y ∼ g e U ∼ Uniform(0, 1), independentes.


f (Y )
2. Retorne X = Y se U < cg(Y )
. Caso contrário, repita.

Então a variável aleatória X, definida como o primeiro valor Y aceito, possui densidade f . Além disso,
o número total de iterações até a aceitação segue uma distribuição geométrica com parâmetro 1/c.

Demonstração. Seja f a densidade-alvo da qual desejamos amostrar. Usamos uma densidade


f (x)
auxiliar g, com suporte que contém o de f , e uma constante c ≥ supx g(x) .
Queremos mostrar que a variável X aceita tem densidade f . Para isso, analisamos sua função
de distribuição acumulada FX ( x ) = P( X ≤ x ). Pela definição do algoritmo, temos:
 
f (Y )
P Y ≤ x, U < cg(Y )
P( X ≤ x ) = P(Y ≤ x | aceito) =   .
f (Y )
P U < cg(Y )
44 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS
Usamos a fórmula da probabilidade condicional:
  Z  
f (Y ) f (Y )
P Y ≤ x, U < = P Y ≤ x, U < | Y = y g(y) dy
cg(Y ) cg(Y )
 
f (y)
Z
= P y ≤ x, U < | Y = y g(y) dy
cg(y)
Z x  
f (y)
= P U< g(y) dy
−∞ cg(y)
Z x
f (y)
= · g(y) dy
−∞ cg ( y )
1 x
Z
= f (y) dy.
c −∞

De forma análoga:
   
f (Y ) f (Y )
Z
P U< = P U< | Y = y g(y) dy
cg(Y ) cg(Y )
 
f (y)
Z
= P U< | Y = y g(y) dy
cg(y)
 
f (y)
Z
= P U< g(y) dy
cg(y)
f (y)
Z
= · g(y) dy
cg(y)
1 1
Z
= f (y) dy = .
c c
Substituindo numerador e denominador:
1 x
R
c −∞ f ( y ) dy
Z x
P( X ≤ x ) = 1
= f (y) dy = FX ( x ).
c −∞

Portanto, X ∼ f , como queríamos demonstrar.


Além disso, a probabilidade de aceitação em uma única tentativa é dada por:
 
f (Y ) 1
P U< = ,
cg(Y ) c

ou seja, cada tentativa tem probabilidade 1/c de ser aceita. Portanto, o número de repetições até
obter um ponto aceito segue uma distribuição geométrica com parâmetro 1/c.

4.2.1 Distribuição normal

A distribuição normal padrão, denotada por N (0, 1), é uma das distribuições mais importantes
da estatística e da probabilidade. Sua densidade é dada por:

1 2
f ( x ) = √ e− x /2 , x ∈ R.

Ela possui média E[ X ] = 0 e variância Var( X ) = 1.


4.2. MÉTODO DA REJEIÇÃO-ACEITAÇÃO 45
Rx
Como a função de distribuição acumulada Φ( x ) = −∞ f (t) dt não possui inversa fechada,
o método da inversão não pode ser aplicado diretamente. Em vez disso, uma abordagem alter-
nativa é utilizar uma técnica baseada em outra distribuição mais simples, como a exponencial,
combinada com o método de rejeição.
Uma forma eficiente de simular uma variável normal padrão positiva X ∼ N (0, 1) condicio-
nada a X > 0 é utilizar o método da rejeição com uma distribuição exponencial como proposta.
Sabemos que a densidade da normal padrão é

2 2
f ( x ) = √ e− x /2 ,

2 /2
e que, para x > 0, a função decresce com a cauda e− x . Por outro lado, a densidade da
distribuição exponencial com taxa λ = 1 é

g( x ) = e− x , x ≥ 0.

Note que:
r
f (x) 2 − x2 /2+ x
= e .
g( x ) π
Para aplicar o método da rejeição, precisamos encontrar o ponto de máximo da razão f ( x )/g( x ),
ou seja, maximizar a função x − x2 /2. Derivando:

x2
 
d
x− = 1 − x = 0 ⇒ x = 1.
dx 2

Portanto, o máximo ocorre em x = 1, e o valor da constante c será:


r
2e
c= .
π
46 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS
A razão f ( x )/cg( x ) pode então ser escrita como:
 
f (x) 1 2
= exp − ( x − 1) ,
cg( x ) 2

o que nos leva ao seguinte algoritmo:

1. Gere Y ∼ Exp(1).

2. Gere U ∼ Uniforme(0, 1).


(Y − 1 ) 2
 
3. Se U < exp − 2 , aceite Y como amostra da normal positiva.

4. Caso contrário, volte ao passo 1.

Finalmente, se X ∼ |N (0, 1)|, isto é, uma normal padrão truncada para valores positivos
(obtida via o algoritmo anterior).
Para gerar uma normal padrão simétrica Z ∼ N (0, 1), basta sortear um sinal S ∼ Bernoulli(1/2),
e definir: 
 X, se S = 1,
Z=
− X, se S = 0.

Dessa forma, Z tem distribuição simétrica em torno de zero, com densidade normal padrão,
como desejado.

Intuição geométrica

O método da rejeição pode ser visualizado como um processo de amostragem de pontos aleatórios
em uma região do plano, com o objetivo de “pintar” a curva da densidade alvo f ( x ).

Imagine que temos uma função auxiliar g( x ), da qual sabemos simular facilmente, e uma
constante de majoração c > 0 tal que f ( x ) ≤ cg( x ) para todo x. Isso nos permite usar cg( x )
como um envelope que cobre toda a curva de f ( x ).
A cada tentativa, sorteamos:

• Um valor Y ∼ g( x ): isso escolhe uma posição no eixo x, com densidade g;


4.3. DISTRIBUIÇÃO GAMMA 47
• Um valor U ∼ Unif(0, 1): isso define uma altura relativa no intervalo [0, cg(Y )], formando
o ponto (Y, U · cg(Y )) dentro do retângulo sob o envelope.

O ponto é aceito se estiver abaixo da curva de f , ou seja, se

f (Y )
U< .
cg(Y )

Caso contrário, o ponto é rejeitado.


Assim, ao longo do tempo, os pontos aceitos se acumulam nas regiões onde f ( x ) é maior,
formando uma amostra com exatamente a distribuição desejada.
Perceba que a constante c controla a eficiência do método: quanto maior c, maior a área total
do envelope cg( x ) em relação à curva alvo f ( x ), e mais pontos são desperdiçados. O valor ideal
de c é o menor possível que ainda garanta f ( x ) ≤ cg( x ) para todo x; nesse caso, a taxa de
aceitação é maximizada e igual a 1/c.

4.3 Distribuição Gamma


A distribuição Gamma com parâmetros α > 0 (forma) e θ > 0 (escala) é definida pela densidade

1
f (x) = x α−1 e− x/θ , x > 0,
Γ(α) θ α

onde Γ(α) é a função Gama de Euler.

Uma maneira natural de interpretar essa distribuição é por analogia com modelos discretos.
No mundo discreto, a distribuição Geométrica mede o número de ensaios necessários até obser-
var o primeiro sucesso em uma sequência de Bernoullis. Se quisermos o número de ensaios até
o r-ésimo sucesso, obtemos a Binomial Negativa, que pode ser vista como a soma de variáveis
Geométricas independentes.

No mundo contínuo, a Exponencial exerce um papel análogo ao da Geométrica: ela mede o


tempo de espera até o primeiro sucesso. Seguindo a mesma lógica, a distribuição Gamma surge
como soma de várias variáveis Exponenciais independentes, representando o tempo de espera
até o α-ésimo sucesso.
Alguns casos particulares:

• Quando α = 1, a Gamma coincide exatamente com a Exponencial.

• Quando α é um inteiro maior que 1, a Gamma pode ser entendida como a soma de α
Exponenciais independentes.

• Mesmo para α não inteiro, a distribuição Gamma mantém a interpretação de “tempo de


espera até sucessos acumulados”, generalizando de forma contínua a Binomial Negativa.

O parâmetro de forma α regula quantos sucessos estão sendo acumulados e, portanto, afeta
diretamente a forma da distribuição:

• Para α < 1, a densidade concentra-se fortemente perto de zero.


48 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS

• Para α = 1, a densidade é simplesmente a Exponencial decrescente.

• Para α > 1, a densidade é unimodal, com máximo em (α − 1)θ.

Já o parâmetro de escala θ atua como fator multiplicativo, alongando ou comprimindo a


distribuição. A média e a variância crescem proporcionalmente a ele, conforme:

E[ X ] = αθ, Var( X ) = αθ 2 .

4.3.1 Simulando quando α é inteiro

Quando o parâmetro de forma é inteiro, α = k ∈ N, a distribuição Gamma(k, θ ) (escala θ >


0) recebe o nome de Erlang. Ela pode ser obtida como a soma de k variáveis exponenciais
independentes. Na parametrização por taxa λ = 1/θ:
k
∑ Ei ,
d i.i.d.
X ∼ Gamma(k, λ) ⇐⇒ X = Ei ∼ Exp(λ).
i =1

O algoritmo de simulação é o seguinte:

1. Fixe k ∈ N e λ > 0 (ou θ = 1/λ).

2. Gere Ei ∼ Exp(λ) de forma independente, para i = 1, . . . , k.

3. Calcule X = ∑ik=1 Ei . O resultado segue X ∼ Gamma(k, λ).

4.3.2 Simulando quando α > 1 via aceitação–rejeição com Exponencial

Considere X ∼ Gamma(α, λ) com α > 1 (parametrização por taxa λ). A densidade alvo é

λα α−1 −λx
f (x) = x e , x > 0.
Γ(α)
4.3. DISTRIBUIÇÃO GAMMA 49

Usaremos como proposta Y ∼ Exp(µ), com densidade

g( x ) = µe−µx , x > 0.

Para que o método de aceitação–rejeição seja válido, precisamos de uma constante c tal que
f ( x ) ≤ c g( x ) para todo x > 0. O quociente

f (x) λα
= x α−1 e−(λ−µ)x
g( x ) Γ(α) µ

mostra que é necessário ter µ < λ, pois caso contrário o termo exponencial não decai e o quoci-
ente não tem máximo finito. Quando µ < λ, o máximo ocorre em

α−1
x∗ = ,
λ−µ

com valor
 α −1
α−1

λα
c(µ) = e−(α−1) .
Γ(α) µ λ−µ

A probabilidade de aceitação por tentativa é 1/c(µ) e, portanto, o número médio de tentativas


até aceitar uma amostra é c(µ). Interpretando em tempo contínuo como um processo de Poisson
de taxa 1, o thinning com probabilidade 1/c(µ) gera um processo aceito com taxa 1/c(µ), de
modo que o tempo médio entre aceitações é c(µ).
O algoritmo é o seguinte:

1. Escolha µ ∈ (0, λ), por exemplo µ = µ∗ = λ/α que minimiza c(µ).

2. Gere Y ∼ Exp(µ) e U ∼ Unif(0, 1).

3. Aceite X = Y se U ≤ f (Y )/(c(µ) g(Y )); caso contrário, volte ao passo 2.


50 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS
O valor aceito X tem distribuição Gamma(α, λ).
A tabela a seguir mostra a constante c∗ e a taxa de aceitação 1/c∗ para alguns valores de α na
escolha ótima µ = λ/α (os valores independem de λ):
αα −(α−1)
α µ∗ = λ/α c∗ = e aceitação (1/c∗ )
Γ(α)
2
1.5 3λ 1.2573 0.7953
1
2 2λ 1.4715 0.6796
1
3 3λ 1.8270 0.5473
1
5 5λ 2.3848 0.4193
1
8 8λ 3.0355 0.3294
1
12 12 λ 3.7306 0.2681

4.3.3 Simulando quando α < 1

Para 0 < α < 1, uma forma simples de simular Γ(α, θ ) é usar a identidade

se G ∼ Γ(α + 1, θ ) e U ∼ Unif(0, 1) (indep.), X = G U 1/α ∼ Γ(α, θ ).

Para entender essa relação, considere as variáveis independentes (U, G ) com U ∼ Unif(0, 1)
e G ∼ Γ(α + 1, θ ), 0 < α < 1. Defina a transformação

( x, g) = T (u, g) = g u1/α , g ,


cuja inversa é
(u, g) = T −1 ( x, g) =

( x/g)α , g .
O suporte transformado é x > 0 e g > x (pois u ∈ (0, 1) implica x/g ∈ (0, 1)).
A densidade conjunta de (U, G ) é

gα e− g/θ
f U,G (u, g) = f U (u) f G ( g) = 1(0,1) (u) , g > 0.
Γ ( α + 1 ) θ α +1
4.4. DISTRIBUIÇÃO BETA 51
Pela fórmula de mudança de variável,
 ∂(u, g)
f X,G ( x, g) = f U,G ( x/g)α , g det .
∂( x, g)

Calculamos o jacobiano usando a inversa u = ( x/g)α :

∂u ∂u ∂g ∂g
= α x α −1 g − α , = −α x α g−(α+1) , = 0, = 1,
∂x ∂g ∂x ∂g

logo
∂(u, g) ∂u
det = · 1 − 0 = α x α −1 g − α .
∂( x, g) ∂x
Portanto,

gα e− g/θ α −1 − α α x α −1
f X,G ( x, g) = 1(x,∞) ( g) α x g = 1 ( x,∞ ) ( g ) e− g/θ .
Γ ( α + 1 ) θ α +1 Γ ( α + 1 ) θ α +1

Integrando em g para obter a marginal de X:


Z ∞ Z ∞
α x α −1 α x α −1
f X (x) = f X,G ( x, g) dg = e− g/θ dg = θ e− x/θ .
x Γ ( α + 1 ) θ α +1 x Γ ( α + 1 ) θ α +1

Usando Γ(α + 1) = α Γ(α), obtemos

x α−1 e− x/θ
f X (x) = , x > 0,
Γ(α) θ α

que é exatamente a densidade Γ(α, θ ). Logo, X = G U 1/α ∼ Γ(α, θ ).


O algoritmo de simulação é:

1. Dado 0 < α < 1 e θ > 0, defina α′ = α + 1.

2. Gere G ∼ Γ(α′ , θ ) (por exemplo, via Marsaglia–Tsang, pois α′ > 1).

3. Gere U ∼ Unif(0, 1), independente de G.

4. Retorne X = G U 1/α . Então X ∼ Γ(α, θ ).

4.4 Distribuição Beta


A distribuição Beta é uma das mais importantes distribuições contínuas em estatística, definida
no intervalo unitário [0, 1] e parametrizada por dois parâmetros de forma α > 0 e β > 0. Sua
densidade é dada por

1
f (x) = x α −1 (1 − x ) β −1 , 0 < x < 1,
B(α, β)

onde
Γ(α)Γ( β)
Z 1
B(α, β) = uα−1 (1 − u) β−1 du =
0 Γ(α + β)
é a função Beta de Euler.
52 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS
A interpretação intuitiva da distribuição Beta é como um modelo de incerteza sobre proba-
bilidades. Se pensamos em x como a probabilidade de sucesso em uma sequência de ensaios
de Bernoulli, a Beta aparece naturalmente como distribuição a posteriori em modelos Bayesianos
conjugados: começando com uma priori Beta(α, β), após observar s sucessos e f fracassos, a
posteriori é Beta(α + s, β + f ).

A forma da densidade é bastante flexível:

• Para α, β < 1, a densidade concentra-se nos extremos 0 e 1.

• Para α = β = 1, temos a uniforme no intervalo (0, 1).

• Para α > 1 e β > 1, a densidade é unimodal, com máximo em (α − 1)/(α + β − 2).

Os momentos principais são:

α αβ
E[ X ] = , Var( X ) = .
α+β ( α + β )2 ( α + β + 1)
Essas fórmulas mostram como α e β podem ser interpretados como “pseudocontagens” de suces-
sos e fracassos, de forma que α + β controla a concentração da distribuição em torno da média.

4.4.1 Simulando a Beta via aceitação–rejeição com proposta uniforme

A distribuição Beta(α, β) tem suporte em (0, 1), de modo que uma escolha natural de proposta
é Y ∼ Unif(0, 1). A densidade da uniforme é g(y) = 1 para 0 < y < 1, e precisamos de uma
constante c tal que
f (y) ≤ c g(y) = c, 0 < y < 1.

O algoritmo de aceitação–rejeição é:

1. Gere Y ∼ Unif(0, 1) e U ∼ Unif(0, 1) independentes.


4.5. TRANSFORMAÇÕES DE VARIÁVEIS ALEATÓRIAS 53
2. Aceite X = Y se U ≤ f (Y )/c, caso contrário repita o passo 1.

O valor aceito X terá distribuição Beta(α, β).


A escolha ótima de c pode ser caracterizado em três casos:

• Se α > 1 e β > 1, a densidade é unimodal, com modo em


α−1
y∗ = ,
α+β−2
e portanto
1
c = f (y∗ ) = ( y ∗ ) α −1 (1 − y ∗ ) β −1 .
B(α, β)
• Se α = β = 1, a distribuição é uniforme, logo c = 1.

• Se α < 1 ou β < 1, a densidade diverge em uma das extremidades (0 ou 1), e assim


sup f (y) = ∞. Nesse caso não existe constante finita c e o método de aceitação–rejeição
com uniforme como proposta não pode ser aplicado.

4.4.2 Simulando a Beta via Gammas independentes

O método mais utilizado e geral para simular variáveis Beta(α, β) explora a relação entre as
distribuições Beta e Gama. Seja

G1 ∼ Γ(α, 1), G2 ∼ Γ( β, 1),

independentes. Então vale a identidade


G1
X = ∼ Beta(α, β).
G1 + G2

A prova segue do fato de que o vetor normalizado ( G1 , G2 )/( G1 + G2 ) tem distribuição


Dirichlet(α, β), e portanto sua primeira coordenada é Beta(α, β). Outra forma é calcular a densi-
dade conjunta de ( X, T ), com X = G1G+1G2 e T = G1 + G2 , e verificar que a marginal de X coincide
com a densidade da Beta.
O algoritmo é simples e eficiente:

1. Gere G1 ∼ Γ(α, 1) e G2 ∼ Γ( β, 1) de forma independente.


G1
2. Retorne X = G1 + G2 .

Esse procedimento funciona para qualquer α, β > 0, inclusive quando são menores que 1, ao
contrário do método de aceitação–rejeição com proposta uniforme.

4.5 Transformações de Variáveis Aleatórias


Neste capítulo estudaremos transformações de variáveis e vetores aleatórios. A ideia central é
a seguinte: dado um modelo probabilístico inicial, frequentemente precisamos aplicar funções a
variáveis ou vetores aleatórios para obter novas quantidades de interesse. O objetivo, então, é
caracterizar a distribuição resultante após a transformação, seja ela univariada ou multivariada.
54 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS

4.5.1 Geração de Normais via Método de Box–Muller

Seja U ∼ Unif(0, 2π ) e T ∼ Expo(1) independentes, com densidade conjunta

1 −t
f U,T (u, t) = e , u ∈ (0, 2π ), t > 0.

Definimos a transformação
√ √
X= 2T cos U, Y= 2T sin U.

O objetivo é determinar a densidade conjunta de ( X, Y ). Para isso usamos a fórmula de mudança


de variáveis
∂(u, t)
f X,Y ( x, y) = f U,T (u, t) det ,
∂( x, y)
onde (u, t) é obtido a partir de ( x, y).
Primeiro observamos que

x2 + y2 = 2t(cos2 u + sin2 u) = 2t,

de modo que
y
t = 12 ( x2 + y2 ), u = arctan x (ajustado para o quadrante correto).

Assim, a transformação é invertível.


O próximo passo é calcular o jacobiano da transformação direta (u, t) 7→ ( x, y). Temos

∂x √ ∂x 1
= − 2t sin u, = √ cos u,
∂u ∂t 2t
∂y √ ∂y 1
= 2t cos u, = √ sin u.
∂u ∂t 2t
Logo,  √ 
− 2t sin u √1 cos u
2t
J=√ .
2t cos u √1 sin u
2t

O determinante é
 √     √ 
det( J ) = − 2t sin u √1 sin u − √1 cos u 2t cos u .
2t 2t
4.5. TRANSFORMAÇÕES DE VARIÁVEIS ALEATÓRIAS 55
Simplificando,
det( J ) = − sin2 u − cos2 u = −1.

Portanto,
|det( J )| = 1.

Aplicando a fórmula de mudança de variáveis,

∂(u, t) 1 −t
f X,Y ( x, y) = f U,T (u, t) det = e · 1.
∂( x, y) 2π

Substituindo t = 21 ( x2 + y2 ),

1
exp − 21 ( x2 + y2 ) .

f X,Y ( x, y) =

Finalmente, notamos que
  
1 2 1 −y2 /2
f X,Y ( x, y) = √ e−x /2 √ e ,
2π 2π
o que mostra que X e Y são independentes e ambos têm distribuição Normal padrão.
Com essa dedução, concluímos que ( X, Y ) definidos acima são variáveis independentes com
distribuição Normal padrão. Assim, o método de Box–Muller pode ser usado diretamente para
gerar Normais a partir de variáveis Uniformes e Exponenciais. Na prática, o algoritmo segue os
seguintes passos:

1. Gere U ∼ Unif(0, 2π ).
56 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS
2. Gere T ∼ Expo(1).
√ √
3. Calcule X = 2T cos U e Y = 2T sin U.

4. Então X e Y são independentes e possuem distribuição N (0, 1).

Intuitivamente, o que estamos fazendo é gerar um par de variáveis Normais independentes


( X, Y ) e representá-las em coordenadas polares: o ângulo é sorteado uniformemente e o raio vem
de uma distribuição que garante a forma circular da densidade Normal.

4.5.2 Geração da normal bivariada

Nosso objetivo agora é mostrar como simular uma Normal bivariada ( Z, W ) com marginais
N (0, 1) e correlação ρ, onde −1 < ρ < 1. A ideia é construir ( Z, W ) a partir de variáveis
independentes mais simples.
Sejam X, Y ∼ N (0, 1) independentes. Definimos
q
Z = X, W = ρX + τY, τ = 1 − ρ2 .

Então Z e W têm marginais N (0, 1) e Corr( Z, W ) = ρ. Este é um procedimento construtivo que


permite gerar diretamente a Normal bivariada a partir de duas Normais independentes.

Para verificar a validade da construção, vamos obter a densidade conjunta de ( Z, W ). A


densidade de ( X, Y ) é
1
exp − 21 ( x2 + y2 ) .

f X,Y ( x, y) =

Como a transformação é
z = x, w = ρx + τy,

a inversa é
w − ρz
x = z, y= .
τ
Aplicando a fórmula de mudança de variáveis,

∂( x, y)
f Z,W (z, w) = f X,Y ( x, y) det ,
∂(z, w)

com ( x, y) dados pela inversa acima.


O jacobiano da transformação inversa é
   
∂x ∂x
∂( x, y) ∂z ∂w  1 0
=  ∂y = ,
∂(z, w) ∂y
− τρ 1
∂z ∂w τ

portanto
∂( x, y) 1
det = .
∂(z, w) τ
Substituindo em f Z,W ,
 
1 1 w−ρz 2
f Z,W (z, w) = exp − z2 + .
2πτ 2 τ
4.5. TRANSFORMAÇÕES DE VARIÁVEIS ALEATÓRIAS 57
Fazendo as contas e lembrando que ρ2 + τ 2 = 1, obtemos
 
1 1 2 2
f Z,W (z, w) = exp − 2 (z − 2ρzw + w ) .
2πτ 2τ

Essa é exatamente a forma conhecida da densidade Normal bivariada com matriz de covari-
ância !
1 ρ
Σ= , | Σ | = 1 − ρ2 = τ 2 .
ρ 1
De fato, podemos escrever

1 
−1 ⊤

f Z,W (z, w) = exp − 1
( z, w ) Σ ( z, w ) .
2π |Σ|1/2 2

Do ponto de vista de simulação, esse resultado mostra que basta gerar X, Y ∼ N (0, 1) inde-
pendentes (e.g. via Box–Muller) e aplicar a transformação acima. O algoritmo é:

1. Gere X ∼ N (0, 1).

2. Gere Y ∼ N (0, 1) independentemente.

3. Calcule q
Z = X, W = ρX + 1 − ρ2 Y.

4. O par ( Z, W ) tem distribuição Normal bivariada com matriz de covariância Σ.

Generalizando para normal multivariada

No caso bivariado, construímos


!   !
Z 1 0 X
= p  , X, Y ∼ N (0, 1) independentes.
W ρ 1 − ρ2 Y

Chamando a matriz de transformação de A, temos


! !  
Z X 1 0
=A , A= p .
W Y ρ 1 − ρ2

Como X, Y são independentes com variância 1, temos


!! !!
Z X
Cov = A Cov A⊤ = AI2 A⊤ = AA⊤ .
W Y

Fazendo as contas,
    
1 0 1 ρ 1 ρ
AA⊤ =  p  p = ,
ρ 1 − ρ2 0 1 − ρ2 ρ 1

que é exatamente a matriz de covariância da Normal bivariada desejada.


58 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS
No caso geral em d dimensões, seguimos a mesma ideia. Seja

X = ( X1 , . . . , Xd )⊤ ∼ Nd (0, Id ),

um vetor de Normais independentes. Para qualquer matriz A ∈ Rd×d , definimos

Z = AX.

Então
Cov( Z ) = A Cov( X ) A⊤ = AId A⊤ = AA⊤ .

Portanto, dado Σ simétrica definida positiva, basta encontrar A tal que Σ = AA⊤ . Assim,
podemos gerar
Z ∼ Nd (0, Σ).

Se quisermos uma média não nula µ ∈ Rd , basta considerar

Z = µ + AX.

Para encontrar A a partir de uma matriz de covariância Σ simétrica definida positiva, existem
diferentes decomposições possíveis:

• Decomposição de Cholesky: escreve-se

Σ = LL⊤ ,

onde L é triangular inferior. Neste caso, podemos tomar A = L.

• Decomposição espectral: escreve-se

Σ = QΛQ⊤ ,

onde Q é ortogonal e Λ = diag(λ1 , . . . , λd ) contém os autovalores de Σ. Como Σ é definida


positiva, λi > 0. Assim, podemos tomar

A = QΛ1/2 ,

com
p p
Λ1/2 = diag( λ1 , . . . , λ d ).

• Outros métodos: em aplicações numéricas, também se pode usar decomposições de tipo


QR ou fatorações aproximadas, dependendo da estabilidade computacional desejada.

Exemplo 8 (Simulação de Normal trivariada). Considere o vetor aleatório ( Z1 , Z2 , Z3 )⊤ ∼ N3 (0, Σ)


com média nula e matriz de covariância
 
1 0.8 0.3
Σ = 0.8 1 0.5 .
 

0.3 0.5 1
4.5. TRANSFORMAÇÕES DE VARIÁVEIS ALEATÓRIAS 59
Para gerar amostras desse vetor, seguimos a ideia de representar uma Normal multivariada como
transformação linear de Normais independentes. Seja

X = ( X1 , X2 , X3 )⊤ ∼ N3 (0, I3 ),

isto é, X1 , X2 , X3 independentes N (0, 1). Se encontrarmos uma matriz L tal que

Σ = LL⊤ ,

então
Z = LX
terá distribuição N3 (0, Σ).

No caso desta matriz, a decomposição de Cholesky fornece


 
1 0 0
L = 0.8 0.6 0 ,
 

0.3 0.566 0.768

de modo que, se gerarmos X1 , X2 , X3 ∼ N (0, 1) independentes e calcularmos


   
Z1 X1
 Z2  = L  X2  ,
   

Z3 X3

obtemos um vetor Normal trivariado com a covariância desejada.

4.5.3 Distribuição Qui-quadrado

A distribuição qui-quadrado surge naturalmente como uma transformação de variáveis normais


independentes.
i.i.d.
Sejam Z1 , . . . , Zk ∼ N (0, 1). Definimos
k
Q= ∑ Zi2 .
i =1

Dizemos que Q segue a distribuição qui-quadrado com k graus de liberdade, denotada por

Q ∼ χ2k .
60 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS
A densidade dessa distribuição pode ser derivada observando que Zi2 ∼ Γ 12 , 2 , e que a soma


de variáveis Gama independentes com mesma escala também é Gama. Assim,


 
Q ∼ Γ 2k , 2 .

Logo, a densidade é
1 k
f (q) = q 2 −1 e−q/2 , q > 0.
2k/2 Γ(k/2)
Os principais momentos são
E[ Q] = k, Var( Q) = 2k.
Essa distribuição aparece com frequência em estatística, por exemplo em testes de hipóteses e
intervalos de confiança, pois estatísticas do tipo “soma de quadrados de erros padronizados”
têm exatamente essa forma.

Simulando a qui-quadrado via soma de Normais

A definição da distribuição qui-quadrado já fornece um método direto de simulação. Seja k ∈ N


o número de graus de liberdade. Gere variáveis independentes
i.i.d.
Z1 , Z2 , . . . , Zk ∼ N (0, 1).

Então
k
Q= ∑ Zi2 ∼ χ2k .
i =1

O algoritmo é:

1. Fixe k ∈ N.
i.i.d.
2. Gere Z1 , . . . , Zk ∼ N (0, 1).

3. Retorne Q = ∑ik=1 Zi2 .

Esse procedimento é simples e mostra claramente a origem da distribuição qui-quadrado


como soma de quadrados de Normais padrão. Além disso, destaca a ligação entre a χ2k e a
distribuição Normal, que será essencial para a construção de outras distribuições clássicas, como
a t de Student e a F de Fisher.

Simulando a qui-quadrado via Gamma

Outra forma de simular uma variável χ2k é usar sua equivalência com a distribuição Gama. Sabe-
mos que  
Q ∼ χk ⇐⇒ Q ∼ Γ 2 , 2 ,
2 k

isto é, uma Gama com parâmetro de forma k/2 e escala 2.


Portanto, para simular Q ∼ χ2k podemos simplesmente gerar
 
Q ∼ Γ 2k , 2 .

O algoritmo é:
4.5. TRANSFORMAÇÕES DE VARIÁVEIS ALEATÓRIAS 61
1. Fixe k ∈ N.
 
2. Gere G ∼ Γ k
2, 2 .

3. Retorne Q = G.

Esse método é geralmente mais eficiente em termos computacionais, já que muitas bibliote-
cas numéricas possuem rotinas otimizadas para a geração de variáveis Gama com parâmetros
arbitrários. Assim, para valores grandes de k, pode ser preferível usar diretamente a simulação
via Gama em vez da soma de muitos Normais.

4.5.4 Simulando a distribuição t de Student

A distribuição t de Student foi introduzida em 1908 por William Gosset, que trabalhava como
mestre cervejeiro na Guinness. Por restrições da empresa, ele publicou seus resultados sob o
pseudônimo Student, dando origem ao nome da distribuição. Essa distribuição aparece natural-
mente em problemas de inferência estatística, especialmente em testes de hipóteses, mas aqui
nos interessa sua definição e como simulá-la.

Seja Z ∼ N (0, 1) e Q ∼ χ2ν independentes, com ν graus de liberdade. Definimos


Z
T= √ .
Q/ν
Dizemos que T segue a distribuição t de Student com ν graus de liberdade, denotada por

T ∼ tν .

Algumas propriedades ajudam a caracterizar essa distribuição: ela é simétrica em torno de


zero, de modo que se T ∼ tν então também − T ∼ tν ; no caso particular ν = 1, a distribuição
t1 coincide com a distribuição de Cauchy; e quando ν → ∞, a distribuição tν converge para
a Normal padrão N (0, 1). Essas propriedades mostram que, com poucos graus de liberdade,
62 CAPÍTULO 4. VARIÁVEIS CONTÍNUAS E COMO SIMULÁ-LAS
a t de Student tem caudas mais pesadas do que a Normal, refletindo a incerteza adicional ao
estimar a variância. À medida que ν cresce, a distribuição se aproxima da Normal, tornando-se
praticamente indistinguível dela.

A intuição da fórmula pode ser entendida a partir da estatística de teste para a média de uma
Normal. Se a variância σ2 fosse conhecida, teríamos

X−µ
Z= √ ∼ N (0, 1).
σ/ n

No entanto, como σ2 é geralmente desconhecida, substituímos σ pela estimativa amostral S. Um


resultado clássico mostra que
( n − 1) S2
Q= ∼ χ2n−1 .
σ2
Assim, a estatística de interesse torna-se
Z
T= √ , ν = n − 1,
Q/ν

o que justifica a definição da distribuição t. O numerador Z mede a variabilidade da média



padronizada, enquanto o denominador Q/ν introduz a incerteza extra pela estimação da vari-
ância, resultando em caudas mais pesadas.

A própria definição sugere um algoritmo de simulação simples:

1. Fixe o número de graus de liberdade ν.

2. Gere Z ∼ N (0, 1).

3. Gere Q ∼ χ2ν , independentemente de Z.



4. Retorne T = Z/ Q/ν, que segue a lei tν .
Capítulo 5

Simulação via Monte Carlo

A ideia fundamental da simulação de Monte Carlo é usar amostras aleatórias para aproximar
quantidades numéricas que, de outra forma, seriam difíceis ou impossíveis de calcular analitica-
mente. Em sua forma mais simples, o método baseia-se na Lei dos Grandes Números.

5.1 Estimando médias


Seja X uma variável aleatória com distribuição f , e desejamos estimar

µ = E [h( X )] .

Gerando X1 , . . . , Xn independentes de f , definimos o estimador de Monte Carlo:

1 n
n i∑
µ̂n = h ( Xi ) .
=1

Pela Lei dos Grandes Números, µ̂n → µ quase certamente quando n → ∞. Uma maneira
simples de justificar essa convergência é pela desigualdade de Chebyshev. Se Var [h( X )] = σ2 < ∞,
então
σ2
Var [µ̂n ] = .
n
Logo, para qualquer ε > 0,

Var [µ̂n ] σ2
P (|µ̂n − µ| > ε) ≤ = .
ε2 nε2
Portanto, P (|µ̂n − µ| > ε) → 0 quando n → ∞, mostrando que µ̂n converge para µ em probabi-
lidade, o que é precisamente a versão fraca da Lei dos Grandes Números.

5.1.1 Exemplos

Exemplo 9. Considere a integral


Z 1
2
I= e− x dx.
0
Embora não exista uma expressão analítica simples para essa integral, podemos aproximá-la por simulação
de Monte Carlo.

63
64 CAPÍTULO 5. SIMULAÇÃO VIA MONTE CARLO
Geramos X1 , . . . , Xn ∼ Uniforme(0, 1) e usamos a identidade
h 2
i
I = E e− X .

Assim, o estimador de Monte Carlo é


1 n −X2
n i∑
În = e i.
=1

O valor aproximado da integral é I ≈ 0.7468.

Exemplo 10. Considere X ∼ N (0, 1) e o evento A = { X > 1}. Queremos estimar a probabilidade

p = P ( X > 1) .

Geramos X1 , . . . , Xn ∼ N (0, 1) e usamos o estimador de Monte Carlo

1 n
1 { Xi > 1 } .
n i∑
p̂n =
=1

Pela Lei dos Grandes Números, p̂n → p quando n → ∞.


O valor verdadeiro é
p = 1 − Φ(1) ≈ 0.1587,

onde Φ denota a CDF da normal padrão.

Exemplo 11. Podemos estimar o valor de π por simulação de Monte Carlo usando uma interpretação
geométrica.
Considere o quadrado [0, 1] × [0, 1] e o quarto de círculo de raio 1 centrado na origem, definido por

x2 + y2 ≤ 1.

A área do quarto de círculo é π/4. Assim, se gerarmos pontos ( Xi , Yi ) uniformemente distribuídos no


quadrado, a fração que cai dentro do círculo aproxima a razão entre as áreas, isto é,

número de pontos no círculo π


≈ .
número total de pontos 4

Logo, o estimador de Monte Carlo é

1 n
1{ Xi2 + Yi2 ≤ 1}.
n i∑
π̂n = 4 ×
=1

Pela Lei dos Grandes Números, π̂n → π quando n → ∞.

Exemplo 12. Considere X ∼ Uniforme(0, 1). Queremos estimar simultaneamente E [ X ] e Var [ X ] por
simulação.
Geramos X1 , . . . , Xn independentes e usamos

1 n 1 n

n i∑ ∑
µ̂n = Xi , σ̂n2 = ( Xi − µ̂n )2 .
=1
n − 1 i =1
5.1. ESTIMANDO MÉDIAS 65
Exemplo 13. Considere a integral em duas dimensões
Z 1Z 1
2 + y2 )
I= e−(x dx dy.
0 0

Geramos ( Xi , Yi ) ∼ Uniforme([0, 1]2 ) e usamos o estimador

1 n −(X2 +Y2 )
n i∑
În = e i i .
=1

Exemplo 14. Considere X ∼ Exponencial(1) e queremos estimar E e−X . Geramos X1 , . . . , Xn inde-


 

pendentes e calculamos
1 n
µ̂n = ∑ e−Xi .
n i =1

O valor verdadeiro é E e
 −X 
= 21 .

Exemplo 15. Considere a integral


Z ∞ −x
e
I= dx.
0 1+x
Essa integral não tem forma fechada simples, mas pode ser expressa como uma esperança sob uma distri-
buição conveniente.
Observe que f ( x ) = e− x 1{ x>0} é a densidade de uma distribuição Exponencial(1). Assim, podemos
escrever
Z ∞ −x Z ∞  
e 1 1
I= dx = f ( x ) dx = E , X ∼ Exponencial(1).
0 1+x 0 1+x 1+X

Logo, podemos estimar I por Monte Carlo gerando X1 , . . . , Xn ∼ Exponencial(1) e calculando

1 n 1
În = ∑
n i = 1 1 + Xi
.

O valor verdadeiro da integral é aproximadamente I ≈ 0.5963.

Exemplo 16. Considere a integral


Z ∞
sin( x )
I= dx.
0 x
Não há uma densidade de probabilidade aparecendo explicitamente, mas podemos introduzir uma para
reescrever a integral como uma esperança.
Escolha, por conveniência, a densidade exponencial f ( x ) = e− x 1{ x>0} . Então,
Z ∞ Z ∞ 
sin( x ) sin( x ) sin( X )
I= dx = f ( x ) dx = E , X ∼ Exponencial(1).
0 x 0 xe− x Xe−X

Assim, a integral pode ser estimada por Monte Carlo sem precisar integrar diretamente uma função
oscilatória:
1 n sin( Xi )
În = ∑ , Xi ∼ Exponencial(1).
n i = 1 X i e − Xi

O valor exato da integral é I = π


2 ≈ 1.5708.
66 CAPÍTULO 5. SIMULAÇÃO VIA MONTE CARLO
5.2 Intervalos de Confiança
Uma estimativa obtida por simulação de Monte Carlo é aleatória. Mesmo quando o estimador
é não tendencioso, seu valor varia a cada execução devido à variabilidade amostral. Por isso, é
importante quantificar essa incerteza por meio de um intervalo de confiança.
Seja µ̂n = n1 ∑in=1 h( Xi ) um estimador de Monte Carlo para µ = E [h( X )]. Pelo Teorema
Central do Limite,
√ µ̂n − µ d
n −
→ N (0, 1),
σ
onde σ2 = Var [h( X )]. Assim, para n grande,
 
σ
P |µ̂n − µ| ≤ z1−α/2 √ ≈ 1 − α,
n

onde z1−α/2 é o quantil da normal padrão.


Na prática, a variância σ2 é desconhecida. Usamos a estimativa amostral
n
1
n − 1 i∑
s2n = (h( Xi ) − µ̂n )2 .
=1

Substituindo σ por sn , obtemos o intervalo de confiança assintótico


sn
µ̂n ± z1−α/2 √ .
n

O intervalo representa a faixa de valores plausíveis para µ, dada a variabilidade da amostra.


Para um nível de confiança de 95%, usamos z0.975 ≈ 1.96, obtendo
sn
µ̂n ± 1.96 √ .
n

Exemplo 17. Considere novamente a estimativa


h 2
i
I = E e−X , X ∼ Uniforme(0, 1).

Queremos construir um intervalo de confiança para I com base em n = 105 simulações.

(1) O estimador de Monte Carlo é


1 n −X2
n i∑
În = e i.
=1
A média amostral obtida foi
În = 0.7472.
2
(2) O desvio padrão amostral das observações e−Xi é

sn = 0.289.

(3) O erro padrão do estimador é

sn 0.289
EP = √ = √ = 0.000914.
n 100000
5.2. INTERVALOS DE CONFIANÇA 67
(4) Pela regra empírica 68–95–99.7, sabemos que:

– cerca de 68% das observações estão dentro de 1 desvio padrão da média;


– cerca de 95% estão dentro de 2 desvios padrão;
– e cerca de 99.7% estão dentro de 3 desvios padrão.

Assim, podemos construir um intervalo aproximado de 95% de confiança usando dois desvios padrão
em vez de 1.96.

(5) O termo de margem é então

2 × EP = 2 × 0.000914 = 0.00183.

(6) O intervalo de confiança é

[ 0.7472 − 0.00183, 0.7472 + 0.00183 ] = [0.7454, 0.7490].

Em outras palavras, esperamos que cerca de 95% das repetições do experimento de Monte Carlo produ-
zam valores de În dentro de dois erros padrão da média verdadeira. O valor teórico I = 0.7468 está de fato
dentro desse intervalo.

Exercício 25. Ache intervalos de confianças para todos os exemplos anteriores.


68 CAPÍTULO 5. SIMULAÇÃO VIA MONTE CARLO
Capítulo 6

Redução de variância

Em um estudo de simulação, é comum que se deseje estimar um parâmetro θ associado a um


modelo estocástico. Para isso, o modelo é executado a fim de gerar uma variável de saída X, cuja
esperança é θ = E[ X ].
Realizam-se então n repetições independentes da simulação, sendo que a i-ésima repetição
fornece o valor Xi . A partir dessas observações, a estimativa natural de θ é a média amostral
1 n
n i∑
X= Xi .
=1

Note que X é um estimador não viesado de θ, de modo que

E[ X ] = θ.

Assim, o erro quadrático médio do estimador coincide com sua variância:


Var( X )
MSE( X ) = E ( X − θ )2 = Var( X ) =
 
.
n
Portanto, se for possível construir um outro estimador não viesado de θ com variância menor
do que a de X, obteremos uma estimativa mais eficiente. Este é o ponto de partida para as
técnicas de redução de variância que discutiremos a seguir.

6.1 Uso de variáveis antitéticas


Considere o problema de estimar θ = E[ X ] por simulação. Se gerarmos duas observações X1 e
X2 , identicamente distribuídas com esperança θ, uma estimativa natural é a média
X1 + X2
θ̂ = .
2
A variância desse estimador pode ser escrita como
1 1 
Var(θ̂ ) = Var( X1 + X2 ) = Var( X1 ) + Var( X2 ) + 2 Cov( X1 , X2 ) .
4 4
Como X1 e X2 têm a mesma distribuição, Var( X1 ) = Var( X2 ), segue que
1 1
Var(θ̂ ) = Var( X1 ) + Cov( X1 , X2 ).
2 2
Portanto:

69
70 CAPÍTULO 6. REDUÇÃO DE VARIÂNCIA
1
• se X1 e X2 forem independentes, Cov( X1 , X2 ) = 0 e Var(θ̂ ) = 2 Var( X1 );

• se conseguirmos construir X1 e X2 de modo que a covariância seja negativa, então a vari-


ância de θ̂ será ainda menor.

A questão, então, é: como gerar dois valores X1 e X2 com a mesma distribuição, mas negati-
vamente correlacionados?

Suponha que X1 seja função de m números aleatórios independentes, isto é,

X1 = h(U1 , . . . , Um ),

onde U1 , . . . , Um são independentes e uniformemente distribuídos em (0, 1).


Observe que, se U ∼ U (0, 1), então também 1 − U ∼ U (0, 1). Assim, se definirmos

X2 = h(1 − U1 , . . . , 1 − Um ),

teremos que X2 possui a mesma distribuição que X1 .


Além disso, como 1 − U é negativamente correlacionado com U, é razoável esperar que X2
seja negativamente correlacionado com X1 .
Para tornar a ideia mais clara, considere o caso em que X1 depende apenas de uma variável
uniforme. Seja U ∼ U (0, 1) e uma função monótona crescente h : [0, 1] → R. Definimos

X1 = h ( U ) , X2 = h ( 1 − U ) .

Note que X1 e X2 têm a mesma distribuição, pois U e 1 − U são identicamente distribuídos.


Além disso, se U assume um valor grande, então X1 = h(U ) também será grande, mas nesse
caso 1 − U será pequeno, de modo que X2 = h(1 − U ) será pequeno. Assim, valores altos de X1
tendem a estar associados a valores baixos de X2 , e vice-versa, o que implica correlação negativa.
No caso particular em que h(u) = u, temos

X1 = U, X2 = 1 − U.

Claramente, E[ X1 ] = E[ X2 ] = 12 , de modo que

E[ X1 ]E[ X2 ] = 41 .

Por outro lado,


Z 1 Z 1
1 1 1
E [ X1 X2 ] = u(1 − u) du = (u − u2 ) du = − = .
0 0 2 3 6
Assim,
1 1 1
− = − < 0,
Cov( X1 , X2 ) =
6 4 12
mostrando explicitamente a correlação negativa entre X1 e X2 . Esse raciocínio se estende natural-
mente para funções h monótonas em várias variáveis. Sejam U1 , . . . , Um variáveis independentes
uniformes em (0, 1) e definamos

X1 = h(U1 , . . . , Um ), X2 = h(1 − U1 , . . . , 1 − Um ),
6.1. USO DE VARIÁVEIS ANTITÉTICAS 71
com h crescente em cada coordenada.
Nesse caso, X1 é uma função crescente do vetor (U1 , . . . , Um ), enquanto X2 é decrescente.
Considerando
g(U1 , . . . , Um ) = − X2 ,

vemos que g também é crescente em cada coordenada.


Ora, quando duas funções de um mesmo conjunto de variáveis independentes são monóto-
nas no mesmo sentido (ambas crescentes ou ambas decrescentes), seus valores tendem a variar
em conjunto, de modo que a covariância é não-negativa. Aplicando esse raciocínio a X1 e g,
concluímos que
Cov( X1 , − X2 ) ≥ 0,

o que implica
Cov( X1 , X2 ) ≤ 0.

Portanto, para qualquer função h crescente em cada coordenada, o par ( X1 , X2 ) é negativa-


mente correlacionado, e o uso de variáveis antitéticas reduz (ou, no pior caso, não aumenta) a
variância do estimador.

Em resumo, o método das variáveis antitéticas consiste em explorar a correlação negativa entre
pares de simulações para reduzir a variância do estimador. Em vez de gerar duas réplicas inde-
pendentes X1 e X2 , construímos o par de forma que ambas tenham a mesma distribuição, mas
sejam negativamente correlacionadas. A variável antitética é dado por

X1 + X2
X′ = ,
2
o qual satisfaz E[ X ′ ] = θ, mas possui variância menor ou igual à do estimador baseado em
amostras independentes.

Um algoritmo simples para aplicar o método pode ser descrito da seguinte forma:

1. Gere U1 , . . . , Um ∼ Uniforme(0, 1) independentes.

2. Calcule X1 = h(U1 , . . . , Um ).

3. Calcule X2 = h(1 − U1 , . . . , 1 − Um ).

4. Defina a variável antitética como


X1 + X2
X′ = .
2

Sempre que utilizamos o método da inversão para gerar variáveis aleatórias, podemos aplicar
diretamente a técnica das variáveis antitéticas. De fato, se U ∼ U (0, 1) gera a variável desejada
via a transformação X = F −1 (U ), então 1 − U também é uniforme em (0, 1), e portanto X ′ =
F −1 (1 − U ) tem a mesma distribuição de X.
A grande vantagem é que, em vez de gerar duas variáveis independentes U1 e U2 para obter
duas amostras de X, basta gerar uma única variável uniforme U. Com ela, obtemos simultanea-
mente o par antitético ( X, X ′ ), o que não apenas economiza custo computacional como também
pode reduzir a variância do resultado final.
72 CAPÍTULO 6. REDUÇÃO DE VARIÂNCIA
Exemplo 18. Considere a geração de uma variável aleatória exponencial com parâmetro λ > 0. Pelo
método da inversão, se U ∼ U (0, 1), então

1
X=− log(U )
λ
segue a distribuição Exp(λ).
Para aplicar o método das variáveis antitéticas, em vez de gerar duas variáveis independentes U1 , U2 ∼
U (0, 1), usamos o par (U, 1 − U ). Assim, obtemos

1 1
X1 = − log(U ), X2 = − log(1 − U ).
λ λ
Definimos, então, a variável final como a média

X1 + X2
Z= .
2
O algoritmo é:

1. Gere U ∼ Uniforme(0, 1).

2. Calcule X1 = − λ1 log(U ).

3. Calcule X2 = − λ1 log(1 − U ).

4. Defina Z = ( X1 + X2 )/2.

No método independente, como cada variável exponencial pode assumir valores próximos de zero
(quando U → 1), a média também pode se aproximar de zero. Já no método antitético temos, supondo
λ = 1,
Z = − 21 log U (1 − U ) .

6.1. USO DE VARIÁVEIS ANTITÉTICAS 73
Como U (1 − U ) ≤ 1/4, segue que
1
Z≥ 2 log 4 = log 2 ≈ 0.693.

Ou seja, a variável construída por antitéticos nunca assume valores menores que log 2.
Esse resultado explica por que, ao comparar os histogramas, a média independente pode assumir valores
próximos de zero, enquanto a antitética tem suporte a partir de log 2. Além disso, no experimento com
n = 105 , o erro quadrático médio foi aproximadamente 0.505 no caso independente e apenas 0.174 no caso
antitético, mostrando a expressiva redução de variância obtida pelo método.

Exemplo 19. Considere a integral


Z ∞
I= log(1 + x2 )e− x dx.
0

Observe que o termo e− x corresponde à densidade de uma variável X ∼ Exp(1). Assim, podemos reescrever
a integral como
I = E log(1 + X 2 ) , X ∼ Exp(1).
 

Portanto, a solução via Monte Carlo é imediata: basta gerar amostras Xi ∼ Exp(1), calcular log(1 +
Xi2 )e tirar a média. O algoritmo segue os passos:

1. Gerar Ui ∼ U (0, 1).

2. Transformar em Xi = − log(Ui ).

3. Calcular log(1 + Xi2 ) e tirar a média.

Para reduzir a variância, podemos usar variáveis antitéticas. Nesse caso, ao invés de gerar apenas Ui ,
usamos também 1 − Ui . Isso produz

Xi = − log(Ui ), Xi′ = − log(1 − Ui ),

e então o estimador final é


1 n 1 
n i∑
2 ′ 2
Îant = 2 log ( 1 + X i ) + log ( 1 + ( X i ) ) .
=1

Note que nem sempre variáveis antitéticas reduzem a variância: essa técnica é mais eficaz quando a
função aplicada às amostras (aqui, log(1 + x2 )) é monotônica, pois nesse caso os pares (U, 1 − U ) tendem
a gerar correlação negativa entre os valores simulados.

Exemplo 20. Considere a integral


Z ∞
1 2
J= e x √ e− x /2 dx.
−∞ 2π
O integrando envolve a densidade da normal padrão N (0, 1), logo podemos escrever

J = E[ e Z ], Z ∼ N (0, 1).

O valor exato é conhecido:


J = e1/2 .
Para estimar J via Monte Carlo, seguimos os passos:
74 CAPÍTULO 6. REDUÇÃO DE VARIÂNCIA
1. Gerar Zi ∼ N (0, 1).

2. Calcular e Zi .

3. Tomar a média sobre as n amostras.

Note que a distribuição normal é simétrica em torno de zero, isto é, Z ∼ N (0, 1) implica que também
− Z ∼ N (0, 1). Assim, para cada Zi gerado, podemos considerar o par ( Zi , − Zi ) e formar o estimador

1 n 1  Zi 
Ĵant = ∑
n i =1 2
e + e − Zi
.

Neste caso, como e x é uma função monotônica crescente, os valores e Zi e e−Zi tendem a se compen-
sar, gerando correlação negativa e uma variância muito menor na estimativa. O ponto essencial é que a
esperança se mantém inalterada, mas o uso da antitética torna o estimador mais eficiente.

6.2 O uso de variáveis de controle


Suponha que desejamos estimar
θ = E[ X ],

onde X é o resultado de uma simulação. Agora suponha que exista outra variável Y cuja espe-
rança é conhecida, digamos
E [Y ] = µ Y .

Então, para qualquer constante c, o estimador

Z = X + c (Y − µ Y )

é não-viesado para θ, pois E[ Z ] = θ.


A variância deste estimador é

Var( Z ) = Var( X + c(Y − µY )) = Var( X ) + c2 Var(Y ) + 2c Cov( X, Y ).

Minimizando em relação a c, obtemos

Cov( X, Y )
c∗ = − .
Var(Y )

Substituindo este valor na expressão da variância, resulta

Cov( X, Y )2
Var( Z ) = Var( X ) − .
Var(Y )

A variável Y é chamada de variável de controle. A intuição é a seguinte: se X e Y são positi-


vamente correlacionados, então c∗ < 0. Nesse caso, quando Y assume um valor acima da sua
média conhecida µY , é provável que X também esteja acima de sua média θ. Para compensar
esse excesso, reduzimos o valor de X ao somar c(Y − µY ) com c < 0. De forma análoga, se Y
estiver abaixo de sua média, provavelmente X também estará, e nesse caso o termo c(Y − µY )
corrige o valor de X para cima. Quando X e Y são negativamente correlacionados, o raciocínio
6.2. O USO DE VARIÁVEIS DE CONTROLE 75
é simétrico: nesse caso c∗ > 0, e se Y está acima de sua média, é provável que X esteja abaixo;
o termo c(Y − µY ) corrige então X para cima. Do mesmo modo, quando Y está abaixo de µY , X
tende a estar acima, e a correção ajusta X para baixo. Assim, tanto em correlação positiva quanto
em correlação negativa o método funciona: o que importa não é o sinal, mas sim a intensidade
da correlação.
Esse ajuste reduz a variância porque parte da flutuação de X pode ser explicada pela sua
correlação com Y. O desvio de Y em relação à sua média atua como um indicador do desvio
de X, e ao subtrair essa componente previsível obtemos um estimador mais estável. Do ponto
de vista matemático, a variância de X é decomposta em uma parte explicável pela covariância
com Y e uma parte residual; ao introduzir a variável de controle, eliminamos a parte explicável
e restamos apenas com a parte residual, que é menor. Assim, a variância do estimador nunca
aumenta e, se ρ( X, Y ) ̸= 0, ela é estritamente reduzida.

Além disso, ao dividir pela variância de X, obtemos

Var( Z )
= 1 − ρ( X, Y )2 ,
Var( X )

onde
Cov( X, Y )
ρ( X, Y ) = p
Var( X ) Var(Y )

é a correlação entre X e Y. Isso mostra que a redução relativa de variância obtida é de 100 ·
ρ( X, Y )2 por cento, independentemente de a correlação ser positiva ou negativa.
76 CAPÍTULO 6. REDUÇÃO DE VARIÂNCIA
Na prática, Cov( X, Y ) e Var(Y ) não são conhecidos de antemão e precisam ser estimados a
partir dos dados simulados. Se n simulações são realizadas, gerando pares ( Xi , Yi ), podemos
calcular
n n
d ( X, Y ) = 1 ∑ ( Xi − X̄ )(Yi − Ȳ ), Var
Cov d (Y ) = 1 ∑ (Yi − Ȳ )2 ,
n − 1 i =1 n − 1 i =1
e então definir
d ( X, Y )
Cov
ĉ∗ = − .
d (Y )
Var
O estimador final com variável de controle é dado por

1 n  
n i∑

θ̂ctrl = X i + ĉ ( Yi − µ Y ) .
=1

O procedimento pode ser resumido no seguinte algoritmo:

1. Gerar amostras ( Xi , Yi ) da simulação, i = 1, . . . , n.

2. Calcular X̄ e Ȳ.

d ( X, Y ) e Var
3. Estimar Cov d (Y ) .

4. Determinar ĉ∗ = −Cov


d ( X, Y )/Var
d (Y ) .

5. Formar o estimador θ̂ctrl = 1


n ∑in=1 ( Xi + ĉ∗ (Yi − µY )).

Exemplo 21. Considere a integral


Z 1
θ= e x dx = e − 1.
0
Podemos reescrevê-la como uma esperança, notando que se U ∼ U (0, 1) então

θ = E[ eU ].

Assim, definindo X = eU , podemos estimar θ por Monte Carlo a partir da média amostral de X.
Agora considere a variável Y = U, cuja esperança é conhecida, µY = E[U ] = 0.5. Como X = eU
e Y = U são fortemente correlacionados positivamente, podemos utilizar Y como variável de controle. O
estimador controlado é dado por
Z = X + c ∗ (Y − µ Y ) ,

onde
Cov( X, Y )
c∗ = − .
Var(Y )
Na prática, basta gerar pares ( Xi , Yi ) a partir de Ui ∼ U (0, 1), calcular as estimativas amostrais de
Cov( X, Y ) e Var(Y ) para obter ĉ∗ , e então construir o estimador

1 n  
n i∑

θ̂ctrl = X i + ĉ ( Yi − µ Y ) .
=1

A correlação positiva entre X e Y faz com que o desvio de Y em relação à sua média indique a direção
do desvio de X em relação a θ. O termo de ajuste c∗ (Y − µY ) corrige esse efeito, reduzindo drasticamente
a variância do estimador. Na simulação, observamos que a variância caiu de aproximadamente 0.24 (sem
6.3. REDUÇÃO DE VARIÂNCIA POR CONDICIONAMENTO 77

controle) para 0.004 (com controle), com estimativas muito mais concentradas em torno do valor verdadeiro
e − 1 ≈ 1.718.

O procedimento pode ser resumido no seguinte algoritmo:

1. Gerar n amostras Ui ∼ U (0, 1), i = 1, . . . , n.

2. Calcular Xi = eUi e Yi = Ui .

d ( X, Y ) e Var
3. Estimar Cov d (Y ) a partir dos dados.

4. Determinar ĉ∗ = −Cov


d ( X, Y )/Var
d (Y ) .

5. Construir o estimador controlado


1 n  
θ̂ctrl = ∑
n i =1
Xi + ĉ∗ (Yi − µY ) .

6.3 Redução de Variância por Condicionamento


Uma técnica bastante útil para reduzir a variância em simulação é o uso de condicionamento. A
ideia se baseia diretamente na fórmula da variância condicional:

Var( X ) = E Var( X | Y ) + Var E[ X | Y ] .


  

A demonstração é simples. Por definição,


2
Var( X ) = E[ X 2 ] − E[ X ] .

Pela propriedade da esperança condicional,


2
Var( X ) = E E[ X 2 | Y ] − E[E[ X | Y ]] .
 

Agora, observe que


2
E[ X 2 | Y ] = Var( X | Y ) + E[ X | Y ] .

Portanto,
E E[ X 2 | Y ] = E Var( X | Y ) + E (E[ X | Y ])2 .
     

Substituindo de volta,
  
Var( X ) = E Var( X | Y ) + E[(E[ X | Y ])2 ] − (E[ X ])2 ,

78 CAPÍTULO 6. REDUÇÃO DE VARIÂNCIA
e o termo entre parênteses é precisamente Var(E[ X | Y ]).
Assim, chegamos à decomposição

Var( X ) = E Var( X | Y ) + Var E[ X | Y ] .


  

Como E[Var( X | Y )] ≥ 0, segue que

Var( X ) ≥ Var E[ X | Y ] ,


portanto, podemos utilizar Z = E[ X | Y ] como variável para simularmos, já que E[ Z ] = E[ X ].


Uma forma de entender por que o condicionamento reduz a variância é pensar no problema
de estimar a altura média de uma população. Se representarmos por X a altura de uma pessoa
escolhida ao acaso, cada sorteio pode resultar em valores muito diferentes, como um homem de
1,90 m ou uma mulher de 1,55 m, e essa variabilidade individual é refletida em Var( X ). Agora,
suponha que introduzimos uma variável Y que indica o grupo ao qual a pessoa pertence, por
exemplo, sexo masculino ou feminino. Em vez de registrar a altura individual X, passamos a
registrar a média do grupo correspondente, isto é,

Z = E[ X | Y ].

Se a pessoa sorteada for um homem, usamos a média de alturas dos homens (digamos, 175 cm);
se for uma mulher, usamos a média das mulheres (digamos, 162 cm). Note que a média global
continua correta: metade das vezes registramos 175, metade das vezes 162, o que resulta em
168,5 cm, exatamente a média real da população.
A identidade
Var( X ) = E[Var( X | Y )] + Var(E[ X | Y ])

mostra como essa substituição reduz a variância. O primeiro termo corresponde à variabilidade
dentro de cada grupo (diferenças entre indivíduos do mesmo sexo), enquanto o segundo termo
corresponde à variabilidade entre as médias dos grupos (diferença entre a média dos homens e a
das mulheres). Quando usamos diretamente X, ambos os termos estão presentes; quando usamos
E[ X | Y ], eliminamos o primeiro termo e ficamos apenas com a variabilidade entre grupos.
Assim, o estimador permanece não-viesado, mas com menor variância. Em outras palavras,
condicionar equivale a substituir um indivíduo ruidoso pela média de seu grupo, preservando a
esperança e reduzindo a dispersão.

O procedimento para estimar θ = E[ X ] via condicionamento pode ser descrito da seguinte


forma:

1. Identificar uma variável auxiliar Y em relação à qual seja possível calcular E[ X | Y ] de


forma analítica ou computacionalmente simples.

2. Gerar amostras Y1 , Y2 , . . . , Yn da distribuição de Y.

3. Para cada Yi , calcular Zi = E[ X | Yi ].


6.3. REDUÇÃO DE VARIÂNCIA POR CONDICIONAMENTO 79
4. Usar a média amostral
1 n
n i∑
θ̂ = Zi
=1

como estimador de θ.

Esse algoritmo gera um estimador não-viesado de θ, mas com variância reduzida em compa-
ração ao estimador usual baseado diretamente em X.

Exemplo 22. Queremos estimar π via simulação. Podemos gerar dois números aleatórios U1 , U2 ∼
U (0, 1) e definir
Vi = 2Ui − 1, i = 1, 2,

de modo que V1 , V2 ∼ U (−1, 1). Se considerarmos

I = 1{V12 + V22 ≤ 1},

então E[ I ] = π/4, pois a probabilidade de um ponto uniforme em [−1, 1]2 cair dentro do círculo unitário
é exatamente a razão entre a área do círculo e a área do quadrado. Assim, uma estimativa usual seria

4 n
n i∑
π̂ = Ii .
=1

Podemos, porém, melhorar esse estimador aplicando a técnica de condicionamento. Em vez de usar I
diretamente, consideremos E[ I | V1 ]. Temos

E[ I | V1 = v] = P V12 + V22 ≤ 1 V1 = v .


Isso equivale a
E[ I | V1 = v] = P V22 ≤ 1 − v2 .

80 CAPÍTULO 6. REDUÇÃO DE VARIÂNCIA
Como V2 ∼ U (−1, 1) e é independente de V1 , temos
p p
P V22 ≤ 1 − v2 = P − 1 − v2 ≤ V2 ≤ 1 − v2 .
 

Portanto,
Z √1− v2
1 p
E[ I | V1 = v] = √ dx = 1 − v2 .
− 1− v2 2
Assim, obtemos o estimador condicionado
q
Z= 1 − V12 ,

que satisfaz E[ Z ] = π/4, mas tem variância menor do que I.


Finalmente, se U ∼ U (0, 1), temos V1 = 2U − 1, e portanto
q
Z = 1 − (2U − 1)2 .

Logo, podemos simular π a partir do estimador


4 n
q
n i∑
π̂ = 1 − (2Ui − 1)2 ,
=1

que é mais eficiente do que usar diretamente o indicador I.

Exemplo 23. Considere a seguinte modelagem para a altura em uma população. Seja Y ∼ Bernoulli( p)
a variável que indica o sexo do indivíduo, em que Y = 0 representa mulher e Y = 1 representa homem.
Condicionalmente a Y, a altura X tem distribuição normal

X | Y = 0 ∼ N (µ f , σ2f ), X | Y = 1 ∼ N (µm , σm2 ).

Nosso objetivo é estimar a média da população,

θ = E[ X ] = (1 − p)µ f + pµm .

Se gerarmos indivíduos completos, isto é, sorteando Y e depois X | Y, o estimador de Monte Carlo é


1 n
n i∑
θ̂simples = Xi ,
=1

que é não viesado para θ, mas apresenta variância

Var( X ) = (1 − p)σ2f + pσm2 + p(1 − p)(µm − µ f )2 .

Em vez de usar diretamente X, podemos aplicar condicionamento. Nesse caso, registramos Z = E[ X |


Y ], ou seja, µ f se Y = 0 e µm se Y = 1. O estimador correspondente é

1 n
n i∑
θ̂cond = Zi ,
=1

que também é não viesado para θ, mas com variância

Var( Z ) = p(1 − p)(µm − µ f )2 ,

estritamente menor do que Var( X ), pois elimina a variabilidade interna de cada grupo (σ2f e σm2 ). Assim,
ao invés de considerar a altura ruidosa de cada indivíduo, utilizamos a média condicional do grupo, que é
mais estável e resulta em um estimador mais eficiente.
Capítulo 7

Amostragem por importância

Considere uma variável aleatória X com densidade f ( x ). Nosso objetivo é calcular


Z
θ = E[h( X )] = h( x ) f ( x ) dx.

Em alguns casos, uma simulação direta de X ∼ f pode ser ineficiente:

• pode ser difícil gerar amostras segundo f ;

• a variância de h( X ) sob f pode ser grande;

• ou ainda uma combinação desses fatores.

Uma alternativa é escolher uma outra densidade g( x ) tal que f ( x ) = 0 sempre que g( x ) = 0.
Nesse caso, podemos reescrever
 
f (x) f (X)
Z
θ = h( x ) g( x ) dx = Eg h( X ) ,
g( x ) g( X )
onde Eg denota esperança em relação à densidade g.
Assim, se gerarmos X1 , . . . , Xn ∼ g, um estimador natural é

1 n f ( Xi )
θ̂ = ∑
n i =1
h ( Xi )
g ( Xi )
.

Se a densidade instrumental g for bem escolhida, a variância do peso h( X ) f ( X )/g( X ) pode


ser bem menor do que a variância de h( X ) sob f , resultando em uma estimação mais eficiente.
Note que f ( x ) e g( x ) representam as probabilidades relativas de se observar x quando X ∼ f
ou X ∼ g. Quando X ∼ g, em geral a razão f ( x )/g( x ) é menor que 1, mas como
 
f (X)
Eg = 1,
g( X )
ela ocasionalmente assume valores grandes, podendo gerar alta variância.
A ideia central da amostragem por importância é escolher g de modo que nesses pontos onde
f ( x )/g( x ) é grande, a função h( x ) seja pequena (ou mesmo nula). Dessa forma, o produto
f (X)
W ( X ) = h( X )
g( X )

81
82 CAPÍTULO 7. AMOSTRAGEM POR IMPORTÂNCIA
permanece controlado, evitando explosões na variância.

Esse raciocínio mostra por que a técnica é especialmente eficaz na estimação de probabilida-
des raras. Nesse caso, h( x ) é uma função indicadora de um conjunto A pouco provável sob f . Se
escolhermos g de modo que A seja mais frequente, então:

• para x ∈ A, temos h( x ) = 1 e a razão f ( x )/g( x ) é moderada;

• para x ∈
/ A, temos h( x ) = 0, logo não importa se f ( x )/g( x ) é grande.

Assim, o estimador se torna muito mais estável e com variância reduzida, o que torna a
amostragem por importância uma ferramenta poderosa para lidar com eventos raros.

7.1 Densidades Inclinadas (Tilted Densities)

Uma questão central em amostragem por importância é a escolha da densidade instrumental


g( x ). Uma família bastante útil é a das densidades inclinadas, definidas a partir da função geradora
de momentos.
Seja X ∼ f uma variável aleatória com função geradora de momentos
Z
M (t) = E f [etX ] = etx f ( x ) dx.

Definição 1. A densidade inclinada de f , associada ao parâmetro t ∈ R, é definida por

etx f ( x )
f t (x) = .
M(t)

Intuitivamente, a densidade f t dá mais peso a valores grandes de X quando t > 0 e mais peso
a valores pequenos quando t < 0. Em muitos casos, f t pertence à mesma família paramétrica de
f , mas com parâmetros modificados.

Alguns exemplos:

• Normal. Se X ∼ N (µ, σ2 ), então f t é N (µ + tσ2 , σ2 ). Nesse caso, o tilt desloca a média,


concentrando a massa de probabilidade à direita quando t > 0 e à esquerda quando t < 0.

• Exponencial. Se X ∼ Exp(λ), então f t é Exp(λ − t), válido para t < λ. Aqui, o tilt altera o
comportamento da cauda: para t > 0, a distribuição decai mais rápido (cauda mais leve),
enquanto para t < 0 a cauda se torna mais pesada.

• Gama. Se X ∼ Gamma(α, β), então f t é Gamma(α, β − t), válido para t < β. Assim como
na exponencial (caso particular da gama), o tilt controla a espessura da cauda, deixando-a
mais leve quando t > 0 e mais pesada quando t < 0.

• Poisson. Se X ∼ Poisson(λ), então f t é Poisson(λet ). Nesse caso, o tilt modifica a média


exponencialmente: para t > 0, a distribuição se desloca para valores grandes, enquanto
para t < 0 se concentra em valores pequenos.
7.1. DENSIDADES INCLINADAS (TILTED DENSITIES) 83
• Binomial. Se X ∼ Binomial(n, p), então f t é Binomial(n, pt ) com

pet
pt = .
1 − p + pet

Aqui, o tilt altera diretamente a probabilidade de sucesso: quando t > 0 temos pt > p, o
que força mais sucessos, e quando t < 0 temos pt < p, forçando mais fracassos.

Exercício 26. Prove as afirmações acima.

Exemplo 24 (Estimando probabilidades raras). Sejam X1 , . . . , Xn variáveis aleatórias independentes


com densidades (funções de massa ou de probabilidade) f i , para i = 1, . . . , n. Defina
n n
S= ∑ Xi , µ= ∑ E [ Xi ] .
i =1 i =1

Nosso objetivo é estimar a probabilidade de que S seja maior do que um limiar a, onde a ≫ µ, isto é,

θ = P( S > a ) = E 1 { S > a } .
 

Quando a é muito maior que a média µ, esse evento é raro, e portanto uma simulação direta via Monte
Carlo ingênuo é ineficiente, pois apenas uma fração ínfima das amostras contribui para o cálculo do esti-
mador. Uma alternativa é utilizar a técnica de amostragem por importância com densidades inclinadas.
Seja
etx f i ( x )
f i,t ( x ) = , Mi (t) = E[etXi ],
Mi ( t )
a densidade inclinada de Xi , onde t > 0 é um parâmetro comum a todas as variáveis. Ao simular cada Xi
segundo f i,t , obtemos que " #
n
θ = Et 1{S>a} exp(−tS) ∏ Mi (t) ,
i =1

onde Et denota esperança sob as densidades inclinadas.


A partir dessa representação, segue naturalmente um estimador de Monte Carlo:
N n
1
∑ 1{S( ) >a} exp − tS( j) ∏ Mi ( t ) ,

θ̂ = j
N j =1 i =1

( j) ( j)
onde S( j) = ∑in=1 Xi e cada Xi é simulado de f i,t .
A escolha de t é crucial: se for muito pequeno, a distribuição inclinada pouco difere da original e o
evento {S > a} continua raro. Se for muito grande, os pesos podem se tornar instáveis, aumentando a
variância. O critério usual é escolher t de forma que

Et [S] ≈ a,

ou seja, deslocar a média da soma sob a medida inclinada para próximo do limiar a. Dessa forma, amostras
são concentradas justamente nas regiões que mais contribuem para o evento raro, aumentando a eficiência
do método.

O algoritmo pode ser resumido da seguinte forma:


84 CAPÍTULO 7. AMOSTRAGEM POR IMPORTÂNCIA
1. Escolha t > 0 de modo que Et [S] ≈ a.

2. Para j = 1, . . . , N:
( j) ( j)
(a) Gere X1 , . . . , Xn independentemente segundo as densidades inclinadas f i,t .
( j)
(b) Calcule S( j) = ∑in=1 Xi .
(c) Associe o peso
n
W ( j) = 1{S( j) >a} exp(−tS( j) ) ∏ Mi (t).
i =1

3. Estime θ por
N
1
θ̂ =
N ∑ W ( j) .
j =1

No caso particular em que cada Xi ∼ N (0, 1), temos que a soma S = ∑in=1 Xi é normal N (0, n).
Quando n = 1, por exemplo, estimar P(S > 5) é um evento extremamente raro, pois o valor exato dessa
probabilidade é
θ = P(S > 5) ≈ 2.87 × 10−7 .
Um procedimento de Monte Carlo ingênuo, baseado apenas em amostrar de N (0, 1), é ineficiente: em uma
simulação com N = 200,000 repetições, a estimativa obtida foi de aproximadamente 5.0 × 10−6 , um valor
que não coincide com o verdadeiro devido à raridade do evento.
Aplicando a técnica de densidades inclinadas, obtemos que a tilted density é
etx f ( x ) 1 2

f t (x) = , M(t) = exp 2t ,
M(t)
o que implica que f t é a densidade de uma normal N (t, 1). Ao escolher t = 5, a distribuição inclinada
desloca a média exatamente para o limiar de interesse. O peso associado a cada amostra é dado por

W = 1{S>5} exp(−tS + 12 t2 ).

Nesse caso, a estimativa via amostragem por importância com N = 200,000 simulações foi

θ̂tilt ≈ 2.87 × 10−7 ,

em perfeito acordo com o valor teórico.


7.2. DESIGUALDADE DE CHERNOFF 85
7.2 Desigualdade de Chernoff
A inclinação exponencial (exponential tilting) introduzida anteriormente também pode ser enten-
dida como uma mudança de medida aplicada diretamente às probabilidades. Essa é, essenci-
almente, a mesma ideia usada no exemplo normal, em que substituímos f = N (0, 1) por sua
versão inclinada f λ = N (λ, 1), de modo que o evento raro { X > 10} se torne típico sob a nova
distribuição.
Seja X uma variável aleatória com densidade f , e defina a densidade inclinada:

eλx f ( x )
f λ (x) = , Z (λ) = E f [eλX ].
Z (λ)
Podemos então expressar qualquer probabilidade como uma esperança sob essa nova medida:
 
f (x) f (X)
Z Z
P( X ≥ a ) = f ( x ) dx = f λ ( x ) dx = Eλ 1{ X ≥ a} .
x≥a x≥a f λ ( x ) fλ (X)
Usando a definição de f λ , a razão de verossimilhança é
f (X)
= e−λX +ψ(λ) ,
fλ (X)
e portanto h i h i
P( X ≥ a) = Eλ e−λX +ψ(λ) 1{ X ≥ a} = Z (λ)Eλ e−λX 1{ X ≥ a} .
Essa identidade expressa a probabilidade de um evento raro como uma esperança sob a me-
dida inclinada f λ . Em princípio, essa igualdade poderia ser usada para estimação — poderíamos
simular de f λ e calcular a média dos pesos e−λX +ψ(λ) 1{ X ≥ a}, exatamente como em importance
sampling. No entanto, se o objetivo não é estimar, mas limitar a probabilidade, podemos substituir
o peso aleatório e−λX por um limite superior determinístico que vale no evento de interesse.
No evento { X ≥ a}, temos e−λX ≤ e−λa . Aplicando essa desigualdade dentro da esperança
obtemos:
P( X ≥ a) ≤ e−λa Eλ [eψ(λ) 1{ X ≥ a}] = e−λa+ψ(λ) Pλ ( X ≥ a).
Como Pλ ( X ≥ a) ≤ 1, chegamos finalmente a

P( X ≥ a) ≤ exp − λa + ψ(λ) .


Esse passo transforma a identidade exata do importance sampling em um limite superior deter-
minístico — a Desigualdade de Chernoff. Mostra que a mesma inclinação exponencial usada para
redução de variância em estimação Monte Carlo também fornece uma maneira analítica elegante
de controlar probabilidades de eventos raros.
O limite obtido acima depende do parâmetro λ. Diferentes valores de λ correspondem a
diferentes distribuições inclinadas f λ e, portanto, a diferentes mudanças de medida. Para obter
o limite mais apertado, minimizamos o expoente:

P( X ≥ a) ≤ inf exp − λa + ψ(λ) .



λ >0

O valor ótimo λ⋆ satisfaz a condição de primeira ordem:

ψ′ (λ⋆ ) = a.
86 CAPÍTULO 7. AMOSTRAGEM POR IMPORTÂNCIA
Para entender a condição para λ⋆ ótimo, calculemos a derivada da função log-partição. A
partir de Z
ψ(λ) = log eλx f ( x ) dx,
derivando em relação a λ obtemos:
R λx
′ xe f ( x ) dx
ψ (λ) = R λx .
e f ( x ) dx
Essa expressão pode ser reconhecida como a média de X sob a densidade inclinada f λ ( x ) ∝
eλx f ( x ):
ψ ′ ( λ ) = Eλ [ X ] .
Portanto, a derivada da função log-partição coincide com o valor esperado de X sob a inclinação
exponencial. No valor ótimo λ⋆ , temos:

Eλ [ X ] = ψ′ (λ⋆ ) = a,

o que significa que, sob a inclinação ótima, a média de X é igual ao limiar a. Em termos proba-
bilísticos, isso mostra que a distribuição f λ⋆ torna o evento { X ≥ a} típico — seu valor médio já
se encontra na fronteira da região rara que estamos tentando estudar.

7.3 Variância sob Inclinação Exponencial


Já vimos que a medida inclinada f λ torna a região de interesse, como X > a, típica. A inclinação
ótima é alcançada quando ψ′ (λ) = a, pois ψ′ (λ) = Eλ [ X ] é a média de X sob a distribuição
inclinada. Em outras palavras, o parâmetro λ desloca a distribuição de modo que sua esperança
coincida com o ponto que queremos estimar.
Para avaliar a qualidade dessa reponderação, uma quantidade natural a estudar é a vari-
ância do estimador sob a medida inclinada. Se a distribuição inclinada permanece altamente
concentrada em torno de sua média, os pesos do importance sampling são estáveis e o estimador
é eficiente. Por outro lado, se a lei inclinada é muito dispersa, os pesos flutuam fortemente e o
estimador sofre com alta variância. Assim, a concentração da distribuição inclinada fornece uma
medida direta da qualidade do estimador de importance sampling.
Essa concentração é capturada pela segunda derivada da função log-partição. De fato, a partir
de h i
ψ(λ) = log E eλX ,
temos
E
 λX 
Xe
ψ′ (λ) = = Eλ [ X ] ,
E [eλX ]
que representa a média de X sob a distribuição inclinada. Derivando novamente,
 !2
E X 2 eλX E XeλX
  
′′
E X − (Eλ [ X ])2 = Varλ [ X ] .
 2
ψ (λ) = − =
E [eλX ] E [eλX ]
λ

Portanto, a curvatura da log-partição quantifica quão concentrada é a medida inclinada em torno


de sua média e, consequentemente, quão eficiente será o estimador de importance sampling.
7.3. VARIÂNCIA SOB INCLINAÇÃO EXPONENCIAL 87
Em alguns casos, essa variância pode ser uniformemente limitada para todos os valores de
λ. Por exemplo, quando X é uma variável aleatória limitada tal que X ∈ [ a, b], a variância sob
qualquer medida inclinada satisfaz
( b − a )2
Varλ [ X ] ≤ .
4
De fato, a distância de X ao ponto médio do intervalo ( a, b) é sempre menor que metade do
comprimento do intervalo, isto é,
a+b b−a
X− ≤ .
2 2
Seja m = a+2 b . Então,
b−a 2
 
2
( X − m) ≤ .
2
Tomando expectativas sob a lei inclinada, obtemos
b−a 2
 
Eλ ( X − m )2 ≤
 
.
2
Além disso, para qualquer constante c,

Varλ [ X ] = min Eλ ( X − c)2 ≤ Eλ ( X − m)2 ,


   
c ∈R
de modo que
b−a 2
 
Varλ [ X ] ≤ .
2
Isso mostra que, para qualquer variável aleatória limitada, a variância sob inclinação exponencial
permanece uniformemente controlada. Em particular, a curvatura da função log-partição — que
determina tanto a concentração da lei inclinada quanto a estabilidade do estimador de importance
sampling — não pode crescer sem limite.
Agora suponha que X é centrada, isto é, E [ X ] = 0. Então, por definição,
h i
ψ(0) = log E e0·X = 0, ψ′ (0) = E [ X ] = 0.

Pela expansão de Taylor de segunda ordem de ψ, existe algum θ ∈ (0, λ) tal que
λ2 ′′ λ2 λ2
ψ ( λ ) = ψ (0) + ψ ′ (0) λ + ψ (θ ) = Varθ [ X ] ≤ sup Varθ [ X ] .
2 2 2 θ ∈(0,λ)
Em particular, conhecer o comportamento da variância sob inclinação permite controlar toda
a forma da função log-partição. Se a variância inclinada permanece uniformemente limitada,
a curvatura de ψ também é limitada, e os momentos exponenciais de X crescem no máximo
quadraticamente em λ.
No caso especial de variáveis limitadas, combinando isso com o limite uniforme sobre a
variância inclinada obtemos
λ2 ( b − a )2
ψ(λ) ≤ .
8
Esse resultado mostra que, sempre que a variância sob inclinação exponencial é uniformemente
limitada, a função log-partição cresce no máximo quadraticamente em λ. O crescimento qua-
drático da log-partição é precisamente a marca do comportamento sub-Gaussiano. Na próxima
seção, formalizamos essa conexão e mostramos como ela permite controlar probabilidades de
eventos raros mesmo quando a função log-partição exata é desconhecida.
88 CAPÍTULO 7. AMOSTRAGEM POR IMPORTÂNCIA
7.4 Variáveis Sub-Gaussianas e Desigualdade de Hoeffding
Suponha que desejamos aplicar inclinação exponencial em importance sampling, mas a função
log-partição
ψ(λ) = log E[eλX ]
é desconhecida ou muito difícil de calcular exatamente. Nesse caso, muitas vezes basta conhecer
um limite superior para ψ(λ). Se pudermos encontrar uma função simples que domina a log-
partição verdadeira, ainda podemos controlar probabilidades de eventos raros e obter limites
exponenciais.
Por exemplo, suponha que sabemos que
σ 2 λ2
ψ(λ) ≤ , ∀λ ∈ R.
2
Isso significa que os momentos exponenciais de X crescem no máximo como os de uma variável
normal com variância σ2 . Dizemos então que X é sub-Gaussiana com parâmetro de variância σ2 .
Recorde que, sob inclinação exponencial, a probabilidade de um evento raro pode ser escrita
como h i h i
P( X ≥ a) = Eλ e−λX +ψ(λ) 1{ X ≥ a} = eψ(λ) Eλ e−λX 1{ X ≥ a} .
Se a função log-partição exata é desconhecida, podemos substituí-la por qualquer limite superior
válido. Usando a condição sub-Gaussiana acima, o argumento de Chernoff fornece
σ 2 λ2
P( X ≥ a) ≤ inf e−λa+ψ(λ) ≤ inf e−λa+ 2 .
λ >0 λ >0

Minimizando o expoente em relação a λ, obtemos λ⋆ = a/σ2 , o que dá


a2
 
P( X ≥ a) ≤ exp − 2 .

Portanto, qualquer variável aleatória cuja função log-partição é limitada por uma função quadrá-
tica apresenta cauda do tipo Gaussiana. Mesmo que não possamos realizar importance sampling
exato sem conhecer a constante de normalização eψ(λ) , a desigualdade acima fornece uma esti-
mativa analítica precisa da probabilidade de evento raro.

Como vimos na seção anterior, variáveis limitadas satisfazem um limite uniforme na variância
inclinada, e, portanto, sua função log-partição cresce no máximo quadraticamente. Isso significa
que qualquer variável limitada é automaticamente sub-Gaussiana, com parâmetro
( b − a )2
σ2 = .
4
Essa observação leva diretamente a um dos resultados mais fundamentais na teoria das desi-
gualdades de concentração, conhecido como Lema de Hoeffding, que formaliza esse fato e fornece
limites exponenciais explícitos para variáveis limitadas.

Teorema 6 (Lema de Hoeffding). Seja X uma variável aleatória tal que X ∈ [ a, b] e E [ X ] = 0. Então,
para todo λ ∈ R,
h i λ2 ( b − a )2
ψ(λ) = log E eλX ≤ .
8
Em particular, X é sub-Gaussiana com parâmetro de variância σ2 = (b − a)2 /4.
7.5. POR QUE A INCLINAÇÃO EXPONENCIAL? 89
O lema de Hoeffding implica imediatamente um limite exponencial para a soma de variáveis
limitadas independentes.

Teorema 7 (Desigualdade de Hoeffding). Sejam X1 , . . . , Xn variáveis aleatórias independentes tais que


Xi ∈ [ ai , bi ] e E [ Xi ] = 0 para todo i. Então, para qualquer t > 0,
!
n
2t2
 
P ∑ Xi ≥ t ≤ exp − n .
i =1 ∑ i = 1 ( bi − a i ) 2

Demonstração. Pelo lema de Hoeffding, cada Xi satisfaz


 2
λ ( bi − a i ) 2
h i 
E e λXi
≤ exp .
8
Como os Xi são independentes,
!
n n
h i h i λ2
E e λ ∑in=1 Xi
= ∏E e λXi
≤ exp ∑ ( bi − a i ) 2
.
i =1
8 i =1

Aplicando o limite de Chernoff,


! !
n n
λ2
P ∑ Xi ≥ t ≤ inf exp −λt +
λ >0 8 ∑ ( bi − a i ) 2 .
i =1 i =1

Minimizando o expoente em relação a λ, obtemos


4t
λ⋆ = ,
∑in=1 (bi − a i )2
e substituindo esse valor,
!
n
2t2
 
P ∑ Xi ≥ t ≤ exp − n
∑ i = 1 ( bi − a i ) 2
,
i =1

o que conclui a prova.

Essa desigualdade mostra que somas de variáveis aleatórias limitadas independentes exibem
2
concentração do tipo Gaussiana: suas caudas decaem tão rapidamente quanto e−ct , com uma
constante determinada apenas pela largura dos intervalos [ ai , bi ]. No contexto de importance
sampling, isso significa que, quando cada componente do estimador é limitado, o estimador
como um todo permanece estável — a variância efetiva da medida inclinada não pode explodir.

7.5 Por que a Inclinação Exponencial?


Ao realizar importance sampling, pode surgir a pergunta: por que usar a inclinação exponencial em
vez de qualquer outra distribuição com a mesma média? Afinal, muitas reponderações podem
satisfazer Eg [ X ] = a. O que torna a inclinação exponencial especial?

Para entender isso, fazemos um breve desvio pela dualidade convexa. Dada uma função
convexa ψ : Rd → R ∪ {+∞}, seu conjugado convexo (ou dual de Fenchel) é definido por

ψ∗ (y) = sup { ⟨y, x ⟩ − ψ( x ) }.


x ∈Rd
90 CAPÍTULO 7. AMOSTRAGEM POR IMPORTÂNCIA
Essa transformação troca os papéis de x e y, convertendo restrições lineares no espaço primal em
funções suaves no espaço dual.
Um exemplo central dessa construção é a função log-partição
h i
ψ(λ) = log E f eλX ,

que é convexa em λ. Seu conjugado convexo é obtido aplicando a mesma regra:

ψ∗ ( a) = sup{ λa − ψ(λ) }.
λ ∈R

Vamos agora calcular ψ∗ ( a) explicitamente. Para qualquer densidade g absolutamente contí-


nua em relação a f e qualquer λ ∈ R,
 
λX f ( X )
h i
ψ(λ) = log E f e λX
= log Eg e ≥ Eg [λX + log f ( X ) − log g( X )] = λEg [ X ] − DKL ( g∥ f ),
g( X )

onde a desigualdade segue da desigualdade de Jensen. Se Eg [ X ] = a, obtemos

DKL ( g∥ f ) ≥ λa − ψ(λ) para todo λ.

Como essa desigualdade vale para qualquer λ, o lado esquerdo deve ser maior ou igual ao
maior valor possível do lado direito. Aplicando esse raciocínio, temos

DKL ( g∥ f ) ≥ sup{λa − ψ(λ)}.


λ

Como isso vale para todo g satisfazendo Eg [ X ] = a, também vale para o menor valor possível
do lado esquerdo, isto é,

inf DKL ( g∥ f ) ≥ sup{λa − ψ(λ)} = ψ∗ ( a).


g:Eg [ X ]= a λ

O ponto que maximiza a definição do conjugado

ψ∗ ( a) = sup{λa − ψ(λ)}
λ

é encontrado ao anular a derivada em relação a λ:

E f XeλX
 
d  ′
λa − ψ(λ) = a − ψ (λ) = a − .
dλ E f [eλX ]

Essa expressão zera no ponto λ = λ a tal que

E f λa [ X ] = a.

Substituindo esse valor no conjugado, obtemos

ψ∗ ( a) = aλ a − ψ(λ a ).

Podemos agora verificar que a mesma expressão surge da divergência de Kullback–Leibler:


 
f λa ( X )
DKL ( f λa ∥ f ) = E f λa log = E f λa [λ a X − ψ(λ a )] .
f (X)
7.5. POR QUE A INCLINAÇÃO EXPONENCIAL? 91
Como E f λa [ X ] = a, isso se simplifica para

DKL ( f λa ∥ f ) = λ a a − ψ(λ a ) = ψ∗ ( a).

Anteriormente, estabelecemos a desigualdade

DKL ( g∥ f ) ≥ λa − ψ(λ) para todo g com Eg [ X ] = a e todo λ,

o que implica
inf DKL ( g∥ f ) ≥ ψ∗ ( a).
g:Eg [ X ]= a

Ao exibir a distribuição específica g = f λa que atinge a igualdade,

DKL ( f λa ∥ f ) = λ a a − ψ(λ a ) = ψ∗ ( a),

vemos que a desigualdade é exata, e a inclinação exponencial f λa atinge o ínfimo:

ψ∗ ( a) = inf DKL ( g∥ f ).
g:Eg [ X ]= a

Em outras palavras, entre todas as distribuições g cuja média é a, a inclinação exponencial


f λa é a mais próxima de f no sentido da divergência de Kullback–Leibler. Ela resolve, portanto,
o problema de otimização com restrição

min DKL ( g∥ f ),
g:Eg [ X ]= a

mostrando que a inclinação exponencial não é uma escolha arbitrária, mas sim a escolha ótima
ditada pela dualidade convexa.
92 CAPÍTULO 7. AMOSTRAGEM POR IMPORTÂNCIA
Capítulo 8

Cadeias de Markov e MCMC

A simulação é uma técnica extremamente poderosa em probabilidade e estatística. Quando não


conseguimos calcular analiticamente quantidades como a média ou a variância de uma variável
aleatória X, podemos gerar amostras independentes X1 , X2 , . . . , Xn dessa distribuição e aproxi-
mar os valores verdadeiros por meio de estimadores amostrais:

n
1 1
E( X ) ≈
n
( X1 + · · · + X n ) = X n , Var( X ) ≈
n−1 ∑ ( X j − X n )2 .
j =1

A lei dos grandes números garante que essas aproximações serão boas se n for grande. Pode-
mos melhorar cada vez mais a aproximação aumentando n, bastando rodar o computador por
mais tempo (em vez de lidar com uma soma ou integral possivelmente intratável). Como dis-
cutido no Capítulo 10, essa abordagem, em que geramos valores aleatórios para aproximar uma
quantidade, é chamada de método de Monte Carlo.
Uma limitação importante da ideia de Monte Carlo é que precisamos saber como gerar as
amostras X1 , . . . , Xn (de preferência de forma eficiente, pois queremos n grande). Por exemplo,
suponha que desejamos simular de uma distribuição contínua com função densidade

f ( x ) ∝ x3.1 (1 − x )4.2 , 0 < x < 1.

Olhando apenas para a função de densidade, não é óbvio como obter uma variável aleatória com
essa distribuição. Reconhecemos, no entanto, que se trata de uma Beta(4.1, 5.2). Mesmo assim,
inverter a função de distribuição acumulada é difícil, e em distribuições mais complicadas nem
sequer conhecemos a constante de normalização da densidade.
Essas dificuldades motivam o uso de um conjunto poderoso de algoritmos que revolucio-
naram a estatística e a computação científica: os métodos de Monte Carlo via Cadeias de Markov
(MCMC). A ideia central é construir uma cadeia de Markov cuja distribuição estacionária seja
justamente a distribuição de interesse.

Antes de estudarmos o MCMC em si, precisamos entender melhor o objeto central que sus-
tenta esses métodos: as cadeias de Markov.

93
94 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
8.1 Cadeias de Markov (Resumo)
Cadeias de Markov “vivem” tanto no espaço quanto no tempo: o conjunto de valores possíveis
de Xn é chamado de espaço de estados, enquanto o índice n representa a evolução do processo ao
longo do tempo.
O espaço de estados de uma cadeia de Markov pode ser discreto ou contínuo, e o tempo
também pode ser discreto ou contínuo. Neste capítulo vamos focar exclusivamente em cadeias
de Markov com tempo discreto e espaço de estados finito. Em particular, assumiremos que Xn assume
valores em um conjunto finito, que usualmente denotamos por {1, 2, . . . , M} ou {0, 1, . . . , M }.

Definição 2 (Cadeia de Markov). Uma sequência de variáveis aleatórias X0 , X1 , X2 , . . . com valores no


espaço de estados {1, 2, . . . , M} é chamada de cadeia de Markov se, para todo n ≥ 0,

P( Xn+1 = j | Xn = i, Xn−1 = in−1 , . . . , X0 = i0 ) = P( Xn+1 = j | Xn = i ).

A condição acima é chamada de propriedade de Markov. Ela afirma que, dado o presente, o
passado e o futuro são condicionalmente independentes. Ou seja, para prever o próximo estado,
basta conhecer o estado atual.
Para descrever a dinâmica de uma cadeia de Markov, precisamos conhecer as probabilidades
de transição de qualquer estado para qualquer outro.

Definição 3 (Matriz de transição). Seja X0 , X1 , X2 , . . . uma cadeia de Markov com espaço de estados
{1, 2, . . . , M}. Definimos
qij = P( Xn+1 = j | Xn = i ),
M
como a probabilidade de transição do estado i para o estado j. A matriz Q = (qij )i,j =1 é chamada de matriz
de transição da cadeia.

A matriz de transição Q é não-negativa e cada linha soma 1, pois, dado um estado inicial i, a
cadeia deve transitar para algum estado do espaço.

Exemplo 25 (Cadeia chuva-sol). Suponha que em cada dia o clima possa ser chuvoso (R) ou ensolarado
(S). Se hoje está chuvoso, amanhã estará chuvoso com probabilidade 1/3 e ensolarado com probabilidade
2/3. Se hoje está ensolarado, amanhã estará chuvoso com probabilidade 1/2 e ensolarado com probabilidade
1/2.
Definindo Xn como o clima no dia n, temos uma cadeia de Markov com espaço de estados { R, S} e
matriz de transição !
1/3 2/3
Q= ,
1/2 1/2
onde a primeira linha corresponde ao estado R e a segunda ao estado S.

Uma vez conhecida a matriz de transição Q de uma cadeia de Markov, podemos calcular as
probabilidades de transição em horizontes de tempo maiores que um passo.

Definição 4 (Probabilidade de transição em n passos). A probabilidade de transição em n passos


do estado i para o estado j é a probabilidade de estarmos em j exatamente n passos após termos começado
em i. Denotamos por
(n)
qij = P( Xn = j | X0 = i ).
8.1. CADEIAS DE MARKOV (RESUMO) 95
Por exemplo, para n = 2, temos
∑ qik qkj ,
(2)
qij =
k
pois para ir de i a j em dois passos, a cadeia precisa ir primeiro de i até algum estado intermediá-
rio k, e depois de k até j. A propriedade de Markov garante a independência condicional dessas
transições.
Note que o lado direito corresponde exatamente ao elemento (i, j) da matriz Q2 , pela defini-
ção de multiplicação de matrizes. Portanto, a matriz Q2 fornece as probabilidades de transição
em dois passos.
De maneira geral, por indução obtemos que
(n)
qij é a entrada (i, j) da matriz Qn .

Exemplo 26 (Matriz de transição de uma cadeia de Markov com 4 estados). Considere a cadeia
de Markov com 4 estados representada na Figura abaixo. Quando não há probabilidades escritas sobre as
setas, isso significa que todas as transições saindo de um mesmo estado são igualmente prováveis.
Por exemplo, existem 3 setas saindo do estado 1, de modo que as transições 1 → 3, 1 → 2 e 1 → 1
ocorrem cada uma com probabilidade 1/3. Portanto, a matriz de transição da cadeia é
 
1/3 1/3 1/3 0
 
 0 0 1/2 1/2
Q=  .
 0 1 0 0 
1/2 0 0 1/2

Para calcular a probabilidade de que a cadeia esteja no estado 3 após 5 passos, partindo do estado 1,
basta olhar para o elemento (1, 3) da matriz Q5 .
Usando um computador, obtemos
 
853/3888 509/1944 52/243 395/1296
 
 173/864 85/432 31/108 91/288 
Q5 =   37/144
.
 29/72 1/9 11/48  
499/2592 395/1296 71/324 245/864
96 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
Assim,
(5) 52
q13 = .
243
A matriz de transição Q codifica a distribuição condicional de X1 dado o estado inicial da
cadeia. Especificamente, a i-ésima linha de Q é a PMF condicional de X1 dado X0 = i, escrita
como um vetor linha. De forma análoga, a i-ésima linha de Qn corresponde à PMF condicional
de Xn dado X0 = i.
Para obter as distribuições marginais de X0 , X1 , . . ., precisamos especificar não apenas a ma-
triz de transição, mas também as condições iniciais da cadeia. O estado inicial X0 pode ser
especificado de forma determinística, ou de forma aleatória segundo alguma distribuição. Seja
t = (t1 , t2 , . . . , t M ) a PMF de X0 , vista como vetor linha, em que ti = P( X0 = i ).

Proposição 1 (Distribuição marginal de Xn ). Seja t = (t1 , t2 , . . . , t M ) o vetor de probabilidades iniciais,


com ti = P( X0 = i ). Então a distribuição marginal de Xn é dada por

tQn .

Em particular, a j-ésima componente do vetor tQn é

P( Xn = j ).

Demonstração. Pela lei da probabilidade total, condicionando em X0 , a probabilidade de a cadeia


estar no estado j após n passos é
M M
∑ P(X0 = i) P(Xn = j | X0 = i) = ∑ ti qij
(n)
P( Xn = j ) = .
i =1 i =1

Mas essa soma corresponde exatamente à j-ésima componente do vetor tQn , pela definição de
multiplicação de matrizes.

Exemplo 27 (Distribuições marginais de uma cadeia de Markov com 4 estados). Considere no-
vamente a cadeia de Markov com 4 estados representada na Figura anterior. Suponha que as condições
iniciais sejam dadas por
t = 41 , 14 , 14 , 14 ,


isto é, a cadeia começa com igual probabilidade em cada um dos quatro estados.
Seja Xn a posição da cadeia no tempo n. A distribuição marginal de X1 é
 
1/3 1/3 1/3 0
 
 0 0 1/2 1/2

 = 5 , 1, 5 , 1 .

1 1 1 1

tQ = 4 4 4 4   0 24 3 24 4
 1 0 0 

0 1/2 0 0 1/2
A distribuição marginal de X5 é
 
853/3888 509/1944 52/243 395/1296
 
 173/864 85/432 31/108 91/288 

5 1 1 1 1 3379 2267 101 1469

tQ = 4 4 4 4   =
15552 , 7776 , 486 , 5184 .
 37/144 29/72 1/9 11/48  
499/2592 395/1296 71/324 245/864
Neste caso utilizamos o computador para realizar as multiplicações de matrizes.
8.1. CADEIAS DE MARKOV (RESUMO) 97
8.1.1 Classificação dos estados

Nesta parte introduziremos a terminologia usada para descrever as várias características de uma
cadeia de Markov. Os estados de uma cadeia podem ser classificados como recorrentes ou tran-
sientes, dependendo de o processo retornar ou não a eles ao longo do tempo. Além disso, cada
estado possui um período, que é um número inteiro positivo que resume a quantidade de passos
que pode decorrer entre visitas sucessivas a esse estado.
Essas características são importantes porque determinam o comportamento de longo prazo
da cadeia de Markov, que será estudado mais adiante.
Os conceitos de recorrência e transiência são melhor ilustrados com um exemplo.

Na cadeia de Markov mostrada à esquerda da Figura, uma partícula se movendo entre os


estados continuará visitando todos os quatro estados indefinidamente, pois é possível transitar
de qualquer estado para qualquer outro.
Em contraste, considere a cadeia à direita da Figura, e suponha que a partícula comece no
estado 1. Durante algum tempo, a cadeia pode permanecer no triângulo formado pelos estados
1, 2, 3, mas eventualmente atingirá o estado 4. A partir do momento em que entra no estado 4, a
cadeia nunca mais retorna a 1, 2, 3, e passa a se mover apenas entre os estados 4, 5, 6 para sempre.
Assim, os estados 1, 2, 3 são transientes, enquanto os estados 4, 5, 6 são recorrentes.

Definição 5 (Estados recorrentes e transientes). Um estado i de uma cadeia de Markov é dito recor-
rente se, partindo de i, a probabilidade de que a cadeia eventualmente retorne a i é igual a 1.
Caso contrário, o estado é dito transiente, o que significa que, se a cadeia começar em i, existe probabi-
lidade positiva de nunca mais retornar a i.

Embora a definição de estado transiente apenas exija que haja probabilidade positiva de
nunca retornar ao estado, podemos dizer algo mais forte: sempre que existir probabilidade
positiva de abandonar i para sempre, a cadeia inevitavelmente deixará o estado i em algum
momento.
Além disso, é possível caracterizar a distribuição do número de retornos ao estado.

Proposição 2 (Número de retornos a um estado transiente é Geométrico). Seja i um estado tran-


siente de uma cadeia de Markov. Suponha que a probabilidade de nunca retornar a i, partindo de i, seja
98 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
p > 0. Então, partindo de i, o número de vezes que a cadeia retorna a i antes de sair para sempre é uma
variável aleatória com distribuição
Geom( p).

Demonstração. A demonstração segue pela interpretação da distribuição Geométrica. Cada vez


que a cadeia está em i, temos um ensaio de Bernoulli: ocorre “sucesso” se a cadeia sair de i para
sempre, e ocorre “falha” se a cadeia eventualmente retornar a i. Esses ensaios são independentes
pela propriedade de Markov.
O número de retornos ao estado i corresponde ao número de falhas antes do primeiro sucesso,
exatamente a história da distribuição Geométrica. E como uma variável Geométrica assume
valores finitos com probabilidade 1, concluímos que, após um número finito de visitas, a cadeia
deixará o estado i para sempre.

Se o número de estados não for muito grande, uma maneira de classificar estados como
recorrentes ou transientes é desenhar o diagrama da cadeia de Markov e aplicar o mesmo tipo
de raciocínio feito na análise dos exemplos anteriores.
Um caso especial em que podemos concluir imediatamente que todos os estados são recor-
rentes ocorre quando a cadeia é irredutível, isto é, quando é possível ir de qualquer estado a
qualquer outro.

Definição 6 (Cadeia irredutível e redutível). Uma cadeia de Markov com matriz de transição Q é dita
irredutível se, para quaisquer dois estados i e j, for possível ir de i até j em um número finito de passos,
com probabilidade positiva.
Isto é, para quaisquer estados i, j, existe um número inteiro n > 0 tal que a entrada (i, j) de Qn é
positiva.
Uma cadeia que não é irredutível é chamada de redutível.

Proposição 3 (Irredutibilidade implica recorrência de todos os estados). Em uma cadeia de Markov


irredutível com espaço de estados finito, todos os estados são recorrentes.

Demonstração. É claro que pelo menos um estado deve ser recorrente; se todos fossem transientes,
a cadeia eventualmente abandonaria todos os estados para sempre, o que é impossível.
Sem perda de generalidade, suponha que o estado 1 seja recorrente. Considere outro estado
(n)
i. Pela definição de irredutibilidade, existe algum n tal que q1i > 0.
Assim, toda vez que a cadeia visita o estado 1, há uma probabilidade positiva de que, após
n passos, ela esteja no estado i. Como a cadeia visita o estado 1 infinitas vezes (por recorrência),
concluirá inevitavelmente no estado i.
Além disso, partindo de i, a cadeia retorna ao estado 1, já que este é recorrente. Aplicando o
mesmo argumento recursivamente, a cadeia visitará o estado i infinitas vezes.
Como i foi arbitrário, segue que todos os estados são recorrentes.

A recíproca da proposição anterior é falsa: é possível ter uma cadeia de Markov redutível em
que todos os estados sejam recorrentes.
Um exemplo é a cadeia ilustrada na Figura abaixo, que consiste em duas “ilhas” de estados.
8.1. CADEIAS DE MARKOV (RESUMO) 99

Outra forma de classificar estados é de acordo com seus períodos. O período de um estado
resume quanto tempo pode se passar entre visitas sucessivas a esse estado.

Definição 7 (Período de um estado, cadeia periódica e aperiódica). O período de um estado i em


uma cadeia de Markov é o máximo divisor comum (mdc) dos números de passos em que é possível retornar
a i, partindo de i. Mais precisamente, o período de i é

d(i ) = gcd{ n ≥ 1 : ( Qn )ii > 0 }.

Se nunca for possível retornar a i, definimos d(i ) = ∞.


Um estado é dito aperiódico se d(i ) = 1, e periódico caso contrário.
A cadeia como um todo é chamada aperiódica se todos os seus estados forem aperiódicos, e periódica
caso contrário.

Exemplo 28 (Periodicidade em cadeias de Markov). Considere novamente as duas cadeias de Markov


da Figura abaixo.

Na cadeia com 6 estados (à direita), partindo do estado 1, é possível retornar a ele após 3 passos, 6
passos, 9 passos e assim por diante. No entanto, não é possível retornar ao estado 1 em um número de
passos que não seja múltiplo de 3. Portanto, o estado 1 tem período 3. De forma análoga, os estados 2 e 3
também têm período 3.
Por outro lado, os estados 4, 5, 6 possuem período 1. Como nem todos os estados têm período 1, a cadeia
é considerada periódica.
Em contraste, na cadeia da Figura 2 (à esquerda), todos os estados são aperiódicos, de modo que a cadeia
como um todo é aperiódica.
100 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
IMPORTANTE!!! Vale destacar uma diferença importante: algumas propriedades pertencem
a estados individuais da cadeia de Markov, enquanto outras pertencem à cadeia como um todo. A
tabela abaixo resume essa distinção, destacando os conceitos principais lado a lado para facilitar
a comparação.

Propriedades de estados Propriedades da cadeia


Estado recorrente: Partindo de i, a probabi- Cadeia irredutível: É possível ir de qual-
lidade de eventualmente retornar a i é 1. quer estado i para qualquer estado j em um
número finito de passos, com probabilidade
positiva.
Estado transiente: Partindo de i, existe pro- Cadeia redutível: Não é possível ir de al-
babilidade positiva de nunca mais retornar guns estados i para outros j em um número
a i. finito de passos, com probabilidade posi-
tiva.
Estado aperiódico: O período do estado i é Cadeia aperiódica: Todos os estados da ca-
1, ou seja, é possível retornar a i em tempos deia são aperiódicos.
arbitrários suficientemente grandes.
Estado periódico: O período do estado i é Cadeia periódica: Pelo menos um estado
maior que 1, ou seja, o retorno a i só pode da cadeia é periódico.
ocorrer em múltiplos de algum inteiro d >
1.

8.1.2 Distribuição estacionária

Os conceitos de recorrência e transiência são fundamentais para compreender o comportamento


de longo prazo de uma cadeia de Markov. Inicialmente, a cadeia pode passar algum tempo em
estados transitórios; porém, com o tempo, ela tende a permanecer apenas nos estados recorrentes.
Surge então uma pergunta natural: qual fração do tempo a cadeia passará em cada um desses
estados recorrentes?
A resposta é dada pela distribuição estacionária da cadeia, também chamada de distribuição em
regime permanente. Veremos nesta seção que, para cadeias de Markov irredutíveis e aperiódicas,
a distribuição estacionária descreve o comportamento assintótico da cadeia, independentemente
das condições iniciais. Ela fornece tanto a probabilidade de longo prazo de estar em um deter-
minado estado quanto a proporção de tempo que a cadeia passará nesse estado.

Definição 8 (Distribuição estacionária). Um vetor linha s = (s1 , . . . , s M ), com si ≥ 0 e ∑i si = 1, é


dito uma distribuição estacionária para uma cadeia de Markov com matriz de transição Q se

∑ si qij = s j , para todo j.


i

Esse sistema de equações lineares pode ser escrito de forma compacta como

sQ = s.
8.1. CADEIAS DE MARKOV (RESUMO) 101
Recorde que, se s é a distribuição de X0 , então sQ é a distribuição marginal de X1 . Assim, a
igualdade sQ = s significa que, se X0 tem distribuição s, então X1 também terá distribuição s.
Pelo mesmo raciocínio, X2 , X3 , . . . também seguirão a mesma distribuição. Em outras palavras,
uma cadeia de Markov cuja distribuição inicial é a distribuição estacionária s permanecerá nessa
distribuição para sempre.
Observação 2. Podemos ter uma interpretação intuitiva da distribuição estacionária a partir de uma
simulação mental. Imagine que temos um número muito grande de partículas (por exemplo, um bilhão), e
que a distribuição inicial dessas partículas entre os estados é proporcional à distribuição inicial da cadeia.
Em seguida, fazemos todas as partículas evoluírem segundo a matriz de transição Q.
Após um certo número de passos n, contamos quantas partículas estão em cada estado. Quando a
cadeia atinge o regime estacionário, essas proporções se estabilizam: se contarmos novamente após aplicar
Q mais uma vez, as frações relativas de partículas em cada estado permanecerão essencialmente as mesmas.
Assim, a distribuição estacionária s representa justamente essa configuração de equilíbrio em que a
aplicação de Q não altera mais as proporções — isto é, sQ = s.
Exemplo 29 (Distribuição estacionária para uma cadeia com dois estados). Considere a matriz de
transição !
1 2
Q= 3 3 .
1 1
2 2
A distribuição estacionária é da forma s = (s, 1 − s). Devemos então resolver
!
1 2
(s, 1 − s) 3 3 = (s, 1 − s),
1 1
2 2
o que é equivalente ao sistema 
 13 s + 21 (1 − s) = s,

 2 s + 1 (1 − s) = 1 − s.

3 2

A única solução é s = 73 . Portanto, a distribuição estacionária única dessa cadeia de Markov é


 
3 4
s= , .
7 7
Mais geralmente, suponha que q12 = a e q21 = b, com 0 < a < 1 e 0 < b < 1. A matriz de transição
é então !
1−a a
Q= .
b 1−b
Escrevendo s = (s1 , s2 ), a equação sQ = s fornece o sistema linear

(1 − a)s1 + bs2 = s1 ,

 as1 + (1 − b)s2 = s2 .

Ambas as equações se reduzem a


as1 = bs2 .
Como s2 = 1 − s1 , obtemos a solução única
 
b a
s= , .
a+b a+b
102 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
Existência, unicidade e convergência

Surge naturalmente a questão: uma distribuição estacionária sempre existe? E, caso exista, ela
é única? Para cadeias de Markov com espaço de estados finito, a resposta é afirmativa: sempre
existe uma distribuição estacionária. Além disso, quando a cadeia é irredutível, essa distribuição
é única.

Teorema 8 (Existência e unicidade da distribuição estacionária). Para qualquer cadeia de Markov


irredutível, existe uma única distribuição estacionária. Nessa distribuição, todos os estados possuem pro-
babilidade positiva.

Esse resultado decorre de um teorema clássico da álgebra linear conhecido como teorema de
Perron–Frobenius.
Além da existência e unicidade, também é importante entender a convergência para a distri-
buição estacionária. Já afirmamos de forma informal que a distribuição estacionária descreve
o comportamento de longo prazo da cadeia: se a cadeia for executada por tempo suficiente, a
distribuição marginal de Xn tende à distribuição estacionária s. O resultado a seguir formaliza
essa ideia.

Teorema 9 (Convergência para a distribuição estacionária). Se ( X0 , X1 , . . .) é uma cadeia de Markov


irredutível e aperiódica com distribuição estacionária s e matriz de transição Q, então

P( Xn = i ) −→ si quando n → ∞.

Em termos matriciais, Qn converge para uma matriz cujas linhas são todas iguais a s.

Portanto, após um número suficientemente grande de passos, a probabilidade de que a cadeia


esteja em um estado i se aproxima de si , independentemente das condições iniciais. Isso mostra
que cadeias irredutíveis e aperiódicas são particularmente agradáveis de trabalhar, pois o seu
comportamento assintótico é estável e previsível.

Observação 3. De modo intuitivo, a condição adicional de aperiodicidade serve para evitar cadeias
que apenas “giram em ciclos”, alternando de forma determinística entre grupos de estados. Por exemplo,
em cadeias onde certos estados só são acessíveis após um número par de passos, enquanto outros apenas
após um número ímpar, a convergência não ocorre sem essa hipótese. A combinação de irredutibilidade
e aperiodicidade garante que a cadeia possa se misturar completamente no espaço de estados e, portanto,
converge para sua distribuição estacionária.

Exemplo 30 (Cadeia periódica). Considere a cadeia de Markov ilustrada abaixo, em que cada estado
possui período 5.
 
0 1 0 0 0
0 0 1 0 0
 
 
Q=
0 0 0 1 0.
0 0 0 0 1
 

1 0 0 0 0
8.1. CADEIAS DE MARKOV (RESUMO) 103

Pode-se verificar facilmente que


1 1 1 1 1

s= 5, 5, 5, 5, 5

é uma distribuição estacionária dessa cadeia, e que ela é única.


No entanto, suponha que a cadeia comece em X0 = 1. Nesse caso, a distribuição de Xn atribui
probabilidade 1 ao estado (n mod 5) + 1 e probabilidade 0 a todos os outros estados. Em particular, a
distribuição de Xn não converge para s quando n → ∞.
De forma equivalente, a matriz Qn não converge para uma matriz em que todas as linhas são iguais a
s. As transições dessa cadeia são determinísticas, e portanto cada Qn continua sendo uma matriz composta
apenas por zeros e uns. Esse exemplo mostra que, embora a distribuição estacionária exista e seja única, a
convergência não ocorre quando a cadeia é periódica.

Observação 4. A condição de irredutibilidade é essencial para que a distribuição estacionária seja única
e represente o comportamento de longo prazo da cadeia.
Se a cadeia não for irredutível, o espaço de estados pode se decompor em vários subconjuntos fechados
— ou seja, conjuntos de estados dos quais não é possível sair. Cada um desses subconjuntos pode ter
a sua própria distribuição estacionária, o que implica que não há uma única distribuição que descreva o
comportamento de toda a cadeia.
Por exemplo, suponha que existam dois conjuntos de estados A e B tais que, uma vez que a cadeia entra
em A, nunca mais pode ir para B, e vice-versa. Então, a probabilidade de longo prazo de estar em A ou em
B dependerá da condição inicial. Isso impede a convergência para uma distribuição estacionária única.
A irredutibilidade elimina esse problema: ela garante que todos os estados se comunicam entre si,
isto é, para quaisquer i e j, existe algum número de passos n tal que ( Qn )ij > 0. Com isso, a cadeia
pode eventualmente alcançar qualquer estado a partir de qualquer outro, o que assegura tanto a existência
quanto a unicidade da distribuição estacionária e a convergência para ela.

Tempo médio de retorno e comportamento de longo prazo

Além de descrever o comportamento assintótico da cadeia, a distribuição estacionária também


está relacionada ao tempo médio entre visitas a um estado específico.
104 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
Teorema 10 (Tempo esperado de retorno). Considere uma cadeia de Markov irredutível com distribui-
ção estacionária s. Seja ri o tempo esperado para a cadeia retornar ao estado i, dado que ela começa em i.
Então,
1
si = .
ri
Esse resultado mostra que estados com maior probabilidade estacionária são visitados com
mais frequência — em média, o tempo até retornar a eles é menor.

Exemplo 31 (Comportamento de longo prazo de uma cadeia com dois estados). Considere nova-
mente a cadeia de dois estados discutida anteriormente, cuja matriz de transição é
!
1 2
Q= 3 3 .
1 1
2 2

A distribuição estacionária é  
3 4
s= , .
7 7
No longo prazo, a cadeia passará aproximadamente 3/7 do tempo no estado 1 e 4/7 do tempo no estado 2.
Começando no estado 1, o tempo médio para retornar a esse estado é r1 = 7/3, em conformidade com o
teorema acima, pois s1 = 1/r1 .
Além disso, as potências da matriz de transição convergem para uma matriz em que cada linha coincide
com a distribuição estacionária:
!n !
1 2 3 4
Qn = 3
1
3
1
−→ 7
3
7
4
, quando n → ∞.
2 2 7 7

8.1.3 Reversibilidade

Vimos que a distribuição estacionária de uma cadeia de Markov é extremamente útil para com-
preender seu comportamento de longo prazo. Entretanto, em muitos casos pode ser compu-
tacionalmente difícil determinar essa distribuição, especialmente quando o espaço de estados é
grande. Nesta seção, estudamos um caso especial importante em que é possível evitar o cálculo
direto das equações de autovalor associadas à matriz de transição.

Definição 9 (Reversibilidade). Seja Q = (qij ) a matriz de transição de uma cadeia de Markov. Dizemos
que a cadeia é reversível em relação a um vetor s = (s1 , . . . , s M ), com si ≥ 0 e ∑i si = 1, se

si qij = s j q ji , para todos os estados i, j.

Essa equação é chamada de condição de equilíbrio detalhado (ou detailed balance condition).

A intuição por trás da reversibilidade é a seguinte: uma cadeia reversível, iniciada segundo
sua distribuição estacionária, se comporta da mesma forma independentemente de o tempo estar
sendo observado para frente ou para trás. Mais precisamente, quando a cadeia está em equilíbrio,
a probabilidade de sair do estado i e ir para o estado j em um passo é si qij , e essa probabilidade
é exatamente igual à de sair de j e voltar para i, que é s j q ji . Em outras palavras, o fluxo de
probabilidade de i para j é o mesmo que o de j para i:

si qij = s j q ji .
8.1. CADEIAS DE MARKOV (RESUMO) 105
Isso significa que, no regime estacionário, as transições “para frente” e “para trás” ocorrem com a
mesma frequência média, de modo que, se observarmos a cadeia no tempo inverso, ela parecerá
estatisticamente idêntica à original.

Outra maneira de entender a reversibilidade é pensar na cadeia como um sistema com um


grande número de partículas que se movem de forma independente de acordo com as proba-
bilidades de transição. No longo prazo, a proporção de partículas em cada estado j é dada
pela probabilidade estacionária s j . O equilíbrio estacionário garante que, em média, o fluxo de
partículas que sai de cada estado é igual ao fluxo de partículas que entra nele.
Mais precisamente, seja n o número total de partículas e s o vetor de proporções atuais de
partículas em cada estado. Temos que s é estacionário se, e somente se,

sj = ∑ si qij = s j q jj + ∑ si qij , para todo j.


i i̸= j

Multiplicando por n, obtemos


ns j (1 − q jj ) = ∑ nsi qij .
i̸= j

O lado esquerdo representa o número médio de partículas que sairão do estado j no próximo
passo, enquanto o lado direito representa o número médio de partículas que entrarão em j.
Portanto, há um equilíbrio entre entrada e saída de partículas em cada estado.
A condição de reversibilidade impõe uma forma ainda mais forte de equilíbrio: para cada
par de estados distintos i e j,
nsi qij = ns j q ji .

O lado esquerdo corresponde ao número médio de partículas que vão de i para j, e o lado direito
ao número médio que vai de j para i. Assim, a reversibilidade garante que, par a par, o fluxo
entre dois estados é perfeitamente equilibrado.

Proposição 4 (Reversibilidade implica estacionariedade). Se Q = (qij ) é a matriz de transição de


uma cadeia de Markov reversível em relação a um vetor s = (s1 , . . . , s M ) não negativo, com soma dos
componentes igual a 1, então s é uma distribuição estacionária da cadeia.

Demonstração. Temos
∑ si qij = ∑ s j q ji = s j ∑ q ji = s j ,
i i i

onde a última igualdade decorre do fato de que a soma das probabilidades em cada linha de Q
é igual a 1. Logo, sQ = s, e portanto s é estacionária.

Esse é um resultado poderoso, pois frequentemente é mais simples verificar a condição de


reversibilidade do que resolver o sistema completo de equações sQ = s.
Um caso importante e simples de cadeia reversível ocorre quando a matriz de transição Q é
simétrica. Se Q é simétrica, isto é, qij = q ji para todos os i, j, então a distribuição estacionária é
uniforme sobre o espaço de estados:

1 1 1

s= M, M, . . . , M .
106 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
De fato, se qij = q ji , a condição de reversibilidade si qij = s j q ji é satisfeita sempre que si = s j para
todos os pares (i, j).
Esse é um caso particular de um fato mais geral: quando cada coluna de Q também soma 1,
a distribuição uniforme continua sendo estacionária.

Proposição 5 (Distribuição estacionária uniforme). Se cada coluna da matriz de transição Q soma 1,


então a distribuição uniforme sobre todos os estados,

1 1 1

s= M, M, . . . , M ,

é uma distribuição estacionária da cadeia de Markov.

Demonstração. Se cada coluna de Q soma 1, então o vetor linha v = (1, 1, . . . , 1) satisfaz vQ = v.


Dividindo por M, obtemos

1 1 1 1 1 1
 
M, M, . . . , M Q= M, M, . . . , M ,

logo a distribuição uniforme é estacionária.

Uma matriz cujas linhas e colunas somam 1 é chamada de matriz duplamente estocástica. Toda
cadeia de Markov cuja matriz de transição é duplamente estocástica possui distribuição estacio-
nária uniforme.

Exemplo 32 (Caminhada aleatória em uma rede não direcionada). Uma rede é um conjunto de nós
conectados por arestas. A rede é dita não direcionada se as arestas puderem ser percorridas em ambos os
sentidos, isto é, se não houver “ruas de mão única”.
Considere um caminhante que percorre aleatoriamente as arestas de uma rede não direcionada. A partir
de um nó i, o caminhante escolhe uma das arestas conectadas a i com probabilidades iguais e então atravessa
a aresta escolhida.

O grau de um nó é o número de arestas conectadas a ele. A sequência de graus de uma rede com nós
1, 2, . . . , n é o vetor
d = ( d1 , d2 , . . . , d n ),
8.2. MARKOV CHAIN MONTE CARLO 107
onde d j é o grau do nó j. Arestas que ligam um nó a ele mesmo (self-loops) são permitidas e contam como
1 no grau desse nó.
Por exemplo, para a rede acima, a sequência de graus é

d = (4, 3, 2, 3, 2).

Note que, para todos os pares de nós i, j,

di qij = d j q ji ,

pois qij = 1/di se {i, j} é uma aresta e qij = 0 caso contrário (para i ̸= j). Logo, pela proposição anterior,
a distribuição estacionária é proporcional à sequência de graus:

si ∝ di .

De forma intuitiva, os nós com maior grau são mais “bem conectados”, e portanto o caminhante passa
mais tempo neles no longo prazo. No exemplo acima, isso resulta em
4 3 2 3 2

s = 14 , 14 , 14 , 14 , 14 ,

que é a distribuição estacionária da caminhada aleatória nessa rede.


Mais geralmente, é possível considerar uma caminhada aleatória em uma rede não direcionada pon-
derada, onde cada aresta possui um peso. Nesse caso, o caminhante escolhe seu próximo nó a partir de i
com probabilidades proporcionais aos pesos das arestas que partem de i. Esse processo também define uma
cadeia de Markov reversível. De fato, todo processo de Markov reversível pode ser interpretado como uma
caminhada aleatória sobre uma rede não direcionada com pesos apropriados nas arestas.

8.2 Markov Chain Monte Carlo


Ao longo destas notas vimos que a simulação é uma ferramenta extremamente poderosa em pro-
babilidade. Quando o raciocínio analítico é complicado ou pouco intuitivo, a simulação permite
verificar resultados de forma empírica.
De maneira semelhante, se não soubermos calcular explicitamente a média e a variância de
uma variável aleatória X, mas soubermos gerar amostras independentes X1 , X2 , . . . , Xn , podemos
aproximar os valores verdadeiros por
n n
1 1
E [X] ≈
n ∑ Xj = X̄n , Var [ X ] ≈
n−1 ∑ (Xj − X̄n )2 .
j =1 j =1

Pelo teorema da lei dos grandes números, essas aproximações se tornam mais precisas à medida
que n cresce. Podemos obter resultados cada vez melhores apenas aumentando o tempo de
simulação, sem precisar lidar com integrais ou somas intratáveis. Esse tipo de abordagem é
conhecido como método de Monte Carlo.
Um dos principais desafios dos métodos de Monte Carlo é a necessidade de saber gerar
amostras X1 , X2 , . . . , Xn da distribuição desejada. Em muitos casos, isso não é nada trivial. Por
exemplo, suponha que queremos gerar valores de uma variável contínua com densidade

f ( x ) ∝ x3.1 (1 − x )4.2 , 0 < x < 1.


108 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
Reconhecemos aqui a forma de uma distribuição Beta(4.1, 5.2). Mesmo assim, a função de dis-
tribuição acumulada (CDF) da Beta é complicada, e inverter essa função para gerar amostras é
praticamente inviável na prática.
Em aplicações reais, as distribuições costumam ser muito mais complexas do que a Beta. Mui-
tas vezes, o termo de normalização da densidade (ou massa de probabilidade) é desconhecido e
impossível de calcular com precisão, mesmo com computadores modernos e técnicas avançadas
de integração numérica.

O objetivo desta seção é introduzir o método Markov Chain Monte Carlo (MCMC), uma família
de algoritmos que permite gerar amostras de distribuições complexas a partir de cadeias de
Markov. O desenvolvimento do MCMC revolucionou a estatística e a computação científica, pois
tornou possível simular distribuições de alta dimensão ou com normalizadores desconhecidos.
A ideia central é inverter o problema estudado anteriormente. Antes, conhecíamos a matriz
de transição Q e procurávamos sua distribuição estacionária s. Agora, o processo é o oposto:
partimos de uma distribuição s que desejamos simular e construímos uma cadeia de Markov
cuja distribuição estacionária é exatamente s.
Se essa cadeia for executada por tempo suficiente, a distribuição de seus estados se aproxi-
mará da distribuição alvo s. O aspecto surpreendente é que isso pode ser feito sem conhecer
o termo de normalização de s, o que torna o método aplicável em uma enorme variedade de
contextos.

8.3 Algoritmo de Metropolis–Hastings


O algoritmo de Metropolis–Hastings é um método geral para construir cadeias de Markov cuja
distribuição estacionária seja uma distribuição alvo arbitrária. A ideia central é inverter o pro-
blema usual: em vez de começar de uma cadeia e buscar sua distribuição estacionária, que-
remos agora construir uma cadeia cuja distribuição estacionária seja uma distribuição prescrita
s = ( s1 , . . . , s M ).
Suponha que o espaço de estados seja finito, {1, . . . , M}, e que si > 0 para todo i. Considere
uma cadeia de Markov conhecida, com matriz de transição P = ( pij ). Essa cadeia é escolhida
apenas porque sabemos simulá-la facilmente — isto é, conseguimos gerar um próximo estado j
a partir de um estado atual i segundo as probabilidades pij . Entretanto, P em geral não tem s
como distribuição estacionária. Nosso objetivo é modificar o mecanismo de transição de P para
obter uma nova cadeia Q = (qij ) que preserve s como estacionária.
A modificação consiste em introduzir um mecanismo de aceitação e rejeição. A cadeia original
P propõe um possível novo estado, e o algoritmo decide se essa proposta será aceita ou rejei-
tada. Essa etapa de aceitação é cuidadosamente escolhida para garantir que a cadeia resultante
satisfaça a condição de reversibilidade com respeito a s, o que implica que s é estacionária.

O algoritmo procede da seguinte forma:

1. Escolha um estado inicial X0 (de forma aleatória ou determinística).

2. No passo n, suponha que a cadeia está em Xn = i.


8.3. ALGORITMO DE METROPOLIS–HASTINGS 109
3. Proponha um novo estado j de acordo com as probabilidades da linha i da matriz P; isto é,
escolha j com probabilidade pij .

4. Calcule a probabilidade de aceitação

s j p ji
 
aij = min ,1 .
si pij

5. Com probabilidade aij , aceite a proposta e defina Xn+1 = j; caso contrário, rejeite a proposta
e mantenha Xn+1 = i.

A matriz P é chamada de matriz de proposta, pois serve apenas para gerar possíveis movimen-
tos da cadeia. As probabilidades de aceitação aij ajustam essas propostas para que o equilíbrio
da nova cadeia Q obedeça à distribuição s. Em notação compacta, a nova matriz de transição é

 pij aij ,
 i ̸= j,
qij =
1 − ∑ p a , i = j.

k ̸=i ik ik

Um aspecto importante é que o algoritmo não requer o conhecimento da constante de normalização


de s. Se s ∝ f , com f conhecida apenas até uma constante multiplicativa, o quociente s j /si =
f ( j)/ f (i ) elimina o fator comum. Isso torna o método aplicável mesmo quando s é conhecida
apenas de forma não normalizada, o que ocorre frequentemente em problemas de inferência
bayesiana.
Além disso:

• se pij = 0, a transição i → j nunca é proposta, logo não precisa ser avaliada;

• se pii > 0, pode ocorrer de a proposta coincidir com o estado atual, e a cadeia naturalmente
permanece em i.

Em resumo, o algoritmo de Metropolis–Hastings constrói uma nova cadeia de Markov a partir


de uma cadeia proposta P, aceitando ou rejeitando cada movimento de forma a garantir que a
distribuição estacionária da cadeia resultante seja exatamente a distribuição desejada s.

Proposição 6 (Reversibilidade da cadeia de Metropolis–Hastings). Seja Q = (qij ) a matriz de


transição da cadeia gerada pelo algoritmo de Metropolis–Hastings. Então a cadeia é reversível em relação à
distribuição s, e portanto s é sua distribuição estacionária.

Demonstração. Precisamos verificar a condição de reversibilidade

si qij = s j q ji , para todos os i, j.

O caso i = j é imediato, pois ambos os lados são iguais a si qii . Consideremos agora i ̸= j.
Se qij > 0, então pij > 0 — a cadeia só pode propor uma transição possível — e também p ji >
0, pois, do contrário, a probabilidade de aceitação seria nula. De forma análoga, se pij , p ji > 0,
então q ji > 0. Portanto, qij e q ji são simultaneamente nulos ou não nulos.
110 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
Para i ̸= j com qij > 0, temos
qij = pij aij ,

pois, partindo de i, a única forma de alcançar j é propor essa transição (com probabilidade pij ) e
aceitá-la (com probabilidade aij ).

Caso 1: se s j p ji ≤ si pij , então


s j p ji
aij = e a ji = 1.
si pij
Logo,
s j p ji
si qij = si pij aij = si pij = s j p ji = s j p ji a ji = s j q ji .
si pij

Caso 2: se s j p ji > si pij , o mesmo raciocínio vale trocando i e j, de modo que novamente

si qij = s j q ji .

Portanto, a cadeia de Metropolis–Hastings satisfaz a condição de reversibilidade em relação


a s. Como cadeias reversíveis são estacionárias com respeito à mesma distribuição, segue que s é
a distribuição estacionária da cadeia com matriz de transição Q.

Observação 5 (Intuição via fluxo de partículas). Podemos interpretar a cadeia de Metropolis–Hastings


em termos de um sistema com n partículas que se movem entre os estados de acordo com as probabilidades
de transição qij . No equilíbrio, a fração de partículas no estado i é si , de modo que existem aproximadamente
nsi partículas em i.
Durante um passo da cadeia, cada partícula em i propõe se mover para j com probabilidade pij , e essa
proposta é aceita com probabilidade aij . O fluxo esperado de partículas que saem de i e entram em j é,
portanto,
nsi pij aij .

Analogamente, o fluxo esperado de partículas indo de j para i é

ns j p ji a ji .

A ideia central do algoritmo é ajustar as probabilidades de aceitação aij de modo que, no regime estaci-
onário, esses dois fluxos se equilibrem:

nsi pij aij = ns j p ji a ji ,

ou, equivalentemente,
si qij = s j q ji .

Essa é exatamente a condição de reversibilidade (ou balanço detalhado).


A definição
s j p ji
 
aij = min ,1
si pij
garante esse equilíbrio:
8.3. ALGORITMO DE METROPOLIS–HASTINGS 111
• Se o fluxo proposto si pij é maior que o fluxo de volta s j p ji , isso significa que, no estado atual, há
“muitas partículas” tentando sair de i em direção a j, em comparação com o número que retorna de j
para i. Para evitar que o sistema se desequilibre (isto é, que o estado j acumule partículas e o estado i
esvazie), o algoritmo reduz a probabilidade de aceitação aij , permitindo que apenas uma fração dessas
tentativas de saída seja efetivamente realizada. Esse “freio probabilístico” impede que o fluxo líquido
entre i e j seja diferente de zero.

• Se o fluxo proposto é menor, isto é, há poucas partículas saindo de i em relação às que retornam
de j, o sistema já tem menos movimento em direção a j. Nesse caso, todas as propostas são aceitas
(aij = 1), pois não há risco de desequilíbrio: permitir todas as transições ajuda a compensar o déficit
de fluxo, mantendo o equilíbrio entre os dois estados.

Com esse ajuste, o sistema tende a um equilíbrio dinâmico, no qual a taxa média de partículas indo
de i para j é igual à taxa de partículas voltando de j para i. Não há acúmulo nem escoamento líquido de
probabilidade entre os estados, e a igualdade

si qij = s j q ji

expressa precisamente essa situação de equilíbrio. Assim, a cadeia de Metropolis–Hastings é reversível em


relação a s, e s é sua distribuição estacionária.

Exemplo 33 (Amostrador independente para a distribuição Beta). Vamos aplicar o algoritmo de


Metropolis–Hastings para gerar amostras de uma distribuição Beta( a, b). Até aqui, introduzimos o método
apenas para espaços de estado finitos, mas as mesmas ideias se aplicam a espaços contínuos.
Uma escolha simples para a cadeia de proposta é utilizar variáveis aleatórias independentes Unif(0, 1).
Ou seja, o próximo estado proposto é sempre um valor u ∈ (0, 1) gerado de forma independente do estado
atual. Esse caso particular é chamado de amostrador independente (independence sampler), pois as
propostas não dependem do ponto atual da cadeia.
Seja W0 um estado inicial arbitrário. A cadeia W0 , W1 , . . . é construída da seguinte forma:

1. No passo atual, suponha que a cadeia esteja em Wn = w.

2. Gere uma proposta u ∼ Unif(0, 1).

3. Calcule a probabilidade de aceitação

u a −1 (1 − u ) b −1
 
a(w, u) = min ,1 .
w a −1 (1 − w ) b −1

4. Com probabilidade a(w, u), aceite a proposta e defina Wn+1 = u; caso contrário, rejeite a proposta e
mantenha Wn+1 = w.

Observe que o algoritmo não requer o conhecimento da constante de normalização da densidade Beta( a, b),
pois ela se cancela na razão entre as densidades no numerador e no denominador. Aqui, a densidade
Beta( a, b) desempenha o papel de s (a distribuição estacionária desejada), enquanto a densidade uniforme
Unif(0, 1) desempenha o papel de pij e p ji , já que as propostas são sempre independentes do estado atual.
112 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC

Após um número suficientemente grande de iterações, as variáveis Wn , Wn+1 , . . . seguem aproxima-


damente a distribuição Beta( a, b). Essas amostras, entretanto, não são independentes: a cadeia gera uma
sequência de variáveis correlacionadas, que oscilam em torno da distribuição alvo conforme o processo
evolui.

Perceba que no algoritmo geral de Metropolis–Hastings, a probabilidade de aceitação é dada por

s(u) p( x | u)
 
a( x, u) = min 1, ,
s( x ) p(u | x )

onde p(u | x ) é a densidade da proposta, isto é, a probabilidade de propor o ponto u dado o estado atual x.
p( x |u)
O termo p(u| x) está presente para corrigir possíveis assimetrias da distribuição de proposta. Por
p( x |u)
exemplo, se é mais fácil propor de x para u do que o contrário, o fator p(u| x) compensa essa diferença,
garantindo que o fluxo médio de partículas entre x e u permaneça equilibrado:

s( x ) p(u | x ) a( x, u) = s(u) p( x | u) a(u, x ).

No caso da simulação da distribuição Beta, utilizamos um independence sampler, em que as propos-


tas são independentes do estado atual:

p(u | x ) = p(u) = Unif(0, 1).

Consequentemente,

p( x | u)
p( x | u) = p( x ) = Unif(0, 1), e portanto = 1.
p(u | x )
O fator de correção se cancela, e a fórmula de aceitação se reduz para
 
s(u)
a( x, u) = min 1, ,
s( x )
que é exatamente a expressão usada no caso da Beta.
Em resumo, o termo da proposta desaparece porque a distribuição de proposta é simétrica e indepen-
dente do estado atual, de modo que não há assimetria a corrigir.

Observação 6 (Período de aquecimento (burn-in)). Mesmo quando uma cadeia de Markov possui s
como distribuição estacionária, isso significa apenas que s é um estado de equilíbrio: se a cadeia for iniciada
com distribuição s, ela permanecerá em s para sempre.
8.4. AMOSTRAGEM DE GIBBS 113
Na prática, porém, a cadeia é iniciada em um ponto fixo X0 = i ou segundo alguma distribuição inicial
diferente de s. As primeiras iterações servem para que a cadeia se desloque gradualmente em direção ao
equilíbrio, aproximando-se da distribuição estacionária. Durante esse período inicial, as distribuições de
Xn ainda refletem o estado inicial e não representam bem o comportamento estacionário.
Esse intervalo é chamado de período de aquecimento, ou burn-in. Se denotarmos por p(n) o vetor
de probabilidades no tempo n, temos
p(n+1) = p(n) Q.

Conforme n cresce, ocorre a convergência


p(n) −→ s,

isto é, a distribuição da cadeia tende à distribuição estacionária s. Somente após essa fase de convergência
é que as amostras podem ser consideradas representativas do regime estacionário.
Intuitivamente, podemos imaginar muitas cópias da cadeia evoluindo em paralelo. Inicialmente, há um
acúmulo de partículas em certos estados e um déficit em outros. À medida que o tempo passa, os fluxos de
transição entre estados se equilibram, até que a proporção de partículas em cada estado se estabilize segundo
s. Descartar as primeiras amostras equivale a ignorar essa fase de ajuste até o equilíbrio.

8.4 Amostragem de Gibbs


A amostragem de Gibbs é um algoritmo de Monte Carlo empregado para gerar amostras aproxi-
madas de uma distribuição conjunta. A ideia central é simples: atualizar sucessivamente uma
variável de cada vez, amostrando-a de sua distribuição condicional dado o valor atual das de-
mais. Esse método é particularmente útil quando as distribuições condicionais são fáceis de
manipular e de amostrar diretamente.

Considere o caso de duas variáveis aleatórias discretas X e Y, com função de probabilidade


conjunta
p X,Y ( x, y) = P( X = x, Y = y).

Desejamos construir uma cadeia de Markov ( Xn , Yn ) cuja distribuição estacionária seja p X,Y .
Existem duas versões principais do algoritmo de Gibbs, dependendo de como as variáveis
são atualizadas: (1) o Gibbs sistemático, no qual as variáveis são atualizadas em ordem fixa e
alternada; e (2) o Gibbs aleatório, no qual a variável a ser atualizada é escolhida aleatoriamente a
cada iteração.
O procedimento pode ser descrito da seguinte forma:

1. No passo atual, suponha que a cadeia esteja em ( Xn , Yn ) = ( xn , yn ).

2. Gere um novo valor xn+1 a partir da distribuição condicional de X dado Y = yn , isto é,

x n +1 ∼ p ( x | Y = y n ).

3. Em seguida, gere um novo valor yn+1 a partir da distribuição condicional de Y dado X =


x n +1 :
y n +1 ∼ p ( y | X = x n +1 ).
114 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
4. Atualize o estado da cadeia para ( Xn+1 , Yn+1 ) = ( xn+1 , yn+1 ).

Repetindo esses passos indefinidamente, a cadeia ( Xn , Yn ) converge para a distribuição esta-


cionária p X,Y .

Na versão aleatória, escolhe-se a cada iteração qual variável será atualizada, com probabili-
dades iguais. O procedimento segue:

1. No passo atual, suponha que a cadeia esteja em ( Xn , Yn ) = ( xn , yn ).

2. Escolha aleatoriamente qual componente será atualizado:

• com probabilidade 1/2, atualize X;


• com probabilidade 1/2, atualize Y.

3. Se X for escolhido:

(a) Gere xn+1 ∼ p( x | Y = yn );


(b) Defina ( Xn+1 , Yn+1 ) = ( xn+1 , yn ).

4. Caso Y seja escolhido:

(a) Gere yn+1 ∼ p(y | X = xn );


(b) Defina ( Xn+1 , Yn+1 ) = ( xn , yn+1 ).

Repetindo o processo, obtemos novamente uma cadeia cuja distribuição estacionária é p X,Y .
O algoritmo de Gibbs se estende naturalmente para o caso de d variáveis aleatórias. Nesse
(1) (d)
caso, o estado da cadeia é um vetor Wn = (Wn , . . . , Wn ). Em cada iteração:

1. Escolhe-se (de forma determinística ou aleatória) um índice j ∈ {1, . . . , d};


( j)
2. Amostra-se o componente Wn da distribuição condicional
 
( j)
Wn+1 ∼ p w( j) | w(− j) ,

onde w(− j) denota todos os outros componentes fixos;

3. Mantêm-se os demais componentes inalterados.

Observação 7. O amostrador de Gibbs pode ser interpretado como um caso especial do algoritmo de
Metropolis–Hastings. Enquanto o Metropolis–Hastings requer uma distribuição proposta e uma etapa
de aceitação ou rejeição, o Gibbs utiliza propostas que sempre são aceitas, pois cada amostra é retirada
exatamente da distribuição condicional correta.

Teorema 11 (Gibbs aleatório como caso particular de Metropolis–Hastings). O amostrador de Gibbs


aleatório é um caso particular do algoritmo de Metropolis–Hastings, no qual toda proposta é sempre aceita.
Em particular, isso implica que a distribuição estacionária do amostrador de Gibbs aleatório é exatamente
a distribuição conjunta desejada.
8.4. AMOSTRAGEM DE GIBBS 115
Demonstração. Apresentaremos a demonstração no caso bidimensional, embora o argumento se
estenda naturalmente a qualquer número de dimensões.
Sejam X e Y variáveis aleatórias discretas cuja distribuição conjunta p( x, y) = P( X = x, Y = y)
é a distribuição estacionária que queremos obter.
O algoritmo de Metropolis–Hastings, no estado atual ( x, y), procede da seguinte forma: pro-
põe um novo estado ( x ′ , y′ ) segundo uma distribuição proposta q(( x ′ , y′ ) | ( x, y)) e aceita essa
proposta com probabilidade

p( x ′ , y′ ) q(( x, y) | ( x ′ , y′ ))
 
′ ′
a(( x, y), ( x , y )) = min 1, .
p( x, y) q(( x ′ , y′ ) | ( x, y))

No caso do Gibbs aleatório, a proposta consiste em escolher aleatoriamente uma das coorde-
nadas e atualizá-la de acordo com sua distribuição condicional verdadeira. Mais precisamente:

1. Com probabilidade 1/2, atualiza-se X a partir de p( x ′ | Y = y), mantendo Y ′ = y.

2. Com probabilidade 1/2, atualiza-se Y a partir de p(y′ | X = x ), mantendo X ′ = x.

Vamos considerar o segundo caso, em que apenas Y é atualizado (o caso simétrico em que X
é atualizado é análogo). Assim,

1 1
q(( x, y′ ) | ( x, y)) = p(y′ | x ) e q(( x, y) | ( x, y′ )) = p ( y | x ).
2 2
Substituindo esses termos na fórmula de aceitação, obtemos:

p( x, y′ ) p(y | x )
 

a(( x, y), ( x, y )) = min 1, .
p( x, y) p(y′ | x )

Como p( x, y) = p( x ) p(y | x ), temos:

p( x, y′ ) p(y | x ) p( x ) p(y′ | x ) p(y | x )


= = 1.
p( x, y) p(y′ | x ) p( x ) p(y | x ) p(y′ | x )

Logo,
a(( x, y), ( x, y′ )) = 1.

Isto é, toda proposta é sempre aceita. Consequentemente, o algoritmo de Metropolis–Hastings,


com essa escolha específica de distribuição proposta, coincide exatamente com o amostrador de
Gibbs aleatório, e ambos têm a mesma distribuição estacionária p( x, y).

Exemplo 34 (O problema da galinha e dos ovos). Uma galinha põe um número N de ovos, onde
N ∼ Poisson(λ). Cada ovo choca com probabilidade p, onde p é desconhecido e tem distribuição

p ∼ Beta( a, b).

Os parâmetros λ, a, b são conhecidos. O problema é que não observamos o número total de ovos N, apenas
o número de ovos chocados, denotado por X. Nosso objetivo é estimar a esperança posterior

E [ p | X = x] ,

isto é, a média de p após observar x ovos chocados.


116 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
1. A distribuição de X dado p é (pense no porquê)

X | p ∼ Poisson(λp).

Logo, a densidade posterior de p é proporcional a

f ( p | X = x ) ∝ P( X = x | p) f ( p) ∝ e−λp (λp) x p a−1 (1 − p)b−1 .

Essa distribuição não tem forma fechada conhecida, o que dificulta a amostragem direta. Para con-
tornar isso, introduzimos a variável latente N, correspondente ao número total de ovos postos.

2. Condicionalmente a N = n e p, o número de ovos chocados segue

X | N = n, p ∼ Binomial(n, p).

Assim, ao condicionar em N, recuperamos a conjugação Beta–Binomial:

p | X = x, N = n ∼ Beta( x + a, n − x + b).

O fato de que essa forma condicional é simples motiva o uso da amostragem de Gibbs: alternaremos
entre amostrar p dado N e N dado p.

3. Desejamos gerar amostras da distribuição conjunta de ( p, N ) condicionada a X = x. O algoritmo


segue os seguintes passos:

(a) Faça suposições iniciais para p e N.


(b) Repita até a convergência:
i. Atualização de p:

p | X = x, N = n ∼ Beta( x + a, n − x + b).

ii. Atualização de N: Seja Y = N − X o número de ovos que não chocaram. Condicional-


mente a p, o número de ovos não chocados segue

Y | p ∼ Poisson(λ(1 − p)).

Assim, sorteamos Y ∼ Poisson(λ(1 − p)) e definimos

N = X + Y.

4. Após muitas iterações, obtemos amostras ( p(1) , N (1) ), ( p(2) , N (2) ), . . . extraídas aproximadamente
de f ( p, N | X = x ). A esperança posterior é então estimada pela média amostral:
T
1
E( p | X = x ) ≈
T ∑ p(t) .
t =1

Os resultados obtidos por simulação do amostrador de Gibbs são resumidos na Tabela 4. Nas simula-
ções, utilizou-se λ = 10 como valor esperado do número total de ovos postos, e um prior Beta( a, b)
com a = b = 1, correspondendo a uma distribuição uniforme sobre [0, 1] para o parâmetro p. Foram
8.4. AMOSTRAGEM DE GIBBS 117

considerados diferentes valores observados de ovos chocados X ∈ {3, 5, 7, 9}, enquanto os demais
parâmetros permaneceram fixos.

X E [ p | X = x] E [ N | X = x]
3 0.40 9.0
5 0.56 9.3
7 0.69 10.1
9 0.77 11.3

Observa-se que, à medida que o número de ovos chocados X aumenta, a média posterior de p cresce
de forma aproximadamente monotônica, variando de cerca de 0.4 para 0.77. Esse comportamento é
exatamente o esperado, pois X | p ∼ Poisson(λp): quanto maior o número de ovos chocados, maior
deve ser a probabilidade de sucesso p.
Além disso, a média posterior de N também aumenta levemente com X, o que é coerente com o
modelo N = X + Y, em que Y | p ∼ Poisson(λ(1 − p)). Ou seja, observar mais ovos chocados
implica, em média, um número total ligeiramente maior de ovos postos. Esses resultados confirmam
que o amostrador de Gibbs captura corretamente a relação entre X, p e N, produzindo inferências
consistentes com o modelo teórico.
118 CAPÍTULO 8. CADEIAS DE MARKOV E MCMC
Capítulo 9

Processos de Difusão

9.1 Movimento Browniano e SDE


A solução de uma equação diferencial estocástica (SDE, do inglês stochastic differential equation) é um
processo estocástico. Um processo estocástico é uma coleção de variáveis aleatórias Xt ∈ Rd
que evoluem ao longo do tempo t ≥ 0. Embora cada Xt seja aleatória para um instante fixo, o
interesse está em compreender como valores em tempos diferentes se relacionam — isto é, como
Xt+s depende de Xt .
Um exemplo fundamental de processo estocástico é o movimento browniano, denotado por
Wt . Ele é caracterizado por duas propriedades essenciais:

• Incrementos normais: os incrementos têm distribuição normal com variância proporcional


ao intervalo de tempo:

Wt+s − Wt ∼ N (0, sId ), para todo t, s ≥ 0.

• Incrementos independentes: para quaisquer t1 > t2 > t3 , os incrementos Wt1 − Wt2 e


Wt2 − Wt3 são independentes.

Essas propriedades fazem do movimento browniano o modelo canônico de ruído contínuo,


servindo como base para a definição das equações diferenciais estocásticas.
Podemos aproximar numericamente uma trajetória de movimento browniano discretizando
o tempo. Se tomamos passos igualmente espaçados de tamanho s > 0, o incremento em cada
passo é dado por

Wt+s = Wt + s ε,
onde ε ∼ N (0, Id ) é uma variável aleatória independente a cada passo. O parâmetro s representa
o tamanho do passo temporal — isto é, o intervalo entre duas amostragens consecutivas do

processo. O fator s garante que a variância dos incrementos cresça linearmente com o tempo,
como exige a definição de movimento browniano:

Var(Wt+s − Wt ) = sId .

Essa relação mostra que quanto maior o intervalo s, maior a variabilidade esperada do incre-
mento, refletindo a natureza difusiva do processo.

119
120 CAPÍTULO 9. PROCESSOS DE DIFUSÃO
Para ilustrar, vejamos como podemos simular numericamente uma trajetória de movimento
browniano. A ideia é construir uma sequência de valores (W0 , Ws , W2s , . . . , WT ) que satisfaça as
propriedades do processo.

1. Escolha dos parâmetros: Defina o tempo total de simulação T > 0 e o número de passos n.
O tamanho do passo será s = T/n.

2. Inicialização: Comece com W0 = 0, que é a condição inicial típica do movimento browni-


ano.

3. Geração dos incrementos: Para cada passo k = 1, 2, . . . , n, gere um ruído gaussiano inde-
pendente
ε k ∼ N (0, 1),
e compute o incremento

∆Wk = s εk.

4. Construção da trajetória: Atualize o valor do processo de forma recursiva:

Wk = Wk−1 + ∆Wk .

O vetor (W0 , W1 , . . . , Wn ) representa uma amostra discreta da trajetória de Wt no intervalo


[0, T ].

O resultado é mostrado na Figura 9.1, que exibe duas trajetórias com diferentes tamanhos de
passo s. Quanto menor o passo, mais suave e precisa é a aproximação da trajetória contínua de
um movimento browniano.

Figura 9.1: Simulação de duas trajetórias de movimento browniano com diferentes tamanhos de
passo s.

Exercício 27. Simule movimentos brownianos com diferente passos.

Com base nesse ruído contínuo Wt , uma equação diferencial estocástica é uma equação que
descreve a evolução de um processo Xt segundo

dXt = f ( Xt , t) dt + g( Xt , t) dWt .
9.1. MOVIMENTO BROWNIANO E SDE 121
O primeiro termo, f ( Xt , t) dt, representa a tendência média do movimento e é chamado de drift;
o segundo termo, g( Xt , t) dWt , modela a difusão, responsável pelas flutuações aleatórias.
Para obter uma intuição mais concreta sobre a dinâmica dessa equação, é útil pensar em sua
forma discretizada no tempo. Consideremos pequenos intervalos de tempo ∆ > 0. O movimento
browniano Bt possui incrementos

Bt+∆ − Bt ∼ N (0, ∆Id ),

e, além disso, esses incrementos são independentes para intervalos disjuntos. Assim, podemos
representar o incremento como

Bt+∆ − Bt = ∆ ε t ,
onde ε t ∼ N (0, Id ) é uma variável aleatória independente a cada passo.
Substituindo esse termo na SDE

dXt = f ( Xt , t) dt + g( Xt , t) dBt ,

obtemos a versão discreta aproximada:

Xt+∆ ≈ Xt + f ( Xt , t) ∆ + g( Xt , t) ( Bt+∆ − Bt ).

Usando a expressão acima para o incremento browniano, isso se torna



Xt + ∆ ≈ Xt + f ( Xt , t ) ∆ + g ( Xt , t ) ∆ ε t .

Essa equação descreve como o processo Xt evolui passo a passo: a cada intervalo ∆, há um

deslocamento determinístico dado por f ( Xt , t) ∆ (o drift) e um deslocamento aleatório g( Xt , t) ∆ ε t
(a difusão).
Essa formulação é conhecida como o esquema de Euler–Maruyama, uma generalização es-
tocástica do método de Euler para equações diferenciais ordinárias. À medida que ∆ → 0, a
sequência Xt+∆ converge, sob condições adequadas, para a solução contínua da SDE.

Exercício 28. Considere o esquema de Euler–Maruyama para simular uma equação diferencial estocástica
(SDE) da forma
dXt = f ( Xt ) dt + σ dBt ,
onde Bt é um movimento browniano padrão e σ > 0 controla a intensidade do ruído.

(a) Implemente a simulação de trajetórias para dois campos de drift diferentes:

f1 (x) = −x e f 2 ( x ) = x − x3 .

(b) Gere várias trajetórias para cada caso, mantendo o mesmo valor de σ e do passo temporal ∆.

(c) Compare os comportamentos obtidos:

– Como o termo de drift influencia a dispersão das trajetórias?


– Em que sentido o caso f 2 ( x ) = x − x3 pode ser interpretado como um sistema com dois estados
de equilíbrio?

(d) Plote em um mesmo gráfico uma trajetória com drift e outra sem drift (isto é, f ( x ) = 0) para
visualizar a diferença qualitativa entre difusão pura e dinâmica com força restauradora.
122 CAPÍTULO 9. PROCESSOS DE DIFUSÃO
9.2 Equação de Fokker–Planck

Considere um processo de difusão governado pela SDE geral

dXt = f ( Xt , t) dt + g( Xt , t) dBt ,

onde f é o campo de drift e g o coeficiente de difusão. A função g controla como o ruído atua sobre
cada componente do sistema — por exemplo, se g é uma matriz, o ruído pode ter intensidades e
correlações diferentes em cada direção.
A densidade de probabilidade p( x, t) associada a Xt satisfaz a equação de Fokker–Planck
(também chamada de equação de Kolmogorov para frente):

∂p  1  
= −∇ · f ( x, t) p( x, t) + ∇ · ∇ · ( g g⊤ )( x, t) p( x, t) .
∂t 2
O primeiro termo representa o transporte determinístico da densidade pelo campo de drift, en-
quanto o segundo termo descreve a difusão espacial causada pelo ruído multiplicativo g( x, t) dBt .

No caso em que o ruído é isotrópico e constante, isto é, g( x, t) = 2D Id , a equação se simplifica
para
∂p
= −∇ · f ( x ) p( x, t) + D ∆p( x, t),

∂t
onde D > 0 é o coeficiente de difusão e ∆ é o operador Laplaciano.
Essa forma mostra claramente a dualidade entre drift e difusão:

• o termo −∇ · ( f p) concentra ou transporta massa segundo o fluxo determinístico;

• o termo D ∆p espalha a densidade, suavizando descontinuidades e representando o efeito


do ruído.

A equação de Fokker–Planck pode ainda ser escrita como uma equação de continuidade:

∂p
= −∇ · J, J = f ( x ) p( x, t) − D ∇ p( x, t),
∂t
onde J é o fluxo de probabilidade. O primeiro termo de J corresponde ao transporte devido ao drift,
e o segundo termo é o fluxo difusivo induzido pela variação espacial da densidade.
Aqui, o operador ∇ · J representa o divergente do campo de fluxo J, isto é, a taxa líquida de
probabilidade que sai (ou entra) de uma pequena região do espaço. De forma intuitiva:

• se ∇ · J > 0, há mais probabilidade saindo do que entrando — a densidade p( x, t) diminui


localmente;

• se ∇ · J < 0, há mais probabilidade entrando do que saindo — a densidade aumenta


naquela região.

Portanto, a equação de continuidade expressa o princípio de conservação de probabilidade: a


densidade muda no tempo apenas devido ao fluxo de probabilidade atravessando as fronteiras
das regiões do espaço.
9.3. AMOSTRAGEM DE LANGEVIN 123
9.3 Amostragem de Langevin
A ideia central da amostragem de Langevin é usar uma dinâmica estocástica contínua no tempo cuja
distribuição estacionária coincide com uma densidade-alvo p( x ). Queremos, portanto, construir
uma SDE cuja solução Xt satisfaça
lim L( Xt ) = p( x ),
t→∞

onde L( Xt ) denota a lei (ou distribuição) do processo no tempo t.


Uma escolha natural é definir o drift como o gradiente do logaritmo da densidade:

dXt = ∇ log p( Xt ) dt + 2 dBt .

Essa SDE é conhecida como dinâmica de Langevin (ou overdamped Langevin equation). O termo
determinístico ∇ log p( Xt ) empurra as partículas em direção às regiões de maior probabilidade

da distribuição, enquanto o ruído gaussiano 2 dBt garante que o processo explore todo o espaço
de estados.
Se tomarmos p∞ ( x ) = p( x ), queremos verificar que essa escolha satisfaz a condição estacio-
nária da equação de Fokker–Planck:

∇ · ∇ log p( x ) p( x ) = ∆p( x ).


Recordemos que o operador ∇ representa o gradiente, e que o operador ∇· representa o


divergente. Aplicar o divergente a um gradiente produz o Laplaciano, denotado por ∆:

∆p( x ) = ∇ · ∇ p( x ) .


d2 p
Em uma dimensão, o Laplaciano reduz-se simplesmente à segunda derivada dx2
.

Pela regra da cadeia, sabemos que

∇ p( x )
∇ log p( x ) = .
p( x )

Multiplicando ambos os lados por p( x ), obtemos

∇ p( x ) = p( x ) ∇ log p( x ).

Substituímos essa identidade no lado direito da equação de equilíbrio:

∆p( x ) = ∇ · ∇ p( x ) = ∇ · p( x ) ∇ log p( x ) .
 

Portanto, o lado direito e o lado esquerdo da equação estacionária são idênticos:

∇ · ∇ log p( x ) p( x ) = ∇ · p( x ) ∇ log p( x ) = ∆p( x ).


 

Essa relação entre a SDE de Langevin e a Fokker–Planck mostra que o processo preserva a
densidade p( x ) no equilíbrio. Na prática, a amostragem de Langevin consiste em discretizar
essa SDE (via o método de Euler–Maruyama) e usar as iterações resultantes para gerar amostras
aproximadamente distribuídas segundo p( x ).
124 CAPÍTULO 9. PROCESSOS DE DIFUSÃO
Exercício 29. Considere a densidade alvo p( x ) = N ( x; 0, 1), isto é,

1 2
p( x ) = √ e− x /2 .

Queremos usar a dinâmica de Langevin para gerar amostras dessa distribuição:



dXt = ∇ log p( Xt ) dt + 2 dBt .

1. Derive o gradiente de log p( x ). Mostre que

∇ log p( x ) = − x.

Observe que o termo constante − 12 log(2π ) desaparece na derivada. Discuta o motivo pelo qual o
termo normalizador da densidade não afeta o gradiente.

2. Implemente a dinâmica de Langevin:



Xt + ∆ = Xt − Xt ∆ + 2∆ ε t , ε t ∼ N (0, 1).

Use ∆ = 0.01 e inicialize X0 ∼ N (0, 1). Gere trajetórias e verifique que o histograma das amostras
converge para a densidade p( x ).

3. Versão sem difusão: Repita a simulação removendo o termo aleatório,

Xt+∆ = Xt − Xt ∆.

O processo converge para qual valor? Explique o papel do ruído na manutenção da variabilidade da
amostra.

4. Interpretação: Analise a dinâmica obtida. O termo − Xt ∆ atua como uma força de retorno à origem

(um poço de potencial), enquanto o termo aleatório 2∆ ε t impede que o processo colapse nesse ponto,
mantendo a distribuição estacionária N (0, 1).

Note que o termo normalizador √12π não influencia o gradiente ∇ log p( x ), pois é constante. Assim,
o comportamento da dinâmica de Langevin depende apenas da forma relativa de p( x ), e não da sua escala
global. Esse fato é fundamental: em métodos baseados em gradientes (como Langevin e Hamiltonian Monte
Carlo), apenas a derivada do logaritmo da densidade importa.

Exercício 30. Considere o problema de gerar amostras de uma mistura bimodal de normais:

p( x ) = 1
2 N ( x; −3, 12 ) + 12 N ( x; 3, 12 ).

O objetivo é usar a dinâmica de Langevin para aproximar amostras dessa distribuição:



dXt = ∇ log p( Xt ) dt + 2 dBt .

1. Derive o gradiente de log p( x ). Expresse ∇ log p( x ) em termos das densidades de cada compo-
nente da mistura e de suas médias.
9.4. DENOISING SCORE MATCHING 125
2. Implemente a dinâmica de Langevin:

Xt+∆ = Xt + ∇ log p( Xt ) ∆ + 2∆ ε t , ε t ∼ N (0, 1).

Use ∆ = 0.02 e inicialize X0 ∼ N (0, 5). Gere trajetórias e compare o histograma das amostras
obtidas com a densidade-alvo p( x ).

3. Versão sem difusão: Repita a simulação removendo o termo aleatório,

Xt+∆ = Xt + ∇ log p( Xt ) ∆,

e observe o comportamento do processo. Ele converge para algum ponto específico? O que muda em
relação à versão estocástica?

4. Influência da condição inicial: Inicialize o processo com X0 = 1 e repita o experimento. O


processo é capaz de explorar os dois modos da mistura? Discuta por que a escolha de X0 pode
influenciar a região da distribuição onde o processo permanece por mais tempo.

Exercício 31. Considere novamente a mistura bimodal

p( x ) = 1
2 N ( x; −3, 12 ) + 12 N ( x; 3, 12 ),

e a dinâmica de Langevin

dXt = ∇ log p( Xt ) dt + 2 dBt .

1. Simule uma trajetória longa da dinâmica, iniciando em X0 ∼ N (0, 5). Plote o histograma das
amostras e o gráfico de posição t 7→ Xt .
Discuta o que está acontecendo no processo e como isso se liga com a matéria de MCMC.

2. Repita o experimento com várias trajetórias independentes cada uma com condição inicial dife-
rente, e compare os histogramas dos dois métodos.

9.4 Denoising Score Matching


Como vimos, a dinâmica de Langevin

dXt = 12 ∇ x log p( Xt ) dt + dWt

possui como distribuição estacionária a própria densidade alvo p( x ). De fato, pela equação de
Fokker–Planck associada,
∂pt ( x ) 1
log p( x ) pt ( x ) + 12 ∆pt ( x ),

= −∇ x · 2 ∇x
∂t
vemos que pt ( x ) = p( x ) é uma solução estacionária.
O problema, entretanto, é que na prática não conhecemos p( x ) de forma explícita e portanto não
temos acesso ao seu gradiente ∇ x log p( x ), o score, que aparece diretamente no termo de drift da
dinâmica de Langevin. O que dispomos, em geral, são apenas amostras independentes

x1 , . . . , x n ∼ p ( x ),
126 CAPÍTULO 9. PROCESSOS DE DIFUSÃO
e queremos, a partir delas, construir um estimador para o score ou, de forma equivalente, um
campo vetorial sθ ( x ) ≈ ∇ x log p( x ) que possa ser usado em dinâmicas como a de Langevin para
simular a distribuição alvo.
O objetivo do Denoising Score Matching (DSM) é aprender o score de uma distribuição de
probabilidade desconhecida p( x ), definido por

s⋆ ( x ) = ∇ x log p( x ).

A ideia central do DSM é transformar o problema de estimar o score em uma tarefa de regres-
são supervisionada. Para isso, partimos de amostras x ∼ p( x ) e adicionamos ruído gaussiano
ε ∼ N (0, σ2 ), obtendo dados corrompidos

x̃ = x + ε.

O método define como alvo de regressão

x − x̃
t= ,
σ2
e treina um modelo sθ ( x̃, σ) para aproximar esse alvo a partir do dado corrompido. A função de
perda considerada é h i
2
L(θ ) = Ex∼ p Eε∼N (0,σ2 ) sθ ( x̃, σ) − t .

Para entender por que esse procedimento funciona, começamos observando que a variável
corrompida x̃ possui densidade
Z
qσ ( x̃ ) = p( x ) φσ ( x̃ − x ) dx,

onde φσ é a densidade gaussiana N (0, σ2 ). Portanto, qσ é a convolução de p com uma gaussiana.


O score dessa densidade suavizada é
∇ x̃ qσ ( x̃ )
∇ x̃ log qσ ( x̃ ) = .
qσ ( x̃ )

Derivando sob o sinal de integral,


Z
∇ x̃ qσ ( x̃ ) = p( x ) ∇ x̃ φσ ( x̃ − x ) dx,

e como
x̃ − x
∇ x̃ φσ ( x̃ − x ) = − φσ ( x̃ − x ),
σ2
temos
x − x̃
Z
∇ x̃ qσ ( x̃ ) = p( x ) φσ ( x̃ − x ) dx.
σ2
Dividindo por qσ ( x̃ ) e lembrando que a densidade conjunta de ( x, x̃ ) é dada por p( x, x̃ ) =
p( x ) φσ ( x̃ − x ), podemos reescrever o integrando em termos da distribuição condicional de x
dado x̃:
p( x ) φσ ( x̃ − x )
p( x | x̃ ) = .
qσ ( x̃ )
9.4. DENOISING SCORE MATCHING 127
Substituindo essa expressão na fórmula do gradiente, obtemos

x − x̃
Z
∇ x̃ log qσ ( x̃ ) = p( x | x̃ ) dx,
σ2
o que mostra que o score de qσ é precisamente a esperança condicional

x − x̃
 
∇ x̃ log qσ ( x̃ ) = E x̃ .
σ2

Assim, mostramos que a esperança condicional do alvo t dado x̃ é exatamente o score da


densidade suavizada qσ . Como a perda quadrática é minimizada quando sθ ( x̃, σ) = E[t | x̃ ],
segue que o estimador ótimo do DSM é

s⋆ ( x̃, σ) = ∇ x̃ log qσ ( x̃ ).

Note que, fixado o valor de σ, o DSM está aprendendo o score não da densidade original
p( x ), mas da versão suavizada qσ ( x ) = ( p ∗ φσ )( x ), obtida ao convoluir p com uma gaussiana de
variância σ2 . Ou seja, estamos removendo detalhes finos da distribuição original e focando nas
variações mais suaves de p.
O campo vetorial ∇ x log qσ ( x ) aponta na direção em que a densidade suavizada mais cresce:
ele indica como deveríamos mover uma partícula que foi corrompida pelo ruído para restaurar
a estrutura de p.
Assim, quando treinamos sθ ( x, σ) para aproximar E[( x − x̃ )/σ2 | x̃ = x ], estamos aprendendo
como “desfazer” o ruído gaussiano de nível σ. Por isso o nome denoising score matching.

9.4.1 Estimando o score na prática

Na dedução anterior vimos que, para um valor fixo de σ, o modelo sθ ( x̃, σ) treinado com o
Denoising Score Matching aprende o score da densidade suavizada qσ ( x ). Na prática, entretanto,
não queremos apenas um único valor de σ, mas uma coleção de níveis de ruído que permitam
capturar a estrutura de p( x ) em diferentes escalas.
Usualmente escolhemos uma escala geométrica de valores
 k/(K−1)
σmax
σk = σmin , k = 0, . . . , K − 1,
σmin
128 CAPÍTULO 9. PROCESSOS DE DIFUSÃO
de modo que os níveis de ruído cubram uniformemente várias ordens de magnitude, indo de
ruído forte (σmax ) a ruído fraco (σmin ). Para cada amostra xi e para cada σk , podemos gerar várias
versões corrompidas
x̃i,j,k = xi + ε i,j,k , ε i,j,k ∼ N (0, σk2 I ),

e calcular os respectivos alvos de regressão


ε i,j,k
ti,j,k = − .
σk2

Dessa forma, podemos expandir o conjunto de dados criando várias amostras supervisionadas
( x̃i,j,k , σk , ti,j,k ), que descrevem, para diferentes níveis de ruído, a direção de denoising a ser apren-
dida.
O próximo passo é ajustar um modelo de regressão sθ que receba como entrada o ponto
corrompido x̃ e o valor de σ, e aprenda a prever o vetor t. Esse modelo pode ser uma rede neural,
mas também algo mais simples, como uma árvore de decisão ou um modelo de regressão não
linear. O objetivo é que, após o treinamento, o campo aprendido satisfaça aproximadamente

sθ ( x̃, σ) ≈ ∇ x̃ log qσ ( x̃ ),

fornecendo uma boa estimativa do score da densidade suavizada. Com isso, temos um modelo
capaz de indicar, para cada ponto corrompido, em que direção ele deve se mover para recuperar
regiões de alta densidade de p( x ).

Em resumo, o treinamento do DSM pode ser realizado seguindo os seguintes passos:

1. Definir uma escala geométrica de valores de ruído σ1 , . . . , σK , que vai do ruído mais forte
(σmax ) ao mais fraco (σmin ). Essa escala define o quanto cada amostra será corrompida.

2. Para cada amostra xi do conjunto de dados e para cada nível de ruído σk , gerar algumas
versões corrompidas x̃i,j,k = xi + ε i,j,k , com ε i,j,k ∼ N (0, σk2 I ). Isso aumenta o tamanho do
conjunto de treinamento e ajuda o modelo a aprender a remover diferentes intensidades de
ruído.
9.4. DENOISING SCORE MATCHING 129
3. Calcular o alvo de regressão para cada par ( x̃i,j,k , σk ) como ti,j,k = −ε i,j,k /σk2 , que representa a
direção na qual a amostra corrompida deve ser movida para retornar à distribuição original.

4. Montar um conjunto de dados supervisionado formado por pares de entrada e saída


([ x̃i,j,k , σk ], ti,j,k ). O valor de σk é incluído como uma feature adicional para indicar o nível de
ruído daquela amostra.

5. Ajustar um modelo de regressão — que pode ser simples, como uma Floresta Aleatória —
usando essas amostras expandidas. O modelo deve aprender a prever t a partir de [ x̃, σ].

6. Após o treinamento, o modelo resultante sθ ( x̃, σ) fornece uma aproximação do campo de


score ∇ x̃ log qσ ( x̃ ), indicando para cada ponto corrompido em qual direção ele deve se
mover para se aproximar de regiões de alta densidade de p( x ).

Exercício 32. Neste exercício, vamos implementar o treinamento de um modelo de Denoising Score
Matching (DSM) em um conjunto de dados sintético. O objetivo é aprender o campo de score sθ ( x̃, σ) a
partir de amostras corrompidas, conforme discutido em aula.

1. Gere um conjunto de dados bidimensional usando a função make_moons abaixo.

2. Construa uma escala geométrica de valores de ruído usando a função geometric_sigmas.

3. Para cada valor de σ, corrompa as amostras adicionando ruído gaussiano ε ∼ N (0, σ2 I ), e calcule o
alvo t = −ε/σ2 .

4. Monte um conjunto de dados supervisionado contendo como entrada o par [ x̃, σ] e como saída o vetor
t.

5. Treine um modelo de regressão à sua escolha (por exemplo, regressão linear, rede neural, ou floresta
aleatória) para aprender a mapear [ x̃, σ] 7→ t.

6. Fixe um valor de σ e visualize o campo aprendido sobre uma grade bidimensional de pontos, compa-
rando visualmente os resultados de diferentes modelos.

9.4.2 Etapa de Inferência via Langevin

Uma vez treinado o modelo de score sθ ( x̃, σ), podemos utilizá-lo para gerar novas amostras de
uma distribuição aproximando p( x ). A ideia é usar o campo aprendido como uma estimativa do
gradiente do logaritmo da densidade, e então realizar uma simulação do processo de Langevin
Anelado (Annealed Langevin Dynamics — ALD).
O método segue a dinâmica estocástica
αi √
x t = x t −1 + sθ ( xt−1 , σi ) + αi zt , zt ∼ N (0, I ),
2
onde cada nível de ruído σi controla a escala das atualizações e αi é o passo de integração
proporcional a σi2 . Em termos práticos, seguimos a sequência de sigmas do maior (σmax ) ao
menor (σmin ), de modo que as primeiras iterações façam o ponto explorar amplamente o espaço,
e as últimas permitam um refinamento local.
O algoritmo pode ser descrito assim:
130 CAPÍTULO 9. PROCESSOS DE DIFUSÃO

1. Inicialização: Inicie x0 como uma amostra de uma distribuição de ruído, por exemplo
2 I ).
x0 ∼ N (0, σmax

2. Iteração sobre os níveis de ruído: Para cada σi da sequência geométrica:

• Calcule o passo de integração αi = ε · (σi2 /σmin


2 ), onde ε > 0 é um parâmetro fixo de

escala.
• Repita T vezes (por exemplo, T = 10):

αi √
x ← x+ 2 sθ ( x, σi ) + αi z, z ∼ N (0, I ).

3. Saída: Após percorrer todos os níveis de ruído, o vetor final x T é uma amostra aproximada
da distribuição de interesse p( x ).

Figura 9.2: Exemplo de amostragem via Annealed Langevin Dynamics. As trajetórias começam em
ruído grande e gradualmente convergem para as regiões de alta densidade de p( x ).

A intuição é que, nas primeiras escalas de ruído, o modelo aprende apenas a estrutura global
de p( x ) — as regiões de alta densidade —, e conforme σ diminui, o processo de Langevin refina
as amostras nessas regiões, capturando detalhes finos da distribuição.

Exercício 33. Neste exercício, você deverá implementar o processo de Annealed Langevin Dynamics
(ALD) para gerar novas amostras de uma distribuição aproximando o conjunto de dados moons.
9.4. DENOISING SCORE MATCHING 131
1. Gere o conjunto de dados bidimensional usando a função make_moons da biblioteca [Link].

2. Treine um modelo de Denoising Score Matching (DSM) utilizando uma escala geométrica de
valores de ruído σ1 > σ2 > · · · > σK , conforme descrito na seção anterior.

3. Implemente o algoritmo de Annealed Langevin Dynamics, usando o campo aprendido sθ ( x, σ)


para atualizar as amostras segundo
αi √
xt = xt−1 + sθ ( xt−1 , σi ) + αi zt , zt ∼ N (0, I ),
2
percorrendo os níveis de ruído do maior (σmax ) ao menor (σmin ).

4. Após a simulação, visualize lado a lado o conjunto de dados original e as amostras geradas pelo
processo de Langevin. Compare visualmente se as amostras geradas reproduzem a estrutura caracte-
rística do moons.

Exercício 34. Neste exercício, você deverá pensar em como adaptar todo o processo de Denoising Score
Matching (DSM) e a etapa de inferência via Annealed Langevin Dynamics (ALD) para o caso condici-
onal, em que desejamos modelar a distribuição p(y | x ).

1. Relembre que, no caso não condicional, o modelo sθ ( x̃, σ) é treinado para aproximar o score da
densidade suavizada ∇ x̃ log qσ ( x̃ ), onde qσ é obtida pela convolução de p( x ) com ruído gaussiano.
Pense em como essa ideia pode ser estendida para o caso condicional, em que queremos o score
∇y log qσ (y | x ).

2. Escreva como ficaria o conjunto de treinamento supervisionado para o modelo condicional. Dica:
ao corromper as variáveis de saída yi com ruído gaussiano ε i,j,k ∼ N (0, σk2 I ), o alvo passa a ser
ti,j,k = −ε i,j,k /σk2 , e o modelo deve receber [ỹi,j,k , xi , σk ] como entrada.

3. Implemente o treinamento de um modelo de score sθ (y, x, σ) que aprenda o campo condicional de


denoising. Você pode usar um modelo simples, como uma Floresta Aleatória ou uma rede neural.

4. Adapte o algoritmo de Annealed Langevin Dynamics para o caso condicional, mantendo x fixo e
atualizando apenas y:
αi √
yt = yt−1 + sθ (yt−1 , x, σi ) + αi zt , zt ∼ N (0, I ).
2
132 CAPÍTULO 9. PROCESSOS DE DIFUSÃO
5. Escolha um conjunto de dados simples para testar o modelo, por exemplo:

• Gere pares ( x, y) com y = sin(2x ) + | x | ε, ε ∼ N (0, 1).


• Treine o modelo de score condicional.
• Use o ALD condicional para gerar novas amostras de y para valores fixos de x.

6. Visualize os resultados mostrando, para alguns valores fixos de x, as distribuições das amostras
geradas de y | x, comparando-as com os valores verdadeiros observados.
Capítulo 10

Bootstrap

10.1 Uma visão pragmática de Bootstrap


O nome bootstrap tem origem indireta nas histórias fantásticas do Barão de Münchhausen, per-
sonagem do século XVIII conhecido por narrar feitos impossíveis. Em uma de suas aventuras, o
Barão conta ter conseguido sair de um pântano puxando a si mesmo pelo cabelo (junto com o
cavalo), uma façanha evidentemente absurda. A expressão inglesa posterior “to pull oneself up by
one’s bootstraps” — erguer-se puxando as próprias botas — tornou-se uma metáfora para realizar
algo sem ajuda externa, e foi essa a imagem que inspirou Efron (1979) ao nomear seu método:
um procedimento que, metaforicamente, se ergue sozinho.
A ideia central do método de bootstrap é substituir a incerteza sobre a distribuição popula-
cional F pela incerteza induzida pela distribuição empírica F̂n . Formalmente, seja X1 , . . . , Xn ∼ F
uma amostra i.i.d. e seja o parâmetro de interesse θ = t( F ), para algum funcional t definido em
um espaço apropriado de distribuições de probabilidade. O estimador empírico é θ̂ = t( F̂n ), com

1 n
n i∑
F̂n ( x ) = 1 { Xi ≤ x } .
=1

O bootstrap consiste em gerar amostras X1∗ , . . . , Xn∗ i.i.d. de F̂n (isto é, reamostrar com reposição
dos dados observados), e então computar

θ̂ ∗ = t( F̂n∗ ).

A distribuição condicional de θ̂ ∗ dado os dados é usada como aproximação para a distribuição


amostral de θ̂.

Exemplo 35 (Média amostral). Considere uma amostra X1 , . . . , Xn ∼ F e o estimador usual da média

1 n
n i∑
θ̂ = X̄ = Xi .
=1

O objetivo é quantificar a incerteza de θ̂, isto é, como ela variaria se repetíssemos o experimento várias
vezes. Em termos formais, queremos aproximar a distribuição amostral de θ̂,

P

n(θ̂ − θ ) ≤ a ,

133
134 CAPÍTULO 10. BOOTSTRAP
onde θ = E [ X ].

Em situações simples, podemos obter essa distribuição de forma analítica: se F for normal com variância
σ2 , então

n( X̄ − θ ) ∼ N (0, σ2 ).

Entretanto, o bootstrap permite estimar a variabilidade de X̄ sem supor nada sobre F. A ideia é construir
uma amostra artificial que imite o que aconteceria se o experimento fosse repetido.

O procedimento é o seguinte:

(1) A partir da amostra observada X1 , . . . , Xn , sorteie com reposição n observações X1∗ , . . . , Xn∗ . Cada
amostra reamostrada define uma distribuição empírica F̂n∗ .

(2) Calcule a média de cada amostra reamostrada:

1 n ∗
n i∑
X̄ ∗ = Xi .
=1

(3) Repita o processo B vezes (por exemplo, B = 1000), obtendo X̄ ∗(1) , . . . , X̄ ∗( B) .

O conjunto dessas médias forma uma aproximação empírica da distribuição de X̄. O desvio padrão das
médias reamostradas,
v
B B
u
u 1
¯∗ = 1
B − 1 b∑ ∑ X̄ ∗(b) ,
σ̂boot = t X̄ ¯ ∗ 2 ,
∗(b) − X̄ X̄
=1
B b =1

é uma estimativa do erro padrão de X̄.


Como consequência, é possível construir intervalos de confiança para θ usando os quantis das médias
bootstrap:
 ∗ ∗
I1boot

−α = X̄(α/2) , X̄(1−α/2) ,

onde os termos entre parênteses denotam os quantis empíricos da distribuição das médias reamostradas.

A Figura 35 compara a distribuição verdadeira da média amostral (obtida por simulação Monte Carlo)
com a distribuição condicional gerada pelo bootstrap, para F = N (5, 22 ) e n = 30.
10.1. UMA VISÃO PRAGMÁTICA DE BOOTSTRAP 135
Exemplo 36 (Mediana). Enquanto a média é um estimador linear e de fácil análise, a mediana apresenta
um comportamento mais sutil. Se X1 , . . . , Xn ∼ F e θ̂ = F̂n−1 (0.5), sua variabilidade depende da densidade
de F no ponto da mediana θ, pois pequenas flutuações em F se traduzem em variações maiores ou menores
na posição onde F ( x ) = 1/2.

Uma forma breve de derivar a variância assintótica é a seguinte. Como F (θ ) = 1/2 e F̂n (θ̂ ) = 1/2,
podemos relacionar θ̂ e θ por uma expansão local de F em torno de θ:

F (θ̂ ) ≈ F (θ ) + f (θ )(θ̂ − θ ),

onde f (θ ) = F ′ (θ ). Como F̂n converge uniformemente para F (Teorema de Glivenko–Cantelli), é lícito


substituir F (·) por F̂n (·) nessa aproximação sem alterar o termo assintótico dominante — a diferença é da

ordem o p (1/ n). Substituindo F (θ̂ ) por F̂n (θ̂ ) = 1/2, obtemos:

0 ≈ F̂n (θ ) − F (θ ) + f (θ )(θ̂ − θ ).

Multiplicando por n,
√ 1 √ 
n(θ̂ − θ ) ≈ − n F̂n (θ ) − F (θ ) .
f (θ )
Pelo Teorema Central do Limite empírico,
√  
n F̂n (θ ) − F (θ ) ⇒ N 0, F (θ )(1 − F (θ )) = N (0, 1/4).

Portanto,
  1
Var θ̂ ≈ .
4n f (θ )2

O bootstrap oferece uma alternativa direta. Partindo da amostra observada, reamostra-se com reposição
B vezes e calcula-se a mediana em cada reamostra,

∗(b) ∗(b)
θ̂ ∗(b) = median( X1 , . . . , Xn ), b = 1, . . . , B.
136 CAPÍTULO 10. BOOTSTRAP
A variabilidade entre as medianas reamostradas fornece uma estimativa do erro padrão de θ̂,
v
B
1 B ∗(b)
u
u 1
B − 1 b∑ B b∑
∗(b) − θ̄ ∗ 2 , ∗

σ̂boot = t θ̂ θ̄ = θ̂ .
=1 =1

Dessa forma, mesmo sem conhecer f (θ ) nem a forma de F, é possível avaliar empiricamente a incerteza da
mediana.

Exercício 35. Reproduza os experimentos dos exercícios anteriores.

10.2 Uma visão teórica de Bootstrap


À primeira vista, o funcionamento do bootstrap pode parecer misterioso. Afinal, estamos ten-
tando aproximar a variabilidade de um estimador — algo que depende da distribuição popula-
cional desconhecida F — usando apenas a distribuição empírica F̂n , construída a partir de uma
única amostra. Em outras palavras, substituímos o próprio objeto que queremos inferir por uma
aproximação baseada nos dados: o método “ergue-se” sobre si mesmo, exatamente como sugere
seu nome.
O fato de essa substituição produzir resultados válidos não é trivial. Não há, a princípio,
nenhuma razão óbvia para que as flutuações de um estimador calculado a partir de F̂n reflitam
corretamente aquelas que surgiriam se repetíssemos o experimento sob F. Ainda assim, sob
condições gerais, o bootstrap funciona — e de forma surpreendentemente robusta.

10.2.1 A desigualdade de Dvoretzky–Kiefer–Wolfowitz

Antes de entender por que o bootstrap funciona, é preciso quantificar o quão bem a distribuição
empírica F̂n aproxima a verdadeira F. A desigualdade de Dvoretzky–Kiefer–Wolfowitz (DKW) é
o ponto de partida: ela fornece uma garantia não assintótica, válida para qualquer n, de que as
duas funções de distribuição estão próximas com alta probabilidade.
Mais precisamente, para amostras i.i.d. X1 , . . . , Xn ∼ F, vale que
 
2
P sup F̂n ( x ) − F ( x ) > ε ≤ Ce−nε , ∀ ε > 0.
x

Essa desigualdade mostra que o erro uniforme entre F e F̂n decai exponencialmente com n.
Em particular, F̂n converge quase certamente para F, o que é o conteúdo do teorema de Gli-
venko–Cantelli.
Esse resultado é notável por duas razões. Primeiro, ele é completamente não assintótico: a
probabilidade de desvio pode ser controlada explicitamente para qualquer n. Segundo, ele já
sugere a ideia central do bootstrap — se F̂n está uniformemente próxima de F, então estimadores
baseados em uma ou outra devem ter comportamentos muito semelhantes.
O primeiro ingrediente para a prova da DKW é a desigualdade das diferenças finitas, tam-
bém conhecida como desigualdade de McDiarmid. Ela fornece um limite de concentração para
funções de variáveis independentes cujo valor não muda muito quando uma única observação é
alterada.
10.2. UMA VISÃO TEÓRICA DE BOOTSTRAP 137
Teorema 12 (Desigualdade de McDiarmid). Sejam X1 , . . . , Xn variáveis independentes assumindo
valores em um conjunto arbitrário X , e seja f : X n → R uma função tal que

| f ( x1 , . . . , xi , . . . , xn ) − f ( x1 , . . . , xi′ , . . . , xn )| ≤ ci

para todo i e para todos os valores possíveis das variáveis. Então, para todo ε > 0,
2ε2
 
P ( f ( X1 , . . . , Xn ) − E [ f ( X1 , . . . , Xn )] ≥ ε) ≤ exp − n 2 .
∑ i =1 c i
A ideia é simples: se cada variável individual tem influência limitada sobre o valor final
de f , então f ( X1 , . . . , Xn ) não pode se desviar muito de sua média. Essa desigualdade é uma
generalização do lema de Hoeffding para funções simétricas e não lineares das observações.
No caso da DKW, aplicamos esse resultado à função

f ( X1 , . . . , Xn ) = sup | F̂n ( x ) − F ( x )|.


x

Observe que alterar um único Xi muda no máximo um termo da soma que define F̂n ( x ), e
portanto o valor de f só pode variar em 1/n. Assim, podemos tomar ci = 1/n para todo i, o que

n
1 1
∑ c2i = n × n2 = n .
i =1
Substituindo isso na desigualdade de McDiarmid, obtemos
   
2
P sup | F̂n ( x ) − F ( x )| − E sup | F̂n ( x ) − F ( x )| ≥ ε ≤ e−2nε .
x x

Esse é o passo essencial da prova da DKW: ele mostra que a distância uniforme entre F̂n e F
está fortemente concentrada em torno de sua média. O passo seguinte consiste em controlar o
valor esperado E supx | F̂n ( x ) − F ( x )| .
 

Para controlar o valor esperado de supx | F̂n ( x ) − F ( x )|, precisamos entender primeiro um
caso mais simples: o comportamento do valor esperado do máximo de um número finito de
variáveis aleatórias.
138 CAPÍTULO 10. BOOTSTRAP
Lema 1. Sejam Z1 , . . . , Zk variáveis aleatórias independentes, centradas e subgaussianas com parâmetro
σ2 , ou seja, h i 2 2
E etZj ≤ et σ /2 , ∀t ∈ R, j = 1, . . . , k.

Então  
E max Zj ≤ σ
p
2 log k.
1≤ j ≤ k

Demonstração. Para todo t > 0,


" # !
    k k
1 h i 1 1 1 h i
E max Zj ≤ log E et maxj Zj = log E max etZj ≤ log E ∑ etZj = log ∑E etZj .
j t t j t j =1
t j =1

2 2
Pela hipótese subgaussiana, E etZj ≤ et σ /2 para todo j, logo
 

log k tσ2
 
1  2 2 
E max Zj ≤ log ket σ /2 = + .
j t t 2

Minimizando o lado direito em t > 0, obtemos t∗ = 2 log k/σ, e portanto


p

 
E max Zj ≤ σ 2 log k.
p
1≤ j ≤ k

Como já vimos, variáveis aleatórias limitadas são subgaussianas. Em particular, se | Z | ≤ 1


quase certamente e E [ Z ] = 0, então
h i 2
E etZ ≤ et /2 , ∀t ∈ R,

ou seja, Z é subgaussiana com parâmetro σ2 = 1.


No caso do processo empírico, cada termo

1 n


F̂n ( x ) − F ( x ) = 1 { Xi ≤ x } − F ( x )
n i =1

é a média de n variáveis independentes, centradas e limitadas no intervalo [−1, 1]. Portanto, cada
uma é subgaussiana com parâmetro 1/n, o que implica que o vetor ( F̂n ( x1 ) − F ( x1 ), . . . , F̂n ( xk ) −

F ( xk )) é formado por variáveis subgaussianas com desvio σ = 1/ n.

Aplicando o lema anterior, obtemos


 
C p
E max | F̂n ( x j ) − F ( x j )| ≤ √ log k,
1≤ j ≤ k n

para alguma constante universal C > 0.

No entanto, ainda resta um detalhe importante: o supremo em supx | F̂n ( x ) − F ( x )| é tomado


sobre todos os x ∈ R, e não apenas sobre um número finito k de pontos. À primeira vista, isso
poderia invalidar o argumento anterior. Mas, no caso do processo empírico, esse supremo é de
fato atingido em um conjunto finito de valores.
10.2. UMA VISÃO TEÓRICA DE BOOTSTRAP 139
Como F̂n é uma função em degraus que muda apenas nos pontos observados X1 , . . . , Xn , entre
duas observações consecutivas a função permanece constante. Já F ( x ) é contínua e monótona
crescente, de modo que a diferença | F̂n ( x ) − F ( x )| atinge seu máximo exatamente nos extremos
desses intervalos. Portanto, para calcular o supremo, basta avaliar a diferença em um número
finito de pontos — tipicamente nos extremos dos intervalos ( X(i) , X(i+1) ).
Com isso, o problema contínuo se reduz a um máximo discreto sobre aproximadamente n + 1
pontos, e o resultado anterior aplica-se diretamente. Assim, podemos usar o mesmo controle
  r
log n
E sup | F̂n ( x ) − F ( x )| ≲ .
x n

Com isso, temos todos os elementos da prova. A desigualdade de McDiarmid garante que
   
2
P sup | F̂n ( x ) − F ( x )| − E sup | F̂n ( x ) − F ( x )| > ε ≤ e−2nε .
x x

Por outro lado, mostramos que o valor esperado do supremo é pequeno,


  r
log n
E sup | F̂n ( x ) − F ( x )| ≲ .
x n

Combinando as duas estimativas, obtemos uma forma aproximada da desigualdade de Dvo-


retzky–Kiefer–Wolfowitz:
r !
log n 2
P sup | F̂n ( x ) − F ( x )| > ε + C ≤ e−2nε ,
x n

para alguma constante universal C > 0.


Essa não é ainda a forma exata da desigualdade de Dvoretzky–Kiefer–Wolfowitz, pois sua
demonstração completa requer argumentos técnicos mais delicados — em particular, uma aná-
lise precisa do comportamento do processo empírico e de seu valor esperado. Ainda assim, o
resultado acima já captura a essência da DKW: a diferença uniforme entre F̂n e F é tipicamente

da ordem 1/ n, e as flutuações em torno desse valor decaem exponencialmente com nε2 .

10.2.2 Bootstrap e pontes brownianas

A desigualdade de Dvoretzky–Kiefer–Wolfowitz fornece uma noção quantitativa de quão pró-


xima a distribuição empírica F̂n está de F em probabilidade. Ela mostra que, com alta probabi-
lidade, o erro uniforme é pequeno. No entanto, essa informação ainda é limitada: ela descreve
apenas a magnitude do desvio, mas não sua forma ou distribuição assintótica.
Para entender de fato por que o bootstrap funciona, precisamos ir além da convergência
em probabilidade e estudar a convergência em distribuição do processo empírico. Em outras
palavras, queremos saber como as flutuações de F̂n em torno de F se comportam quando n → ∞.

Teorema 13 (Teorema de Donsker). Sejam X1 , . . . , Xn ∼ F i.i.d. com função de distribuição contínua


F. Defina o processo empírico como

x ∈ R.

Gn ( x ) = n F̂n ( x ) − F ( x ) ,
140 CAPÍTULO 10. BOOTSTRAP
Então Gn converge em distribuição para um processo gaussiano centrado GF com covariância

Cov ( GF ( x ), GF (y)) = F ( x ∧ y) − F ( x ) F (y).

O processo limite GF é chamado de ponte browniana associada a F.

Quando F ( x ) = x em [0, 1], o processo empírico se reduz ao caso uniforme:



Gn (t) = n ( F̂n (t) − t), t ∈ [0, 1].

Pelo Teorema de Donsker, temos que Gn ⇒ B0 , onde B0 (t) é a ponte browniana padrão, um processo
gaussiano centrado com covariância

Cov ( B0 (s), B0 (t)) = min(s, t) − st.

Lembrando que, por construção, o processo B0 (t) é centrado, isto é, E [ B0 (t)] = 0 para todo
t ∈ [0, 1]. Tomando então s = t,

Var [ B0 (t)] = t − t2 = t(1 − t),

o que implica que a variância é máxima no meio do intervalo (t = 1/2) e decresce até zero nos
extremos. Isso mostra que o processo necessariamente satisfaz B0 (0) = B0 (1) = 0 — o início e o
fim são fixos, mas entre eles o comportamento é aleatório e gaussiano.
Intuitivamente, portanto, uma ponte browniana é um movimento browniano “amarrado” nas
extremidades: começa em zero, flutua livremente no interior, e é progressivamente puxado de
volta até atingir zero novamente em t = 1.

Podemos agora perguntar: que tipo de equação estocástica seria capaz de gerar um pro-
cesso com esse comportamento? Um movimento browniano comum Wt é livre: suas flutua-
ções acumulam-se ao longo do tempo, e sua variância cresce linearmente, Var [Wt ] = t. Para
transformá-lo em uma ponte, precisamos forçá-lo a retornar a zero em t = 1. Isso pode ser feito
10.2. UMA VISÃO TEÓRICA DE BOOTSTRAP 141
introduzindo um termo de drift que “corrige” a trajetória conforme o tempo avança, puxando o
processo de volta à origem.
A ponte browniana padrão pode ser descrita como a solução da equação estocástica

B0 (t)
dB0 (t) = − dt + dWt , B0 (0) = 0, t ∈ [0, 1).
1−t
O termo de ruído dWt representa o movimento browniano livre, enquanto o termo de drift
− B0 (t)/(1 − t) atua como uma força restauradora que cresce quando t → 1. Essa força é justa-
mente o que garante que o processo retorne a zero no instante final.

Para ver isso de forma intuitiva, considere a discretização de Euler–Maruyama:


 ∆t  √
Bk+1 = Bk 1 − + ∆t ξ k , ξ k ∼ N (0, 1).
1 − tk
∆t
Nos primeiros passos, o fator multiplicativo 1 − 1− tk é próximo de 1, e o processo se comporta
como um movimento browniano comum. À medida que tk se aproxima de 1, o denominador
1 − tk diminui e o fator de correção se aproxima de zero, fazendo com que o termo determinístico
anule o valor atual do processo. No último passo, quando 1 − tk = ∆t, temos

Bk+1 = ∆t ξ k ∼ N (0, ∆t),

mostrando que o processo termina praticamente em zero, restando apenas um ruído residual
que desaparece no limite ∆t → 0.
Assim, o termo de drift − B0 (t)/(1 − t) surge naturalmente como o mecanismo que, ao longo
do tempo, ajusta continuamente as trajetórias para que todas convirjam exatamente a B0 (1) = 0.
Em termos geométricos, trata-se de um movimento browniano sujeito a uma força elástica cada
vez mais intensa, que o “puxa” para a origem conforme o tempo restante se esgota.

Seguindo a mesma lógica do caso uniforme, o processo limite do Teorema de Donsker para
uma distribuição qualquer F também deve satisfazer uma condição de fronteira análoga. De fato,
vimos que a covariância do processo limite é

Cov ( GF ( x ), GF (y)) = F ( x ∧ y) − F ( x ) F (y),

o que implica, para x = y,


Var [ GF ( x )] = F ( x )(1 − F ( x )).
142 CAPÍTULO 10. BOOTSTRAP
Essa expressão mostra que, assim como na ponte padrão, a variância é nula nos extremos F ( x ) =
0 e F ( x ) = 1, ou seja, o processo também deve começar e terminar em zero — apenas agora as
“bordas” são determinadas pelos quantis de F.
Uma maneira natural de entender esse comportamento é pensar que o eixo do tempo foi re-
parametrizado pelo mapa u = F ( x ). No caso uniforme, o tempo é o próprio parâmetro t ∈ [0, 1];
mas, quando F não é identidade, o processo não evolui linearmente em x, e sim de acordo com a
probabilidade acumulada. Regiões em que F cresce rapidamente (alta densidade) correspondem
a “intervalos de tempo curtos”, e regiões onde F cresce lentamente funcionam como “intervalos
longos”. Portanto, o processo limite pode ser visto como uma ponte browniana padrão traçada
no eixo de probabilidade:
GF ( x ) = B0 ( F ( x )).

Essa simples mudança de variável já explica a estrutura da variância F ( x )(1 − F ( x )) e as


condições de fronteira.
Se quisermos descrever de forma aproximada a dinâmica correspondente no eixo x, basta
notar que cada incremento infinitesimal du = f ( x ) dx representa a passagem de tempo efetiva
no domínio de F. Substituindo o tempo t por u = F ( x ) na equação da ponte padrão, obtemos
informalmente
f (x)
q
dGF ( x ) = − GF ( x ) dx + f ( x ) dWx .
1 − F(x)
Mas, mais importante do que a equação, é a interpretação geométrica: a ponte associada a F é
o mesmo movimento browniano “amarrado” nos extremos, porém traçado sobre um eixo não
linear — o eixo da probabilidade. Em regiões densas, as flutuações são mais comprimidas; em
regiões raras, mais espaçadas — mas, em todos os casos, o processo parte de zero e retorna a
zero no final.

Exercício 36. Considere X1 , . . . , Xn ∼ N (0, 1) e defina



Gn ( x ) = n ( F̂n ( x ) − F ( x )),

onde F̂n é a CDF empírica e F ( x ) = Φ( x ).


10.2. UMA VISÃO TEÓRICA DE BOOTSTRAP 143
Compare Gn ( x ) com a ponte browniana associada a F, que satisfaz

f (x)
q
dGF ( x ) = − GF ( x ) dx + f ( x ) dWx .
1 − F(x)

Use Euler–Maruyama no intervalo x ∈ [−3.5, 3.5] com malha uniforme:

f ( xk )
q √
Gk+1 = Gk − G ∆x + f ( xk ) ξ k ∆x, ξ k ∼ N (0, 1), G0 = 0.
1 − F ( xk ) k

Tome n = 1000, gere várias trajetórias independentes de ambos os processos e trace o envelope de 90%
ponto a ponto para comparar visualmente. O envelope pode ser obtido tomando, para cada xk , os percentis
5 e 95 das trajetórias simuladas, por exemplo em Python:

low, high = [Link](G_list, [5, 95], axis=0).


144 CAPÍTULO 10. BOOTSTRAP
Capítulo 11

Estratégias para acelerar códigos em


Python

11.1 Profiling com cProfile


Antes de otimizar, é essencial medir onde o tempo realmente está sendo gasto. O módulo
cProfile, da biblioteca padrão do Python, permite gerar um perfil de execução mostrando quan-
tas vezes cada função foi chamada e quanto tempo ela consumiu.
O uso mais simples é direto pelo terminal, aplicando o profiler a um script:
1 # Executa o script inteiro e mostra estatisticas
2 python -m cProfile meu_script . py
3

4 # Salva os resultados em arquivo para analise posterior


5 python -m cProfile -o saida . prof meu_script . py

Rodando pelo terminal

O arquivo gerado pode ser inspecionado com o módulo pstats, que permite ordenar e filtrar
resultados:
1 python -m pstats saida . prof
2 # Comandos uteis no prompt do pstats :
3 # sort time ( ordena pelo tempo interno da funcao )
4 # sort cumtime ( ordena pelo tempo acumulado )
5 # stats 20 ( mostra as 20 funcoes mais custosas )
6 # callers func ( quem chama ’ func ’)
7 # callees func ( quem ’ func ’ chama )

Explorando com pstats (terminal)

Também é possível usar cProfile dentro do código, o que facilita em notebooks ou quando
queremos medir apenas um trecho específico:
1 import cProfile , pstats , io
2

3 pr = cProfile . Profile ()

145
146 CAPÍTULO 11. ESTRATÉGIAS PARA ACELERAR CÓDIGOS EM PYTHON
4 pr . enable ()
5

6 # --- codigo a ser medido ---


7 resultado = algoritmo_pesado ()
8 # ----------------------------
9

10 pr . disable ()
11 s = io . StringIO ()
12 ps = pstats . Stats ( pr , stream = s ) . sort_stats ( " cumtime " )
13 ps . print_stats (10) # mostra as 10 funcoes mais custosas
14 print ( s . getvalue () )

Usando cProfile dentro do código

As duas métricas principais são:

• time: tempo gasto apenas dentro da função, sem contar chamadas internas.

• cumtime: tempo acumulado, incluindo todas as funções chamadas.

Em geral, começa-se ordenando por cumtime para encontrar o caminho mais caro da execução.
Depois, olhar o time ajuda a identificar funções individuais que valem otimização.

A seguir montamos um experimento simples para evidenciar como o cProfile ajuda a loca-
lizar gargalos: comparamos uma multiplicação de matrizes feita de forma ingênua em Python
(três laços) com a versão vetorizada do NumPy (delegada à BLAS).
O código abaixo implementa as duas versões e usa uma função auxiliar para rodar o pro-
filer em cada uma delas, exibindo as funções mais custosas. O script pode ser salvo como
profile_matmul.py.
1 import numpy as np
2 import math
3 import cProfile , pstats , io
4 import time
5

6 # Versao ingenua : 3 loops em Python


7 def matmul_naive (A , B ) :
8 n , m = A . shape
9 m2 , p = B . shape
10 assert m == m2
11 C = np . zeros (( n , p ) )
12 for i in range ( n ) :
13 for j in range ( p ) :
14 s = 0.0
15 for k in range ( m ) :
16 s += A [i , k ] * B [k , j ]
17 C [i , j ] = s
18 return C
19
11.1. PROFILING COM CPROFILE 147
20 # Versao NumPy ( vetorizada / BLAS )
21 def matmul_numpy (A , B ) :
22 return A @ B
23

24 def profile_func ( func , * args , top =15) :


25 pr = cProfile . Profile ()
26 pr . enable ()
27 t0 = time . perf_counter ()
28 result = func (* args )
29 t1 = time . perf_counter ()
30 pr . disable ()
31 s = io . StringIO ()
32 ps = pstats . Stats ( pr , stream = s ) . sort_stats ( " cumtime " )
33 ps . print_stats ( top )
34 print ( f " \n > > > > Tempo total ( parede ) : { t1 - t0 :.3 f } s \ n " )
35 return s . getvalue ()
36

37 A = np . random . rand (n , n )
38 B = np . random . rand (n , n )
39

40 print ( " ==== Profiling matmul_naive ==== " )


41 out_naive = profile_func ( matmul_naive , A , B )
42 print ( out_naive )
43

44 print ( " ==== Profiling matmul_numpy ==== " )


45 out_np = profile_func ( matmul_numpy , A , B )
46 print ( out_np )

Esse script pode ser executado normalmente com python profile_matmul.py. Outra forma é
rodar o profiler diretamente no terminal, usando python -m cProfile -o [Link] profile_matmul.py.
Nesse caso o resultado fica salvo em [Link], e podemos explorá-lo depois com o mó-
dulo pstats de forma interativa, usando comandos como sort cumtime, stats 20 ou callers
matmul_naive.
Rodando a versão ingênua, a saída típica mostra que praticamente todo o tempo foi consu-
mido dentro de matmul_naive:
1 7 function calls in 8.532 seconds
2

3 Ordered by : cumulative time


4 ncalls tottime percall cumtime percall filename : lineno ( function )
5 1 8.523 8.523 8.523 8.523 profile_matmul . py :11(
matmul_naive )
6 1 0.009 0.009 0.009 0.009 { built - in method builtins .
print }
7 ...

Ao comparar com a versão vetorizada, vemos que a execução termina em milésimos de se-
gundo, com o tempo todo acumulado em matmul_numpy:
148 CAPÍTULO 11. ESTRATÉGIAS PARA ACELERAR CÓDIGOS EM PYTHON

1 7 function calls in 0.020 seconds


2

3 Ordered by : cumulative time


4 ncalls tottime percall cumtime percall filename : lineno ( function )
5 1 0.019 0.019 0.019 0.019 profile_matmul . py :28(
matmul_numpy )
6 ...

Os números exatos variam conforme o tamanho das matrizes e a biblioteca BLAS instalada,
mas o padrão é claro: a implementação ingênua em Python puro consome segundos de CPU,
enquanto a versão NumPy é milhares de vezes mais rápida.
As colunas do profiler têm significados diferentes. O campo ncalls mostra o número de
chamadas à função. O tottime corresponde ao tempo gasto apenas dentro da função, sem contar
chamadas internas. Já o cumtime indica o tempo acumulado incluindo funções chamadas dentro
dela. Em geral, ordenar por cumtime ajuda a encontrar o caminho mais custoso da execução,
enquanto olhar para tottime revela funções “folha” particularmente lentas.
Quando esse mesmo código é rodado em um notebook Jupyter, o output tende a ficar mais
“poluído”, aparecendo referências a asyncio, zmq e outros componentes do kernel. Isso acontece
porque o profiler mede tudo o que roda no processo, não apenas a nossa função. Para uma visão
limpa e didática, vale a pena executar o script direto no terminal.

11.2 Paralelização com [Link]


A biblioteca joblib fornece uma forma simples de paralelizar loops embaraçosamente paralelos em
Python, isto é, situações em que várias tarefas independentes podem ser executadas ao mesmo
tempo. A ideia básica é escrever um laço for como uma compreensão preguiçosa de chamadas a
uma função via delayed, e despachar essas tarefas para Parallel, que se encarrega de distribuí-
las entre diferentes trabalhadores.
1 from joblib import Parallel , delayed
2 from math import sqrt
3

4 # aplicar sqrt a 0^2 , 1^2 , ... , 9^2 em paralelo


5 res = Parallel ( n_jobs =4) (
6 delayed ( sqrt ) ( i **2)
7 for i in range (10)
8 )

Receita de bolo

No exemplo acima, o parâmetro n_jobs define quantos trabalhadores serão usados (tipica-
mente o número de CPUs lógicas da máquina). A função delayed apenas empacota a chamada
para que ela possa ser enviada a um worker, enquanto Parallel recolhe todas as tarefas e coor-
dena sua execução.
Uma forma intuitiva de entender esse mecanismo é pensar em uma cozinha: se temos apenas
um cozinheiro (um for sequencial), cada prato é preparado do início ao fim antes do próximo
11.2. PARALELIZAÇÃO COM [Link] 149
começar. Já com vários cozinheiros (workers), cada um recebe um prato e trabalha nele indepen-
dentemente, de modo que vários ficam prontos ao mesmo tempo. Essa estratégia funciona muito
bem, mas há alguns cuidados: se uma tarefa demora muito enquanto outras são rápidas, pode
haver desequilíbrio entre os workers; por outro lado, se existem milhares de tarefas minúsculas, o
custo de despachá-las pode ser maior que o ganho da paralelização. Para reduzir esse problema,
o joblib agrupa chamadas em lotes (batching), enviando várias de uma vez só.
Outro detalhe importante está no backend usado. Em Python, o Global Interpreter Lock (GIL)
impede que várias threads executem código Python puro ao mesmo tempo. Por isso, o backend
padrão (loky) cria processos separados, que contornam o GIL e escalam bem em cálculos pe-
sados. Já o backend threading mantém as tarefas no mesmo processo, sendo útil em funções
que passam a maior parte do tempo esperando I/O ou que já liberam o GIL (como operações
NumPy). Existe ainda o multiprocessing, mas o loky tende a ser mais robusto.
1 # Uso de threads porque a funcao processa_io
2 # passa a maior parte do tempo esperando rede .
3 res = Parallel ( n_jobs =8 , backend = " threading " ) (
4 delayed ( processa_io ) ( u ) for u in urls
5 )

Exemplo com I/O

Em resumo: use loky (padrão) para tarefas CPU-bound, threading para tarefas I/O-bound, e
sempre ajuste o número de jobs de acordo com o hardware disponível. Paralelizar acelera muito,
mas nem sempre compensa: quando as tarefas são pequenas demais, o overhead pode superar o
benefício.
Um exemplo clássico de tarefa CPU-bound é calcular números primos ou executar operações
pesadas de álgebra linear. Nesses casos, vale usar o backend padrão:
1 from joblib import Parallel , delayed
2 import math
3

4 def eh_primo ( n ) :
5 for i in range (2 , int ( math . sqrt ( n ) ) +1) :
6 if n % i == 0:
7 return False
8 return True
9

10 nums = range (10**6 , 10**6+1000)


11 res = Parallel ( n_jobs =4) ( delayed ( eh_primo ) ( n ) for n in nums )

Exemplo CPU-bound

Aqui, cada worker testa um conjunto de números independentemente. Quanto mais núcleos
disponíveis, mais rápido o processamento.
Já um exemplo I/O-bound seria baixar várias páginas da web. Cada tarefa fica a maior parte
do tempo esperando a rede, e usar processos separados não traz vantagem; nesse caso o backend
threading é mais leve:
150 CAPÍTULO 11. ESTRATÉGIAS PARA ACELERAR CÓDIGOS EM PYTHON

1 import requests
2 urls = [ " https :// httpbin . org / delay /1 " ] * 20
3

4 def baixa ( url ) :


5 return requests . get ( url ) . status_code
6

7 res = Parallel ( n_jobs =8 , backend = " threading " ) (


8 delayed ( baixa ) ( u ) for u in urls
9 )

Exemplo I/O-bound

Se cada requisição demora cerca de 1 segundo, com 8 threads as 20 requisições terminam em


poucos segundos, em vez de mais de 20.
Por fim, um caso em que a paralelização atrapalha é quando as tarefas são rápidas demais,
por exemplo calcular o quadrado de números pequenos:
1 def quadrado ( n ) :
2 return n * n
3

4 nums = range (1000)


5 res = Parallel ( n_jobs =4) ( delayed ( quadrado ) ( n ) for n in nums )

Exemplo de overhead

Aqui o custo de organizar as tarefas, mandar para os workers e reunir os resultados é maior
do que simplesmente rodar um for sequencial. Nesse cenário, a paralelização pode ser mais
lenta.

11.3 Compilação Just-In-Time com Numba


Numba é um compilador JIT (Just-In-Time) para Python focado em acelerar código numérico.
Ele “traduz” funções Python (que operam sobre tipos e arrays compatíveis) para código nativo
via LLVM, reduzindo drasticamente o overhead dos laços em Python puro. A ideia prática é
simples: decorar funções críticas com @njit (ou @jit(nopython=True)), evitar objetos Python
dentro dessas funções e, quando fizer sentido, ativar paralelização com parallel=True e prange.
O primeiro cuidado ao medir é lembrar do custo de compilação: na primeira chamada de
cada assinatura de tipos, Numba compila a função (demora mais). Depois disso, as chamadas
seguintes usam o código nativo já gerado.
O exemplo abaixo acelera uma multiplicação de matrizes ingênua (três laços) sem recor-
rer ao NumPy @. Primeiro mostramos a versão njit sequencial; em seguida, a variação paralela
(parallel=True + prange). Usamos perf_counter para mostrar o tempo da primeira chamada
(com compilação) e das chamadas seguintes (sem compilação).
1 import numpy as np
2 import time
3 from numba import njit , prange
11.3. COMPILAÇÃO JUST-IN-TIME COM NUMBA 151
4

5 # Versao Python pura ( referencia )


6 def matmul_naive (A , B ) :
7 n , m = A . shape
8 m2 , p = B . shape
9 assert m == m2
10 C = np . zeros (( n , p ) )
11 for i in range ( n ) :
12 for j in range ( p ) :
13 s = 0.0
14 for k in range ( m ) :
15 s += A [i , k ] * B [k , j ]
16 C [i , j ] = s
17 return C
18

19 # Versao Numba : nopython mode ( sem objetos Python dentro )


20 @njit
21 def matmul_numba (A , B ) :
22 n , m = A . shape
23 m2 , p = B . shape
24 C = np . zeros (( n , p ) )
25 for i in range ( n ) :
26 for j in range ( p ) :
27 s = 0.0
28 for k in range ( m ) :
29 s += A [i , k ] * B [k , j ]
30 C [i , j ] = s
31 return C
32

33 # Versao Numba paralela : requer parallel = True e uso de prange


34 @njit ( parallel = True )
35 def m a t m u l _ n u m b a _ p a r a l l e l (A , B ) :
36 n , m = A . shape
37 m2 , p = B . shape
38 C = np . zeros (( n , p ) )
39 for i in prange ( n ) : # <-- prange permite paralelizar esse loop
externo
40 for j in range ( p ) :
41 s = 0.0
42 for k in range ( m ) :
43 s += A [i , k ] * B [k , j ]
44 C [i , j ] = s
45 return C
46

47 # Benchmark simples : separa " primeira chamada " e " repetidas "
48 def bench ( func , * args , repeat =3 , label = " " ) :
49 # primeira chamada ( inclui compilacao JIT quando aplicavel )
50 t0 = time . perf_counter ()
152 CAPÍTULO 11. ESTRATÉGIAS PARA ACELERAR CÓDIGOS EM PYTHON
51 out = func (* args )
52 t1 = time . perf_counter ()
53 print ( f " { label } [1 a chamada ]: { t1 - t0 :.3 f } s " )
54

55 # chamadas seguintes ( ja compilado )


56 best = float ( " inf " )
57 for _ in range ( repeat ) :
58 t0 = time . perf_counter ()
59 func (* args )
60 t1 = time . perf_counter ()
61 best = min ( best , t1 - t0 )
62 print ( f " { label } [ melhor chamada subsequente ]: { best :.3 f } s " )
63 return out
64

65 if __name__ == " __main__ " :


66 n = 600
67 A = np . random . rand (n , n )
68 B = np . random . rand (n , n )
69

70 # Referencia Python puro ( lento )


71 bench ( matmul_naive , A , B , label = " naive ( Python ) " )
72

73 # Numba sequencial
74 bench ( matmul_numba , A , B , label = " Numba ( njit ) " )
75

76 # Numba paralelo
77 bench ( matmul_numba_parallel , A , B , label = " Numba ( parallel ) " )

Acelerando loops com Numba (@njit)

Na prática, você deverá observar algo assim: a versão Python pura leva segundos; a versão
@njit cai para frações (ou poucos segundos em matrizes grandes) após a compilação; a ver-
são paralela tende a ganhar mais em máquinas com vários núcleos, desde que o tamanho do
problema justifique o overhead de criar e sincronizar threads. Nem todo laço se beneficia de
parallel=True; se o problema é pequeno, o custo extra pode superar o ganho.
Outro modo útil de Numba é compilar funções elementwise com @vectorize, criando uma
ufunc ao estilo NumPy; isso permite aplicar a função diretamente sobre arrays, com broadcast,
sem escrever laços em Python. O exemplo a seguir define uma ufunc para uma transformação
escalar simples e a aplica a um array grande.
1 import numpy as np
2 from numba import vectorize , float64
3

4 @vectorize ([ float64 ( float64 ) ])


5 def transform ( x ) :
6 # alguma transformacao escalar ( exemplo )
7 return ( x * x + 0.5) / ( x + 1.0)
8
11.4. PARALELISMO SIMPLES EM BASH 153
9 x = np . random . rand (1 _000_000 )
10 y = transform ( x ) # aplica como ufunc , sem lacos explicitos em Python

UFunc com @vectorize (estilo NumPy)

Algumas recomendações práticas ao usar Numba: (i) mantenha dentro das funções JIT apenas
operações suportadas (aritmética, indexação NumPy, algumas funções math/numpy); (ii) evite
objetos Python (listas que crescem, dicionários, set) e chamadas que exijam o interpretador; (iii)
prefira arrays com dtype numéricos (float64, int64, etc.) e formatos contíguos; (iv) tome cuidado
com alocação excessiva dentro do laço; (v) ative parallel=True apenas após confirmar que o
gargalo é CPU-bound e que o tamanho do problema compensa a paralelização; (vi) lembre-se
do “aquecimento”: meça separando a primeira chamada (com compilação) das seguintes; (vii)
quando a função estabilizar, @njit(cache=True) pode salvar o binário no disco e reduzir o tempo
de compilação em execuções futuras (útil em scripts).
Por fim, se você já tem uma versão vetorizada eficiente em NumPy (que usa BLAS), muitas
vezes ela será tão rápida quanto (ou mais rápida que) reimplementar em Numba, a menos que
o seu padrão de acesso/cálculo seja muito específico. O ponto forte do Numba é acelerar laços
e lógicas numéricas que seriam lentas em Python puro, mantendo o código próximo ao original,
sem partir direto para C/C++.

11.4 Paralelismo simples em Bash


O Bash permite escrever pequenos scripts para automatizar tarefas repetitivas. Um dos recursos
mais uteis é a possibilidade de rodar varios comandos em paralelo, sem esperar um terminar
para comecar o proximo. Para isso usamos o operador &.
No exemplo abaixo, usamos o comando sleep (que apenas dorme por alguns segundos) para
simular tarefas demoradas. Cada chamada ao sleep é enviada ao plano de fundo com &, de
modo que o laco continua imediatamente para a proxima iteracao.
1 # !/ bin / bash
2

3 for i in $ ( seq 1 5)
4 do
5 echo " Iniciando tarefa $i "
6 sleep 3 &
7 done
8

9 echo " Todas as tarefas foram lancadas ! "

Rodando sleeps em paralelo

Nesse script, as cinco tarefas comecam quase ao mesmo tempo e, apos cerca de tres segundos,
todas terminam juntas. Se tirassemos o &, o script levaria cerca de 15 segundos, pois cada sleep
3 seria executado em sequencia.
Para visualizar essa diferenca, vejamos primeiro a execucao sequencial:
1 # !/ bin / bash
154 CAPÍTULO 11. ESTRATÉGIAS PARA ACELERAR CÓDIGOS EM PYTHON
2

3 for i in $ ( seq 1 5)
4 do
5 echo " Rodando tarefa $i "
6 sleep 3
7 done
8

9 echo " Todas as tarefas terminaram ( sequencial ) "

Execucao sequencial

E agora a versao em paralelo, onde o tempo total cai para cerca de 3 segundos:
1 # !/ bin / bash
2

3 for i in $ ( seq 1 5)
4 do
5 echo " Rodando tarefa $i "
6 sleep 3 &
7 done
8

9 wait
10 echo " Todas as tarefas terminaram ( paralelo ) "

Execucao em paralelo

Para garantir que o script so finalize depois que todas as tarefas concluirem, podemos usar
explicitamente o comando wait:
1 # !/ bin / bash
2

3 for i in $ ( seq 1 5)
4 do
5 sleep 3 &
6 done
7

8 wait
9 echo " Todas as tarefas terminaram ! "

Sincronizando com wait

Tambem é possivel limitar quantas tarefas rodam em paralelo. Uma tecnica simples é contro-
lar com um contador e usar wait -n para esperar pelo menos um job terminar antes de lancar o
proximo:
1 # !/ bin / bash
2

3 N =2 # no maximo 2 processos ao mesmo tempo


4

5 for i in $ ( seq 1 5)
6 do
11.4. PARALELISMO SIMPLES EM BASH 155
7 sleep 3 &
8 if (( $ ( jobs -r | wc -l ) >= N ) ) ; then
9 wait -n
10 fi
11 done
12

13 wait
14 echo " Fim das tarefas "

Limitando jobs simultaneos

Esses exemplos usam apenas comandos nativos (sleep, echo), mas a ideia é exatamente a
mesma se quisermos chamar um script Python ou outro programa no lugar.
156 CAPÍTULO 11. ESTRATÉGIAS PARA ACELERAR CÓDIGOS EM PYTHON
Referências Bibliográficas

Efron, B. (1979). Bootstrap Methods: Another Look at the Jackknife. The Annals of Statistics, 7(1):1
– 26. 133

157

Você também pode gostar