Escolar Documentos
Profissional Documentos
Cultura Documentos
Versão 1.0.9
Pense Bayes
Estatísticas bayesianas simples
Versão 1.0.9
Allen B. Downey
Imprensa de
Chá Verde 9
Washburn Ave
Needham MA 02492
A permissão é concedida para copiar, distribuir e/ou modificar este
documento os termos da Atribuição Creative Commons-NonCommercial
3.0 Licença não portada, que pode ser aplicadaem licenças
http://creativecommons.org//por nc/3.0/. http://creativecommons.org/
Prefácio
Eu acho que esta apresentação é mais fácil de entender, pelo menos para
pessoas com habilidades em programação. Também é mais geral, pois
quando tomamos decisões de modelagem, podemos escolher o modelo
mais adequado sem nos preocuparmos muito se o modelo se presta à
análise convencional.
1.5 Pré-requisitos
Existem vários módulos excelentes para fazer estatísticas bayesianas em
Python, incluindo pymc e OpenBUGS. Eu escolhi não os usar para este
livro isto porque você precisa de uma boa quantidade de conhecimento de
fundo para começar com esses módulos, e eu quero manter os pré-
requisitos mínimos. Se você conhece Python e um pouco sobre
probabilidade, você está pronto para começar este livro.
Lista de contribuintes
Se você tiver uma sugestão ou correção, envie um e-mail para
downey@allendowney.com. Se eu fizer uma mudança com base no seu
feedback, eu vou adicioná-lo à lista de contribuintes (a menos que você
peça para ser omitido).
Se você incluir pelo menos parte da frase em que o erro aparece, isso torna
mais fácil para mim pesquisar. Números de páginas e seções também são
bons, mas não tão fáceis de trabalhar. Thanks!
• Escrevi partes deste livro durante as noites de projeto com o Boston Python
User Group, então gostaria de agradecê-los por sua empresa e pizza.
x Capítulo 0.
Prefácio
• Olivier Yiptong enviou várias sugestões úteis.
• Markus Dobler apontou que tirar biscoitos de uma tigela com substituição
é um cenário irrealista.
Outras pessoas que detectaram erros de digitação e pequenos erros incluem Tom
Pollard, Paul A. Giannaros, Jonathan Edwards, George Purkins, Robert Marcus,
Ram Limbu, James Lawry, Ben Kahle, Jeffrey Law e Alvaro Sanchez.
Conteúdo
Prefác V
io
0.1 A minha teoria, que é a minha. . . . . . . . . . . . . . . . . . . . . . . . . . V
.................................................
0.2 Modelagem e aproximação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . V
..............................................
0.3 Trabalhando com o V
código. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii
........................
0.4 Estilo de V
código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii
.......................................... i
0.5 Pré- I
requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x
...............................................
1 Teorema de Bayes 1
1.1 Probabilidade condicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
...................................................
1.2 Probabilidade conjunta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
......................................................
1.3 O problema dos biscoitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
..................................................
1.4 Teorema de Bayes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
............................................................
1.5 A interpretação 5
diacrônica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
...............
1.6 O problema do M&M. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
.......................................................
1.7 O problema de Monty 8
Hall. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
....
1.8 Discussão 1
............................................................... 0
................................
2 Estatísticas Computacionais 1
1
2.1 Distribuições 1
............................................................... 1
...............................
2.2 O problema dos biscoitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
.................................................. 2
xii Conteúd
o
2.3 A estrutura bayesiana ......................................................................13
2.7 Discussão............................................................................................18
2.8 Exercícios............................................................................................19
3 Estimativa 21
3.8 Discussão............................................................................................30
3.9 Exercícios............................................................................................30
4 Mais Estimativa 33
4.4 Otimização.........................................................................................37
4.6 Discussão............................................................................................40
4.7 Exercícios............................................................................................41
Conteúd xiii
o
5 Probabilidades e Adição 43
5.1 Probabilidades...................................................................................43
5.2 A forma de probabilidades do teorema de Bayes .......................44
5.3 Sangue de Oliver...............................................................................45
5.4 Complementos...................................................................................46
5.5 Maxima...............................................................................................49
5.6 Misturas..............................................................................................51
5.7 Discussão............................................................................................54
6 Análise de Decisão 55
6.1 O problema preço é certo ..................................................................55
6.2 Os.....................................................................................56 anteriores
6.3 A densidade de probabilidades funciona.....................................57
6.4 Representando PDFs........................................................................57
6.5 Modelando os concorrentes............................................................60
6.6 Probabilidade.....................................................................................62
6.7 Atualização........................................................................................63
6.8 Lance ideal.........................................................................................64
6.9 Discussão............................................................................................67
7 Previsão 69
7.1 O problema de Boston Bruins.......................................................69
7.2 Processos de Poisson........................................................................71
7.3 Os posteriores....................................................................................71
7.4 A distribuição das metas.................................................................72
7.5 A probabilidade de ganhar.............................................................74
7.6 Morte súbita.......................................................................................75
7.7 Discussão............................................................................................76
7.8 Exercícios............................................................................................78
xiv Conteúd
8 Viés observador o 81
8.1 O problema da Linha Vermelha...................................................81
8.2 O modelo............................................................................................82
8.3 Tempos de espera..............................................................................84
8.4 Prever tempos de espera................................................................86
8.5 Estimando a taxa de chegada .........................................................89
8.6 Incorporando incerteza....................................................................91
8.7 Análise de decisão.............................................................................92
8.8 Discussão............................................................................................95
8.9 Exercícios............................................................................................95
9 Duas Dimensões 97
9.1 Paintball..............................................................................................97
9.2 A suíte.................................................................................................98
9.3 Trigonometria....................................................................................99
9.4 Probabilidade...................................................................................101
9.5 Distribuições conjuntas..................................................................102
9.6 Distribuições condicionais.............................................................103
9.7 Intervalos críveis.............................................................................104
9.8 Discussão..........................................................................................106
9.9 Exercícios..........................................................................................107
10.8 ABC...................................................................................................118
10.11 Discussão..........................................................................................123
10.12 Exercícios..........................................................................................124
1 Provas 131
2
12.1 Interpretando pontuações do SAT . . . . . . . . . . . . . . . . . . . . . . .
.................................................... ..... 13
1
12.2 A escala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.................................................... 13
2
xvi Conteúd
o
12.3 O anterior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
...................................................... 13
2
12.4 Posterior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
................................................... 13
4
12.5 Um modelo melhor. .
............................................................. 13
.............................. 6
12.6 Calibração .
............................................................. 13
................................... 8
12.7 Distribuição posterior da eficácia . . . . . . . . . . . . . . . . . . . . . . . .
........................................... 13
9
12.8 Distribuição preditiva .
............................................................. 14
................. 1
12.9 Discussão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.................. 14
2
Conteúd xvii
o
13 Simulação 145
13.1 O problema do tumor renal...........................................................145
13.2 Um modelo simples ......................................................................146
13.3 Um modelo mais geral...................................................................148
13.4 Implementação................................................................................150
13.5 Caching a distribuição conjunta ...................................................151
13.6 Distribuições condicionais...............................................................152
13.7 Correlação Serial..............................................................................154
13.8 Discussão..........................................................................................157
Bayes
Uma vez que não dissemos nada sobre o que A e B significam, eles são
intermutáveis. Intermutá-los rende
p( B) p ( A | B ) = p ( A ) p ( B | A )
p(A) p(B|A)
p(A|B) = p(B)
E esse é o teorema de Bayes! Pode não parecer muito, mas acaba por ser
surpreendentemente poderoso.
p(B1) p(V|B1)
| V) =
p(B p(V)
1
O termo à esquerda é o que queremos: a probabilidade da Tigela 1, dado
que escolhemos um biscoito de baunilha. Os termos à direita são:
(1/2) (3/4)
p(B
1 V) =
5/8
|
1.5. The diachronic interpretation 5
que reduz para 3/5. Então o biscoito de baunilha é uma evidência a favor
da tese que escolhemos a Tigela 1, porque biscoitos de baunilha são mais
propensos a vir da Tigela 1.
p(H ) p (D | H )
p(H|D) = p(D)
Nesta interpretação, cada termo tem um nome:
Na maioria das vezes, simplificamos as coisas especificando um conjunto de hipóteses que são
Eu uso a palavra suíte para um conjunto de hipóteses que tem essas propriedades.
p ( D ) = p (B 1 ) p ( D | B 1 ) + p (B 2 ) p ( D | B 2 )
Suponha que um amigo meu tenha dois sacos de M&M's, e ele me diga
que um é de 1994 e outro de 1996. Ele não me diz qual é qual, mas ele me
dá um M&M de cada saco. Um é amarelo e o outro é verde. Qual é a
probabilidade de que o amarelo veio do saco de 1994?
Agora construímos uma tabela com uma linha para cada hipótese e uma
coluna para cada termo no teorema de Bayes:
Pa Probabili Posterio
nte dade p(H) p(D| r p(H|
rio p(D| H) H) D)
r(
H))
U 1/ (20) (20) 200 20/27
m 2 (14) (10) 70 7/27
B 1/
2
A primeira coluna tem os antecedentes. Com base na afirmação do
problema, é razoável escolher p(A) = p(B) = 1/2.
Para começar, devemos fazer uma declaração cuidadosa dos dados. Neste caso D
consiste em duas partes: Monty escolhe a porta B e não há carro lá.
Em seguida, definimos três hipóteses: A, B,e C representam a hipótese de
que o carro está atrás da porta A, porta B ou porta C. Novamente, vamos
aplicar o método da tabela: method:
Pa Probabili Posterio
nte dade p(H) p(D| r p(H|
rio p(D| H) H) D)
r(
H))
U 1/ 1 1/6 1
m 3 / /
2 3
B 1/ 0 0 0
3
C 1/ 1 1/3 2
3 /
3
Preencher os antecedentes é fácil porque nos dizem que os prêmios são
organizados aleatoriamente, o que sugere que o carro é igualmente
provável de estar atrás de qualquer porta.
Descobrir as probabilidades requer algum pensamento, mas com cuidado
razoável podemos estar confiantes de que temos razão:
• Se o carro está realmente atrás de A, Monty poderia abrir com segurança portas B ou
C. Então a probabilidade de que ele escolha B é 1/2. E como o carro
está um atrás deA, a probabilidade de que o carro não esteja atrás de
B é de 1.
1.8 Discussão
Para Muitos Problemas Envolvendo Condicional Probabilidade Bayes
Teorema pró- vides uma divisão-e-conquistar | Estratégia. Se p(Um B) é
difícil de calcular, ou difícil de calcular Medida Experimentalmente
Verificar Se ele Pode Ser Fácil Para Calcular os outros termos no teorema
de Bayes, p(B|A)P(A) E p(B).
Computacionais
2.1 Distribuições
Nas estatísticas, uma distribuição é um conjunto de valores e suas proba-
bilidades correspondentes.
Por exemplo, se você rolar um dado de seis lados, o conjunto de valores
possíveis são os números 1 a 6, e a probabilidade associada a cada valor é
de 1/6.
Como outro exemplo, você pode estar interessado em quantas vezes cada
palavra aparece no uso comum do inglês. Você poderia construir uma
distribuição que em- cludes cada palavra e quantas vezes ela aparece.
Para representar uma distribuição em Python, você pode usar um
dicionário que mapeia de cada valor para sua probabilidade. Eu escrevi
uma classe chamada PMF que usa um dicionário Pythonexatamente dessa
maneira, e fornece uma série de métodos úteis. Chamei a classe PMF em
referência a uma funçãode massa de probabilidade, que é uma forma de
representar matematicamente uma distribuição.
PMF é definido em um módulo Python que escrevi para acompanhar este
book, thinkbayes.py. Você pode baixá-lo a partir de http://thinkbayes.com/
thinkbayes.py. Para obter mais informações, consulte a Seção 0.3.
Aqui está outro exemplo que conta o número de vezes que cada palavra
aparece em uma seqüência:
PMF = PMF()
por palavra em word_list: PMF. Incr
(palavra, 1)
O Incr aumenta a "probabilidade" associada a cada palavra por 1. Se uma
palavra ainda não está no PMF, ela é adicionada.
Mult faz o que você esperaria. Obtém a probabilidade para a dada hy-
pothesis e multiplica-se pela probabilidade dada.
Cookie(hypos)
O Cookie fornece um método de atualização que toma os dados como
parâmetro e atualiza as probabilidades:
def Update (self, data):
para hipo em si mesmo. Valores():
como = eu. Probabilidade (dados, hipo) auto.
Mult (hipo, como)
Auto. Normalizar()
A atualização percorre cada hipótese no conjunto e o multipencontra sua
proba-bility bility pela probabilidade dos dados sob a hipótese, que é
calculada pela Probabilidade:
misturas = {
'Bowl 1 :dict (baunilha =0,75, chocolate =0,25),
'
A outra vantagem é que ele fornece uma estrutura para resolver muitos
problemas sim-ilar. Na próxima seção, resolveremos o problema de
Monty Hall com putcionalmente e depois veremos quais partes da
estrutura são as mesmas.
O código nesta seção está disponível from http://thinkbayes.com/cookie2.
py. Para obter mais informações, consulte a Seção 0.3.
Atualização (dados)
E a implementação do Update é exatamente a mesma:
def Update (self, data):
para hipo em si mesmo. Valores():
como = eu. Probabilidade (dados, hipo) auto. Mult
(hipo, como)
Auto. Normalizar()
A única parte que requer algum trabalho é
Likelihood: def Likelihood (self, data, hypo):
se hipo == dados:
retorno 0
elif hypo == A :' '
retorno 0,5
Mais:
retornar 1
16 Capítulo 2. Estatísticas
Computacionais
Finalmente, imprimir os resultados é o mesmo:
para hipo, prob em PMF. Itens():
print hypo,prob
E a resposta é
Um 0.333333333333
B 0.0
C 0.666666666667
Neste exemplo, escrever Probabilidade é um pouco complicado, mas o
quadro-trabalho da atualização bayesiana é simples. O código nesta seção
é útil a partir de http://thinkbayes.com/monty.py. Para obter mais
informações, consulte a Seção 0.3.
def Print(self):
""Imprime as hipóteses e suas probabilidades."
A implementação do Suite está em thinkbayes.py. Para usar o Suite,você
deve escrever uma classe que herda dela e fornece Probabilidade. Por
exemplo, aqui está a solução para o problema de Monty Hall reescrito
para usar suite:
do thinkbayes importação Suite class
Monty(Suite):
retorno 0,5
Mais:
retornar 1
E aqui está o código que usa esta classe:
suíte = Suíte
Monty( ABC
' ').
Atualizar( B suíte.
' '
Impressão()
Você pode baixar este exemplo de http://thinkbayes.com/monty2.py. Para
obter mais informações, consulte a Seção 0.3.
Suite. Impressão()
E aqui está o resultado:
Um 0.740740740741
B 0,259259259259
A probabilidade posterior de A é de aproximadamente 20/27, que é o que
temos antes.
O código nesta seção está disponível a partir de
http://thinkbayes.com/m_and_ m.py. Para obter mais informações,
consulte a Seção 0.3.
2.7 Discussão
Este capítulo apresenta a classe Suite, que encapsula a estrutura bayesiana
atualizada.
Suite é um tipo abstrato,o que significa que ele define a interface que um Suite
deveria ter, mas não fornece uma implementação completa. A interface
Suite inclui Atualização e Probabilidade,mas a classe Suite só fornece uma
implementação de Atualização,não Probabilidade.
Um tipo concreto é uma classe que estende uma classe parental abstrata e
fornece uma implementação dos métodos ausentes. Por exemplo, Monty
extends Suite, por issoherda atualização e fornece Probabilidade.
Se você estiver familiarizado com padrões de design, você pode
reconhecer isso como um exemplo do padrão do método de modelo. Você
pode ler sobre este padrão em
http://en.wikipedia.org/wiki/Template_method_pattern.
2.8. Exercises 19
2.8 Exercícios
Exercício 2.1. Na Seção 2.3 eu disse que a solução para o problema dos cookies é
o caso em que desenhamos vários cookies com substituição.
Modifique a solução neste capítulo para lidar com a seleção sem substituição.
Dica: adicione variáveis de instância ao Cookie para representar o estado
hipotético das tigelas e modifique a Probabilidade de acordo. Você pode querer
definir um objeto Bowl.
20 Capítulo 2. Estatísticas
Computacionais
Estimativa do
Capítulo 3
0.006
0.005
Probabilidade
0.004
0.003
0.002
0.001
0.000
0 200 400 600 800 1000
Número de trens
O valor mais provável, se você tivesse que adivinhar, é 60. Isso pode não
parecer um palpite muito bom; afinal, quais são as chances de você ver o
train com o número mais alto? No entanto, se você quer maxi-mize a
chance de obter a resposta exatamente certo, você deve adivinhar 60.
Mas talvez esse não seja o objetivo certo. Uma alternativa é calcular a
média da distribuição posterior:
def Mean(suíte): total
=0
para hypo, prob na suíte. Itens(): total
+= hipo * prob
retorno total
imprimir Mean(suíte)
Ou você pode usar o método muito semelhante fornecido
pela PMF: suíte de impressão. Média()
A média do posterior é 333, então isso pode ser um bom palpite se você
quiser minimizar o erro. Se você jogou este jogo de adivinhação
repetidamente, usando a média da parte posterior como sua estimativa
minimizaria o erro médio quadrado no longo prazo (ver
http://en.wikipedia.org/ wiki/Minimum_mean_square_error).
0.018
Uniforme
0.016
lei do poder
0.014
Probabilidade
0.012
0.010
0.008
0.006
0.004
0.002
0.000
0 200 400 600 800 1000
Número de trens
Figura 3.2: Distribuição posterior com base em uma lei de poder anterior,
em comparação com um uniforme anterior.
Def
__init__(self, hypos, alfa=1.0):
PMF.__init__(self)
para hipo em hipos:
Auto. Conjunto (hypo, hypo**(-alfa)) self.
Normalizar()
E aqui está o código que constrói o anterior:
hipos = intervalo (1, 1001)
suíte = Trem (hipos)
Mais uma vez, o limite superior é arbitrário, mas com uma lei de poder
anterior, o poste-rior é menos sensível a essa escolha.
Supe Posteri
rior or
Limit Média
e
500 131
1000 133
2000 134
3.8 Discussão
Entre os bayesianos, há duas abordagens para escolher distribuições
anteriores. Alguns recomendam escolher o anterior que melhor representa
o fundo de fundo sobre o problema; nesse caso, diz-se que o anterior é
informativo. O problema com o uso de um antecedente informativo é que
as pessoas podem usar informações de fundo dif-ferent (ou interpretá-la
de forma diferente). Então, os antecedentes informativos muitas vezes
parecem subjetivos.
Além disso, para a maioria dos problemas práticos, é provável que você
esteja em um dos dois regimes: ou você tem um monte de dados ou não
muito. Se você tem muitos dados, a escolha do anterior não importa
muito; os antecedentes informativos e não informativos produzem quase
os mesmos resultados. Veremos um exemplo como este no próximo
capítulo.
Mas se, como no problema da locomotiva, você não tem muitos dados,
usar informações de fundo rele-vant (como a distribuição da lei de
energia) faz uma grande diferença.
E se, como no problema do tanque alemão, você tem que tomar decisões
de vida ou morte com base em seus resultados, você provavelmente deve
usar toda a infor-mation à sua disposição, em vez de manter a ilusão de
objetividade fingindo saber menos do que você faz.
3.9 Exercícios
Exercício 3.1. Para escrever uma função de probabilidade para o problema da
locomotiva, tivemos que responder a esta pergunta: "Se a ferrovia tem
locomotivas N, qual é a probabilidade de vermos o número 60?"
3.9. Exercises 31
Mas suponha que existam muitas empresas com diferentes números de trens. E
suponha que você é igualmente provável de ver qualquer trem operado por
qualquer empresa. Nesse caso, a função de probabilidade é diferente porque é mais
provável que você veja um trem operado por uma grande empresa.
Mais Estimativas
0.14
Uniforme
0.12
0.10
Probabilidade
0.08
0.06
0.04
0.02
0.00
0 20 40 60 80 100
X
retorno x/100.0
Mais:
retorno 1 - x/100.0
Aqui está o código que faz a suíte e atualiza-a:
suíte = Euro (xrange(0, 101))
dataset = H * 140 + T * 110
' ' ' '
0.025
Uniforme
Triângulo
0.020
Probabilidade
0.015
0.010
0.005
0.000
0 20 40 60 80 100
X
0.14
Uniforme
0.12 Triângulo
0.10
Probabilidade
0.08
0.06
0.04
0.02
0.00
0 20 40 60 80 100
X
4.4 Otimização
O código que mostrei até agora é fácil de ler, mas não é muito eficiente.
Em geral, eu gosto de desenvolver código que é comprovadamente
correto, em seguida, verificar se é rápido o suficiente para os meus
propósitos. Se assim for, não há necessidade de otimizar. Para este
exemplo, se nos preocupamos com o tempo de execução, há várias
maneiras de acelerar.
O Suite fornece um método chamado UpdateSet que faz exatamente isso. Aqui está:
38 Capítulo 4. Mais
Estimativas
def UpdateSet (self, dataset): para
dados no conjunto de dados:
para hipo em si mesmo. Valores():
como = eu. Probabilidade (dados, hipo)
auto. Mult (hipo, como)
retorno auto. Normalizar()
E é assim que podemos invocá-lo:
conjunto de dados = H * cabeças + T * suíte de caudas. Conjunto
' ' ' '
Naversão de origem al, os dados são uma string que codifica cabeças ou coroas:
def Probabilidade (self, data, hypo): x
= hypo / 100.0
se os dados ==
' H : retorno x
'
Mais:
retornar 1-x
Como alternativa, poderíamos codificar o conjunto de dados como uma
tuplo de dois inteiros: o número de cara e coroa. Nesse caso, a
probabilidade é assim:
def Probabilidade (self, data, hypo): x
= hypo / 100.0
cara, coroa = dados
como = x**cabeças * (1-x)**caudas
retornar como
E então podemos chamar Atualização assim:
cara, coroa = 140, 110 suíte.
Atualização((cabeças, coroas))
Uma vez que substituímos a multiplicação repetida por exponenciação,
esta versão leva o mesmo tempo para qualquer número de rodadas.
Acontece que se você fizer uma atualização bayesiana com uma função de
probabilidade binomial, que é o que fizemos na seção anterior, a
distribuição beta é um prior conjugado. Isso significa que se a distribuição
prévia para x isuma distribuição beta, o posterior também é uma
distribuição beta. Mas espere, fica ainda melhor.
A forma da distribuição beta depende de dois parâmetros, escritoα e β, ou
alfa e beta. Se o anterior for uma distribuição beta com parâmetros alfa e
beta, e vemos dadoscom cabeças h e caudas t, o posterior é uma
distribuição beta com parâmetros alfa+h e beta+t . Em outras palavras,
podemos fazer uma atualização com duas adições.
Euro:
40 Capítulo 4. Mais
Estimativas
beta = thinkbayes. Beta()
beta. Atualização((140, 110))
beta de impressão. Média()
Beta fornece Mean, que calcula uma função simples de alfa e beta: def
Mean(self):
flutuador de retorno (self.alfa) / (self.alfa + self.beta)
Para o problema do Euro, a média posterior é de 56%, que é o mesmo
resultado que opassamos usando pmfs.
4.6 Discussão
Neste capítulo resolvemos o mesmo problema com dois antecedentes
diferentes e descobrimos que com um grande conjunto de dados, os
antecedentes ficam atolados. Se duas pessoas começam com crenças
anteriores diferentes, elas geralmente descobrem, à medida que vêem
mais dados, que suas distribuições posteriores convergem. Em algum
momento, a diferença entre suas distribuições é pequena o suficiente para
que não tenha efeito prático.
Mas nem sempre é assim. Primeiro, lembre-se que toda análise bayesiana
é baseada em decisões de modelagem. Se você e eu não escolhermos o
mesmo modelo, podemos interpretar dados differently. Assim, mesmo
com os mesmos dados, calcularíamos diferentes probabilidades, e nossas
crenças posteriores podem não convergir.
4.7 Exercícios
Exercício 4.1. Suponha que, em vez de observar moedas, você meça o resultado
usando um instrumento que nem sempre está correto. Especificamente, suponha
que há uma probabilidade de que uma cara real seja relatada como coroa, ou
caudas reais re-portadas como cabeças.
Escreva uma classe que estima o viés de uma moeda dada uma série de resultados
e o valor de y.
Como a disseminação da distribuição posterior depende de y?
Exercício 4.2. Este exercício é inspirado em uma pergunta postada por um
"redditor" chamado dominosci nas estatísticas do Reddit "subreddit" em http: //
reddit. com/ r/ statistics .
Probabilidades e Adesões
5.1 Probabilidades
Uma maneira de representar uma probabilidade é com um número entre 0
e 1, mas essa não é a única maneira. Se você já apostou em um jogo de
futebol ou em uma corrida de cavalos, provavelmente já encontrou outra
representação de probabilidade, chamada odds.
Você pode ter ouvido expressões como "as chances são de três para um",
mas você pode não saber o que isso significa. As probabilidades a favor
de um evento são a razão da probabilidade que ocorrerá à probabilidade
de que não ocorrerá.
Então, se eu acho que meu time tem 75% de chance de ganhar, eu diria
que as chances a seu favor são de três para um, porque a chance de ganhar
é três vezes a chance de perder.
p(H ) p (D | H )
p(H|D) = p(D)
p( A | D ) p(A ) p( D | A )
p ( B | D ) = p( B) p ( D | B )
o(A | D ) p (D| A)
o ( A) = p(D | B )
46 Capítulo 5. Probabilidades e
Adesões
O termo à esquerda é a razão das probabilidades posteriores e anteriores.
O termo à direita é a razão de probabilidade, também chamado de fator
Bayes. .
Se o valor do fator Bayes for maior que 1, isso significa que os dados eram
mais prováveis abaixo de A do que abaixo de B. E como a razão de
chances também é maior que 1, isso significa que as chances são maiores, à
luz dos dados, do que eram antes.
Se o Bayes factor é menor que 1, isso significa que os dados eram menos prováveis sob
A do que abaixo de B,então as chances a favor de A vão para baixo.
Finalmente, se o fator Bayes é exatamente 1, os dados são igualmente
prováveis qualquer hipótese, de modo que as chances não mudam.
Agora podemos voltar ao problema de sangue do Oliver. Se Oliver é uma
das pessoas que deixaram sangue na cena do crime, então ele contabiliza a
amostra de 'O', então a probabilidade dos dados é apenas a probabilidade
de que um membro aleatório da população tenhasangue ty pe'AB', que é
de 1%.
Se Oliver não deixou sangue na cena do crime, então temos duas amostras
para explicar. for. Se escolhermos duas pessoas aleatórias da população,
qual é a chance de encontrar uma com tipo 'O' e outra com tipo 'AB'? Bem,
há duas maneiras de acontecer: a primeira pessoa que escolhemos pode ter
tipo 'O' e o segundo 'AB', ou o contrário. Assim, a probabilidade total é de
2(0,6)(0,01)= 1,2%.
A partedos dados é um pouco maior se Oliver não for uma das pessoas
que deixaram sangue na cena do crime, então os dados de sangue são
evidências contra a culpa de Oliver.
Este exemplo é um pouco inventado, mas é um exemplo do resultado
contra-intuitivo de que dados consistentes com uma hipótese não são
necessariamente a favor da hipótese.
Se esse resultado é tão contraintuitivo que te incomoda, essa forma de
pensar pode ajudar: os dados consistem em um evento comum, tipo 'O'
sangue, e um evento raro, digite sangue 'AB'. Se Oliver explica o evento
comum, isso deixa o raro evento ainda inexplicado. Se Oliver não
contabilizar o sangue 'O', então temos duas chances de encontrar alguém
na população com sangue 'AB'. E esse factor de dois faz a diferença.
5.4 Complementos
A operação fundamental das estatísticas bayesianas é a Atualização,que
toma uma distribuição prévia e um conjunto de dados, e produz uma
distribuição posterior.
5.4. Addends 47
Então você pode estar curioso para saber a distribuição desta soma. Há
duas maneiras de calcular:
0.14 Amostra
Exata
0.12
Probabilidade
0.10
0.08
0.06
0.04
0.02
0.00
2 4 68 8 10 12 14 16 18
Soma de três d6
5.5 Maxima
Quando você gera um personagem de Dungeons & Dragons, você está
particularmente interessado nos melhores atributos do personagem, então
você pode gostar de saber a distribuição do atributo máximo.
Existem três maneiras de calcular a distribuição de um máximo:
def SampleMax(dists,n):
pmf = MakePmfFromList(RandomMax(dists) para i in xrange(n))
return PMF
50 Capítulo 5. Probabilidades e
Adesões
0.20
Probabilidade
0.15
0.10
0.05
0.00
2 4 68 8 10 12 14 16 18
Soma de três d6
Tudo o que fiz foi substituir "soma" por "max". E o código para
enumeração é quase idêntico, também:
def PmfMax(pmf1, pmf2): res
= thinkbayes. PMF()
para v1, p1 em pmf1. Itens():
para v2, p2 em pmf2. Itens(): res. Incr (max(v1,
v2), p1*p2)
retornar res
Na verdade, você poderia generalizar esta função tomando o adequado
opera-tor como um parâmetro.
O único problema com este algoritmo é que se cada PMF tem valores m, o
tempo de execução é proporcional a m2. E se quisermos o máximo de
seleções k, leva tempo proporcional ao km2.
CDF3(5) = CDF1(5)CDF2(5)
CDF3(z)= CDF1(z)CDF2((zz)
CDFk(z)= CDF(1(zz)k
def Max(self.k):
cdf = self. Cópia()
cdf.ps = [p**k para p em cdf.ps]
retorno cdf
Max pega o número de seleções, k, e retorna umnovo Cdf que repre- envia
a distribuição do máximo de seleções k. O tempo de execução deste
método é proporcional a m, o número deitens no Cdf.
PMF.Max faz a mesma coisa para pmfs. Tem que fazer um pouco mais de
trabalho para converter o PMF em um Cdf, então o tempo de execução é
proporcional ao m log m,mas isso ainda é melhor do que o quadrático.
Finalmente, aqui está um exemplo que calcula a distribuição do melhor
tributo de umpersonagem:
best_attr_cdf = three_exact. Max(6)
best_attr_pmf = best_attr_cdf. MakePMF()
Onde three_exact é definida na seção anterior. Se imprimirmos os re-sults,
vemos que a chance de gerar um personagem com pelo menos um tributo
de 18 é de3%. A Figura 5.2 mostra a distribuição.
5.6 Misturas
Vamos fazer mais um exemplo de Dungeons & Dragons. Suponha que eu
tenha uma caixa de dados com o seguinte inventário:
0.18
Mistura
0.16
0.14
Probabilidade
0.12
0.10
0.08
0.06
0.04
0.02
0.00
0 5 10 15 20 25
Resultado
5 4-sided Da
do
s
4 6 lados Da
do
s
3 8 lados Da
do
s
2 12 lados Da
do
s
1 20 lados M
orr
er
Eu escolho um dado da caixa e rolo-lo. Qual é a distribuição do out-come?
Se você sabe que morrer é, a resposta é fácil. Um dado com n lados rende
uma distribuição uniforme de 1 a n,incluindo ambos.
Primeiro criamos um PMF que mapeia de cada dado para a probabilidade de ser
selecionado:
pmf_dice = thinkbayes. pmf_dice. Conjunto
(Die(4), 5)
pmf_dice. Conjunto (Die(6), 4)
pmf_dice. Conjunto (Die(8), 3)
pmf_dice. Conjunto (Die(12), 2)
pmf_dice. Set(Die(20), 1) pmf_dice.
Normalizar()
Em seguida, precisamos de uma versão mais geral do algoritmo de mistura:
mix = thinkbayes. PMF()
para morrer, peso em pmf_dice. Itens():
para resultado, prob in die. Itens():
Mistura. Incr (resultado, peso*prob)
Agora cada dado tem um peso associado a ele (o que faz dele um dado
ponderado, suponho). Quando adicionamos cada resultado à mistura, sua
probabilidade é multiplicada por peso.
Análise de
Decisão
0.05
vitrine 1
vitrine 2
0.04
0.03
Pdf
0.02
0.01
0.00
0 10000 20000 30000 40000 50000 60000 70000 80000
preço ($)
6.2 O anterior
Para escolher uma distribuição prévia dos preços, podemos aproveitar os
dados dos episódios anteriores. Felizmente, os fãs do show mantêm
registros detalhados. records. Quando me correspondi com o Sr.
Davidson-Pilon sobre seu livro, ele me enviou dados coletados por Steve
Gee em http://tpirsummaries.8m.com. Inclui o preço de cada vitrine das
temporadas de 2011 e 2012 e os lances oferecidos pelos concorrentes.
/2) 2π
Para um determinado valor de xx, esta função calcula uma densidade de
probabilidade. Um den-sity é semelhante a uma massa de probabilidade
no sentido de que uma maior densidade indi- cates que um valor é mais
provável.
Mas uma densidade não é uma probabilidade. Uma densidade pode ser 0
ou qualquer valor de positive; não é limitada, como uma probabilidade,
entre 0 e 1.
Na amostra, não aparecem valores entre 28801 e 28867, mas não há razão
para pensar queesses valores são impossíveis. Com base em nossas
informações de fundo, esperamos que todos os valores nesta faixa sejam
igualmente prováveis. Em outras palavras, esperamos que o PDF seja
bastante suave.
A estimativa de densidade do kernel (KDE) é um algoritmo que pega uma
amostra efind um PDF adequadamente suave que se encaixa nos dados.
Você pode ler detalhes em
http://en.wikipedia.org/wiki/Kernel_density_estimation.
1.0
jogador 1
player 2
0.8
0.6
Cdf
0.4
0.2
0.0
30000 20000 10000 0 10000 20000 30000 40000 50000
diff ($)
Neste modelo, a pergunta que temos que responder é: "Se o preço real é
preço,qual é a probabilidade de que a estimativa do concorrenteseja
adivinhar?"?”
Ou se definirmos
erro = preço - adivinhe
6.5. Modeling the contestants 61
A definição de diff é
diff = preço - lance
Quando diff é negativo, o lance é muito alto. À parte, podemos usar essa
distribuição para calcular a probabilidade de que os concorrentes superem
o lance: o primeiro concorrente supera 25% das vezes; o segundo
concorrente supera 29% das vezes.
mu = 0
sigma = numpy.std(diffs)
auto.pdf_error = thinkbayes. GaussianPdf(mu, sigma)
preços é uma seqüência de preços de vitrine, lances é uma seqüência de lances, e
diffs é uma seqüência de difusos, onde novamente diff = preço - lance.
6.6 Probabilidade
Agora estamos prontos para escrever a função de probabilidade. Como
sempre, defino uma nova classe que amplia os thinkbayes. Suíte:
Class Price (thinkbayes. Suíte):
retornar como
hypo é o preço hipotético da vitrine. dados é o melhor palpite do
concorrente pelo preço. erro é a diferença, e como é a probabilidade dos
dados, dada a hipótese.
0.08
Antes
0.07
posterior
0.06
0.05
Pmf
0.04
0.03
0.02
0.01
0.00
0 10000 20000 30000 40000 50000 60000 70000 80000
preço ($)
6.7 Atualização
O jogador fornece um método que leva o palpite do participante e calcula a
distribuição posterior:
# Jogador de classe
n = 101
price_xs = numpy.linspace (0, 75000, n)
def PmfPrice(self):
retorno self.pdf_price. MakePmf(self.price_xs)
Para construir o posterior, fazemos uma cópia do anterior e, emseguida,
invocamos Update, que invoca A Probabilidade para cada hipótese,
multiplica o pri-ors by asprobabilidades, e renormaliza.
the Então vamos voltar ao cenário original. Suponha que você é o Jogador
1 e quando você vê sua vitrine, seu melhor palpite é que o preço total dos
prêmios é de $20.000.
Em outro nível, você pode achar este resultado bizarro, porque sugere que
se você acha que o preço é $20,000, então você deve acreditar que o preço é
$24.000.
Se você pensar dessa forma, talvez seja menos surpreendente que o valor
mais provável na parte posterior não seja o seu palpite original.
Vou apresentar os métodos nesta seção de cima para baixo, o que significa
que vou mostrar como eles são usados antes de mostrar como eles
funcionam. Se você vir um método desconhecido, não se preocupe; a
definição será em breve.
Para calcular os lances ideais, escrevi uma classe chamada
GainCalculator: class GainCalculator(object):
Def
__init__(self, player, opponent):
self.player = player self.opponent =
opponent
jogador e adversário são objetos do jogador.
de retorno, ganhos
baixo e alto especificam a gama de possíveis lances; n é o número de lances
para tentar.
10000
5000
0
0 10000 20000 30000 40000 50000 60000 70000 80000
lance ($)
Se diff for menos de $250, você ganha ambas as vitrines. Para simplificar,
presumo que ambas as vitrines tenham o mesmo preço. Como esse
resultado é raro, não faz muita diferença.
Finalmente, temos que calcular a probabilidade de ganhar com base
em diff: def ProbWin(self, diff):
prob = (self.opponent.ProbOverbid() +
self.opponent.ProbWorseThan(diff))
retornar prob
Se seu oponente exagerar, você ganha. Caso contrário, você tem que
esperar que seu oponente esteja fora por mais do que dife. O jogador
fornece métodos para calcular ambas as probabilidades:
# Jogador de classe:
6.9. Discussion 67
def ProbOverbid(self):
retorno self.cdf_diff. Prob(-1)
6.9 Discussão
Uma das características da estimativa bayesiana é que o resultado vem na
forma de uma distribuição posterior. Estimativa clássica geralmente gera
um
68 Capítulo 6. Análise de
Decisões
estimativa de ponto único ou um intervalo de confiança, o que é suficiente
se a estimativa fora última etapa do processo, mas se você quiser usar uma
estimativa como entrada para uma análise subseqüente, estimativas de
pontos e intervalos muitas vezes não ajudam muito.
Os métodos bayesianos são mais úteis quando você pode levar o distri-
bution posterior para o próximo passo da análise para realizar algum tipo
de análise de decisão, como fizemos neste capítulo, ou algum tipo de
previsão, como vemos no próximo capítulo.
Previsão do
Capítulo 7
1. Use estatísticas de jogos anteriores para escolher uma distribuição prévia para
λ.
2. Use a pontuação dos quatro primeiros jogos para estimar λ para cada equipe.
Def __init__(self):
pmf = thinkbayes. MakeGaussianPMF (2.7, 0.3, 4)
thinkbayes. Suite.__init__(self, pmf)
Como sempre, temos que decide como representar cada hipótese; in neste
caso, represento a hipótese de que λ = x com o valor de ponto flutuante x.
7.2. Poisson processes 71
7.3 Os posteriores
Agora podemos calcular a probabilidade de que uma equipe com um
valor hipotético de lam marque k gols em um jogo:
72 Capítulo 7. Previsão
0.018
Bruins
0.016
Canucks
0.014
Probabilidade
0.012
0.010
0.008
0.006
0.004
0.002
0.000
1.5 2.0 2.5 3.0 3.5 4.0
Gols por jogo
# classe Hóquei
UpdateSet([0, 2, 8, 4])
0.25
Bruins
Canucks
0.20
Probabilidade
0.15
0.10
0.05
0.00
0 2 4 6 8 10
Objetivos
Isso é bastante simples até agora; o problema é que não sabemos o valor de
eu sou exatamente. Em vez disso, temosuma distribuição de possíveis valores para lam.
0.0030
Bruins
Canucks
0.0025
Probabilidade
0.0020
0.0015
0.0010
0.0005
0.0000
0.0 0.5 1.0 1.5 2.0
Jogos até o gol
def MakeGoalPmf(suite):
metapmf = thinkbayes.
PMF()
Se soubermos exatamente o lam, é só isso. Mas nós não; em vez disso, temos
uma distribuição posterior de valores possíveis. Assim como fizemos com
a destributação das metas, fazemos um meta-PMF e computamos uma
mistura de PMF.
def MakeGoalTimePmf(suite):
metapmf = thinkbayes.
PMF()
7.7 Discussão
Como sempre, a análise neste capítulo baseia-se nas decisões de
modelagem, e a modelagem é quase sempre um processo iterativo. Em
geral, você quer começar com algo simples que produz uma resposta
aproximada, identificar prováveis fontes de erro e procurar oportunidades
de melhoria.
Neste exemplo, eu consideraria estas opções:
7.7. Discussion 77
• Escolhi um antes com base na média de gols por jogo para cada time.
Mas essa estatística é média entre todos os oponentes. Contra um
oponente particu-lar, podemos esperar mais variabilidade. Por
exemplo, se o time com o melhor ataque joga coma pior defesa, os gols
esperados por jogo podem ser vários desvios padrão acima da
média.
7.8 Exercícios
Exercício 7.1. Se os ônibus chegarem a um ponto de ônibus a cada 20 minutos, e
você chegar ao ponto de ônibus em um horário aleatório, seu tempo de espera até
que o ônibus chegue é distribuído uniformemente de 0 a 20 minutos.
Dica: Suponha que o tempo entre os ônibus seja de 5 ou 10 minutos com igual
probabilidade. Qual é a probabilidade de você chegar durante um dos intervalos de
10 minutos?
Bulbo. Especificamente, lâmpadas antigas têm uma taxa de falha crescente devido
à evaporação do filamento.
Este problema é mais aberto do que alguns; você terá que fazer modelagem de-
cisions. Você pode querer ler sobre a distribuição weibull (http: // en. wikipedia.
org/ wiki/ distribuição Weibull_ ). Ou você pode querer olhar em volta para
informações sobre curvas de sobrevivência de lâmpadas.
80 Capítulo 7. Previsão
Capítulo 8
Viés
observador
Quando cheguei à estação, pude estimar a hora até o próximo trem com
base no número de passageiros na plataforma. Se houvesse apenas
algumas pessoas, eu inferi que perdi um trem e esperava esperar cerca de
7 minutos. Se houvesse mais passageiros, esperava que o trem chegasse
mais cedo. Mas se houvesse um grande número de passageiros, eu
suspeitava que os trens não estavam funcionando no horário, então eu
voltaria para o nível da rua e pegaria um táxi.
0.025
z zb
0.020
0.015
Cdf
0.010
0.005
0.000
0 5 10 15 20
Tempo (min)
Figura 8.1: PMF de lacunas entre trens, com base em dados coletados,
suavizado pelo KDE. z é a distribuição real; zb é a distribuição tendenciosa
vista pelos passageiros.
8.2 O modelo
Antes de chegarmos à análise, temos que tomar algumas decisões de
modelagem. Primeiro,trarei as chegadas de passageiros como um processo
de Poisson, o que significa que assumo que os passageiros são igualmente
propensos a chegar a qualquer momento, e que eles chegam a uma taxa
desconhecida, λ, medido empassageiros por minuto. Uma vez que
observo os passageiros durante um curto período de tempo, e ao mesmo
tempo todos os dias, assumo que λ é constante.
Por outro lado, o processo de chegada dos trens não é Poisson. Os trens
para Boston devem sair do final da linha (estação Alewife) a cada 7-8
minutos durante os horários de pico, mas quando chegam à Praça
Kendall, o tempo entre os trens varia entre 3 e 12 minutos.
Para coletar dados sobre o tempo entre os trens, escrevi um roteiro que
derrubadados em tempo real de
http://www.mbta.com/rider_tools/developers/, se- lects trens com destino
ao sul chegando na praça Kendall, e registra seus tempos de ar-rival em
um bancode dados. Eu corri o script das 16:00 às 18:00 todos os dias da
semana durante 5 dias, e registrei cerca de 15 chegadas por dia. Em
seguida, calculei o tempo entre chegadas consecutivas; a distribuição
dessas lacunas é mostrada na Figura 8.1, rotulada z.
def BiasPMF(pmf):
new_pmf = PMF.
Cópia()
new_pmf. Normalizar ()
retorno new_pmf
Z
zb y
0.8
0.6
Cdf
0.4
0.2
0.0
0 5 10 15 20
Tempo (min)
Afigura e 8.2 mostra a distribuição de z, zb, e y com base nos dados que
coletei no site da Linha Vermelha.
1.0
x anterior
0.8 posterior x pred y
0.6
Cdf
0.4
0.2
0.0
0 5 10 15 20
Tempo (min)
self.post_x = self.prior_x.Copy()
self.post_x.Update((lam, num_passengers))
A PMF resultante inclui alguns valores negativos, que sabemos que são
im- possíveis. Por exemplo, se você chegar durante um intervalo de 5
minutos, você não pode esperar mais de 5 minutos. RemoveNegatives
remove o valor impossível da distribuição e renormalizas.
def RemoveNegatives(pmf):
para val em pmf. Valores():
se val < 0:
Pmf. Remova (val) pmf.
Normalizar()
A Figura 8.3 mostra os resultados. A distribuição prévia de x é a mesma
da distribuição de y na Figura 8.2. A distribuição posterior de x mostra
que, depois de ver 15 passageiros na plataforma, acreditamos que o tempo
desde
1.0
Antes
posterior
0.8
0.6
Cdf
0.4
0.2
0.0
0 1 2 3 4 5
Taxa de chegada (passageiros / min)
Suponha que você acabou de se mudar para Boston, então você não sabe
muito sobre a taxa de chegada de passeenger na Linha Vermelha. Depois
de alguns dias de deslocamento, você poderia fazer um palpite, pelo
menos qualitativamente. Com um pouco mais de esforço, você poderia
estimar λ quantitativamente.
Todos os dias, quando você chega à plataforma, você deve observar a hora
e o número de passageiros esperando (se a plataforma for muito grande,
você pode escolher uma área de amostra). Em seguida, você deve registrar
o seu tempo de espera e o número de recém-chegados enquanto você está
esperando.
k1 Y k
-- -- 2
- -
-
17 4.6 9
22 1. 0
0
23 1. 4
4
18 5. 12
4
4 5. 11
8
1.0
Mistura
0.8
0.6
Cdf
0.4
0.2
0.0
0 2 4 6 8 10
Tempo de espera (min)
= self.prior_lam. Cópia()
para k1, y, k2 em passenger_data: self.post_lam.
Atualização((y, k2))
__init__ constrói hipos, que é uma seqüência de valores hipotéticos para
lam, então constróia distribuição prévia, prior_lam. O loop for atualiza o
anterior com dados, produzindo o bution distri posterior, post_lam.
0.12
0.10
0.06
0.04
0.02
0.00
0 5 10 15 20 25 30 35
Passageiros num
8.8 Discussão
A análise até agora foi baseada no pressuposto de que a taxa de chegada
dos passengersé a mesma todos os dias. day. Para um trem de passageiros
na hora do rush, isso pode não ser uma má suposição, mas há algumas
exceções óbvias. Por exemplo, se houver um evento especial por perto, um
grande número de pessoas pode chegar ao mesmo tempo. In Nesse caso, a
estimativa de lam seria muito baixa, então as estimativas de x e y seriam
muito altas.
Deixo essa análise como um exercício para o leitor. Uma sugestão: você
deve ler o Capítulo 15 primeiro. Você pode encontrar o esboço de uma
solução em http://thinkbayes.com/redline.py. Para obter mais informações,
consulte a Seção 0.3.
8.9 Exercícios
Exercício 8.1. Este exercício é de MacKay, Teoria da Informação, Inferência e
Algoritmos de Aprendizagem :
96 Capítulo 8. Viés
observador
Instável Partículas São Emitido De a Fonte E Decadência Em a
Distância X Um número real que tem uma distribuição de
probabilidade exponencial com [pa- rameter] λ. Eventos de
decaimento só podem ser observados se ocorrerem em um win-dow
estendendo-se a partir de x = 1 cm a x = 20 cm. N decaisão são
observadas em locais {1.5, 2, 3, 4, 5, 12} Cm. Qual é o distribuição
?
posterior de λ
Você pode baixar uma solução para este exercício a partir de http: //
thinkbayes. com/ decadência. py .
Capítulo 9
Duas dimensões
9.1 Paintball
Paintball é um esporte no qual equipes concorrentes tentam atirar umas
nas outras com armas que disparam balas cheias de tinta que quebram no
impacto, deixando uma marca colorida no alvo. Geralmente é jogado em
uma arena decorada com barreiras e outros objetos que podem ser usados
como cobertura.
Suponha que você está jogando paintball em uma arena interior 30 pés de
largura e 50 pés de comprimento. Você está perto de uma das paredes de
30 pés, e você suspeita que um de seus oponentes se cobriu nas
proximidades. Ao longo da parede, você vê vários patters de pintura,
todos da mesma cor, que você acha que seu oponente disparou
recentemente.
Os respingos estão a 15, 16, 18 e 21 pés, medidos a partir do canto inferior
esquerdo da sala. Com base nesses dados, onde você acha que seu
oponente está se escondendo?
A Figura 9.1 mostra um diagrama da arena. Usando o canto inferior
esquerdo da sala como origem, denoto a localização desconhecida do
atirador com coordenadas α e β,ou alfa e beta. A localização de um
respingo é rotulada
x. O umgle que o oponente atira é φ ou theta.
shooter
β
θ
wall α x
9.2 A suíte
Para começar, precisamos de uma Suíte que represente um conjunto de
hipóteses sobre a localização do oponente. Cada hipótese é um par de
coordenadas: (alfa, beta).
Aqui está a definição da suíte Paintball:
classe Paintball (thinkbayes. Suíte, thinkbayes. Conjunto):
alfas é a lista de valores possíveis para alfa;; betas é a lista de valores para
beta. pares é uma lista de todos os pares (alfa, beta).
locais é uma lista de possíveis locais ao longo da parede; ele é armazenado para uso em
Probabilidade.
1.0
0.8
0.6
Prob
0.4
0.2
Alfa
Beta
0.0
0 10 20 30 40 50
Distância
9.3 Trigonometria
Agora precisamos de uma função de probabilidade, o que significa que
temos que descobrir a probabilidade de atingir qualquer ponto ao longo
da parede, dada a localização do oponente.
x − α = β tan φ
100 Capítulo 9. Duas dimensões
0.055
beta = 10
0.050 beta = 20
beta = 40
0.045
0.040
Prob 0.035
0.030
0.025
0.020
0.015
0.010
0 5 10 15 20 25 30
Distância
Figura 9.3: PMF de localização dada alfa=10, para vários valores de beta.
9.4 Probabilidade
Agora tudo o que precisamos é de uma função de probabilidade. Podemos
usar o MakeLocationPMF para calcular a probabilidade de qualquer valor
de x,dadas as coordenadas do oponente.
def Probabilidade (self, data, hypo): alfa,
beta = hypo
x = dados
pmf = MakeLocationPMF (alfa, beta, self.locations) como =
pmf. Prob(x)
retornar como
O resultado é uma distribuição que mapeia cada par (alfa, beta) para uma
probabilidade posterior. probability.
102 Capítulo 9. Duas dimensões
Os intervalos de 50% de credibilidade são (14, 21) para alfa e (5, 31) para
beta. Os dados fornecem evidências de que o atirador está no lado
próximo da sala. Mas não é uma evidência forte. Os intervalos de 90% de
credibilidade cobrem a maior parte da sala!
9.6. Conditional distributions 103
0.09
beta = 10
0.08 beta = 20
beta = 40
0.07
0.06
0.05
Prob
0.04
0.03
0.02
0.01
0.00
0 5 10 15 20 25 30
Distância
Pmf. Normalizar()
retorno pmf
Mais uma vez, eu sou o índice da variável que queremos; j é o índice da
variável condi-tioning, e val é o valor condicional.
O resultado é a distribuição daiª variável a condição de que o
jth variável é val.
Por exemplo, o código a seguir calcula as distribuições condicionais de
alfa para uma gama de valores
de beta: betas = [10, 20, 40]
104 Capítulo 9. Duas dimensões
50
40
30 75
Beta
20
50
10
25
0
0 5 10 15 20 25 30
Alfa
intervalo de retorno
O primeiro passo é fazer uma lista dos valores da suíte, classificados em
ordem decrescentepor probabilidade. Em seguida, atravessamos a lista,
adicionando cada valor ao intervalo, até que a probabilidade total exceda
a porcentagem. O resultado é uma lista de valores da suíte. Observe que
este conjunto de valores não é necessariamente contíguo.
Para visualizaros intervalos, escrevi uma função que "colore" cada valor
ac-cording para quantos intervalos ele aparece em:
def MakeCrediblePlot(suíte):
d = dict((par, 0) para par na suíte. Valores())
d retorno
d é um dicionário que mapeia de cada valor na suíte para o número de
intervalos em que aparece. O loop calcula intervalos para várias
porcentagens e modifica d.
106 Capítulo 9. Duas dimensões
9.8 Discussão
Este capítulo mostra que a estrutura bayesiana dos capítulos anteriores
pode ser estendida para lidar com um espaço de parâmetrobidimensional.
A única diferença é que cada hipótese é representada por uma tupla de
parâmetros.
Também apresentei joint, que é uma classe dos pais que fornece
metanfetamina-ods que se aplicam a distribuições articulares: Marginal,
Condicionale MakeLikeInterval. Em termos orientados a objetos, Joint é uma
mixin (veja http:
en.wikipedia.org/wiki/Mixin).
9.9 Exercícios
Exercício 9.1. Em nosso modelo simples, o oponente é igualmente provável para
atirar em qualquer direção. Como exercício, vamos considerar melhorias neste
modelo.
A análise deste capítulo sugere que um atirador é mais provável que atinja a
parede mais próxima. Mas, na realidade, se opônei está perto de uma parede, é
improvável que ele atire na parede porque é improvável que ele veja um alvo entre
ele e a parede.
Computação bayesiana
aproximada
Isso é muito próximo, então podemos concluir que este conjunto de dados
fornece uma fraca idence contra a Hipótese de Variabilidade. Mas
podemos usar metanfetamina bayesiana para tornar essa conclusão
maisprecisa. E responder a essa pergunta me dá a chance de demonstrar
algumas técnicas para trabalhar com grandes conjuntos de dados.
Eu vou prosseguir em alguns passos:
Def
__init__(eu, mus, sigmas): pares =
[(mu, sigma)
para mu em mus
para sigma em sigmas]
# computação m e s
n = len(xs)
m=
numpy.mean(xs) s =
numpy.std(xs)
10.3 Atualização
Finalmente aqui está o código para fazer e atualizar a suíte:
mus, sigmas = FindPriorRanges (xs, num_points) suite
= Altura(mus, sigmas)
10.4. The posterior distribution of CV 113
Mas neste caso está tudo bem. A sério. Usamos os dados para escolher o
intervalo para o anterior, mas apenas para evitar calcular um monte de
pressobabilities que teria sido muito pequeno de qualquer maneira. Com
num_stderrs=4,o intervalo é grande o suficiente para cobrir todos os valores
com probabilidade não desprezível. Depois disso, torná-lo maior não tem
efeito sobre os resultados.
A análise em si é simples, mas há mais duas questões que temos que lidar:
10.5 Underflow
Se selecionarmos os primeiros 100 valores do conjunto de dados BRFSS e
executarmos a análise que acabei de descrever, ele roda sem erros e temos
distribuições posteriores que parecem razoáveis.
Se selecionarmos os primeiros 1000 valores e executarmos o programa
novamente, teremos um erro em PMF.Normalize::
ValueError: a probabilidade total é zero.
O problema é que estamos usando densidades de probabilidade para
calcular likeli-hoods, e densidades de distribuições contínuas tendem a ser
pequenas. E se você pegar 1000 pequenos valores e multiplicá-los
together, o resultado é muito pequeno. Neste caso, é tão pequeno que não
pode ser representado por um número de ponto flutuante, por isso é
arredondado para zero, que é chamado de subfluxo. E se todas as
probabilidades na distribuição são 0, não é mais uma distribuição.
Uma solução possível é renormalizar o PMF após cada atualização, ou
após cada lote de 100. Isso funcionaria, mas seria lento.
Uma alternativa melhor é calcular as probabilidades uma transformação
de tronco. Dessa forma, em vez de multiplicar pequenos valores, podemos
somar probabilidades de log. Pmf fornece métodos Log, LogUpdateSet e Exp
para facilitar esse processo.
def Log(self):
m = self. MaxLike()
para x, p em self.d.iteritems(): se p:
Auto. Definir(x,
math.log(p/m)) mais:
Auto. Remover(x)
Antes de aplicar o log transform Log usa MaxLike para encontrar m, a
maior probabilidadeno PMF. Ele divide todas as probabilidades por m,de
modo que a maior proba-bility fica normalizada para 1, o que produz um
log de 0. As outras probabilidades de registro são todas negativas. Se
houver algum valor na PMF com probabilidade 0, eles são removidos.
Enquanto o PMF estiver uma transformação de log, não podemos usar
UpdateUpdate, UpdateSetou Normalize. O resultado seria absurdo; se você
tentar, PMF levanta uma exceção. Em vez disso, temos que usar logupdate
e logupdateset.
10.6. Log-likelihood 115
def Exp(self):
m = self. MaxLike()
para x, p em self.d.iteritems(): self.
Conjunto(x, math.exp(p-m))
Se as probabilidades de log forem grandes números negativos, as
probabilidades resultantes podem subfluir. Assim, a Exp encontra a
probabilidade máxima de log, m, e muda todasas probabilidades para
cima por m. A distribuição resultante tem um máximo de lito de 1. Este
processo inverte a transformação do tronco com perda mínima de
precisão.
10.8 Abc
Mas talvez você não tenha esse tipo de tempo. Nesse caso, aComputação
Bayesiana aproximada (ABC) pode ser o caminho a percorrer. A
motivação do ABC é que a probabilidade de qualquer conjunto de dados
em particular é:
7.34
Stddev (cm)
7.33
0.006
7.32
7.31
0.003
7.30
7.29
7.28
178.46 178.48 178.50 178.52 178.54
Altura média (cm)
7.03
Stddev (cm)
7.02
0.006
7.01
7.00 0.003
6.99
alfa = (1-p) / 2
ipr = cdf. Valor (1-alfa) - cdf. Mediana de retorno de
valor (alfa), ipr
mediana de retorno, s
1.0
0.8
Probabilidade
0.6
0.4
0.2
Masculino
Fêmea
0.0
0,0405 0.0410 0.0415 0.0420 0.0425 0.0430 0.0435
Coeficiente de variação
10.11 Discussão
Há duas maneiras de pensar na ABC. Uma interpretação é que é, como o
nome sugere, uma aproximação que é mais rápida de calcular do que o
valor exato.
10.12 Exercícios
Exercício 10.1. Um "tamanho de efeito" é uma estatística destinada a medir
a diferença entre dois grupos (ver http: // en. wikipedia. org/ wiki/
tamanho Effect_ ).
Por exemplo, poderíamos usar dados da BRFSS para compor a diferença de altura
entre homens e mulheres. Por meio de valores amostrais das distribuições
posteriores de μ e σ,poderíamos gerar a distribuição posterior dessa diferença.
Mas pode ser melhor usar uma medida adimensionada do tamanho do efeito, em
vez de uma diferença medida em cm. Uma opção é usar a divisão através do desvio
padrão (semelhante ao que fizemos com o coeficiente de variação).
Se os parâmetros para Group 1 são (μ1, σ1), e osparâmetros para o Grupo 2 são
(μ2, σ2) , o tamanho do efeito adimensional é
µ1 − µ2
(σ1 + σ2) /2
Escreva uma função que leve distribuições articulares de mu e sigma para dois
grupos e retorne a distribuição posterior do tamanho do efeito.
Dica: se enumerar todos os pares das duas distribuições demorar muito, considere
a amostragem aleatória.
Teste de hipóteses
do capítulo 11
Mas usar os dados para formular a hipótese é obviamente falso. Por essa
definição, qualquer conjunto de dados seria evidência a favor de B,, a
menos que a porcentagem observada de cabeças seja exatamente de 50%.
Podemos pensar nesta versão, que chamarei de B_two como uma hipótese
composta de duas subhipóteses. Podemos calcular a probabilidade de cada
sub-hipótese e, em seguida, calcular a probabilidade média.
11.2. Making a fair comparison 127
retorno total
O valor de retorno de Normalize é o total das probabilidades no Suite, que
é a média das probabilidades para as subhipóteses, ponderadas pelas
probabilidades anteriores. E o Update passa esse valor junto, então, em vez
de usar o SuiteLikelihood,poderíamos calcular a probabilidadede b_uniform
assim:
probabilidade = b_uniform. Atualização (dados)
11.4 Discussão
O fator Bayes para B_uniform é de 0,47, o que significa que os dados
fornecem evidências contra essa hipótese, em comparação com F. Na
seção anterior, eu caracterizei essa evidência como "fraca", mas não disse
por quê.
Parte da resposta é histórica. Harold Jeffreys, um dos primeiros
defensores das estatísticas bayesianas, sugeriu uma escala para interpretar
os fatores de Bayes:
Bayes Força
Fator
1–3 Mal vale a pena
mencionar
3 – 10 Substancial
10 – 30 Forte
30 – Muito forte
100
> 100 Decisivo
No exemplo, o fator Bayes é 0,47 a favor de B_uniform, por isso é 2,1 a
favor de F, o que Jeffreys consideraria "mal vale a pena mencionar".
Outros autores sugeriram variações na redação. Para evitar discutir sobre
adjetivos, poderíamos pensar em probabilidades em vez disso.
Se suas chances anteriores são 1:1, e você vê evidências com bayes fator 2,
vocêr chances posteriores são 2:1. Em termos de probabilidade, os dados
mudaram seu grau de crença de 50% para 66%. Para a maioria dos
problemas do mundo real, essa mudança seria pequena em relação a erros
de modelagem e outras fontes de incerteza.
Por outro lado, se você tivesse visto evidências com o fator Bayes 100, suas
chances posteriores seriam 100:1 ou mais de 99%. Se você concorda ou não
que tais evidências são "decisivas", é certamente forte.
11.5 Exercícios
Exercício 11.1. Algumas pessoas acreditam na existência de percepção extra-
sensorial (ESP); por exemplo, a capacidade de algumas pessoas de adivinhar o
valor de uma carta de jogo invisível com probabilidade melhor do que o acaso.
130 Capítulo 11. Teste de hipóteses
Qual é o seu grau prévio de crença neste tipo de ESP? Você acha que é tão
provável que exista como não? Ou você está mais cético sobre isso? Anote suas
chances anteriores.
Agora calcule a força das evidências que seria necessário para convencê-lo de que
o ESP tem pelo menos 50% de chances de existir. Que fator Bayes seria necessário
para ter 90% de certeza de que o ESP existe?
Exercício 11.2. Suponha que sua resposta à pergunta anterior seja 1000; ou seja,
evidências com o fator Bayes 1000 a favor da ESP seriam suficientes para
changnge sua mente.
Agora suponha que você leia um artigo em uma respeitável revista científica
revisada por pares que apresenta evidências com o fator Bayes 1000 a favor do
ESP. Isso mudaria sua opinião?
Se não, como você resolve a aparente contradição? Você pode achar útil ler sobre o
artigo de David Hume, "Of Miracles", em http: // en. wikipedia. org/ wiki/
Of_ Miracles .
Capítulo 12
Evidência
Se Alice conseguiu 780 e Bob conseguiu um 740 (de um possível 800), você
pode querer saber se essa diferença é uma evidência de que Alice está
melhor preparada que Bob, e qual é a força dessa evidência.
12.2 A escala
Para entender as pontuações do SAT, temos que entender o processo de
pontuação e escala. Cada tomador de teste obtém uma pontuação bruta
com base no número de perguntas corretas e incorretas. A pontuação
bruta é convertida em uma pontuação escalonada na faixa 200-800.
12.3 O anterior
O Conselho Universitário também publica a distribuição de pontuações
dimensionadas para todos os participantes do teste. Se convertermos cada
escore escalonado em um escore bruto, e dividirmos pelo número de
perguntas, o resultado é uma estimativa de p_correct. Assim, podemos
utilizar a distribuição de escores brutos para modelar a distribuição prévia
de p_correct.
Def __init__(self):
self.scale = ReadScale() scores =
ReadRanks()
score_pmf = thinkbayes. MakePmfFromDict(dict(scores))
self.raw = self. ReverseScale(score_pmf) self.max_score =
max(self.raw.Values())
self.prior = DivideValues (self.raw, self.max_score)
12.3. The prior 133
1.0
Antes
0.8
0.6
Cdf
0.4
0.2
0.0
0.0 0.2 0.4 0.6 0.8 1.0
p_correct
Para cada tomador de teste, defino uma Suíte chamada Sat que representa
a distribuição de p_correct. Aqui está a definição:
classe Sáb (thinkbayes. Suíte):
auto.exame =
autoexame.score =
pontuação
1.0
posterior 780
posterior 740
0.8
0.6
Cdf
0.4
0.2
0.0
0.70 0.75 0.80 0.85 0.90 0.95 1.00
p_correct
k = autoexame.Reverso (escore)
n = auto.exame.max_score
como = thinkbayes. Retorno da EvalBinomialPMF(k, n,
p_correct) como
hypo é um valor hipotético de p_correct, e os dados são um escore escalonado.
12.4 Posterior
A Figura 12.2 mostra as distribuições posteriores de p_correct para Alice e
Bob com base em suas notas no exame. Podemos ver que eles se
sobrepõem, então é possível que p_correct seja realmente maior para Bob,
mas parece improvável.
12.4. Posterior 135
a_like += c_like / 2
b_like += c_like / 2
Auto. Normalizar()
Normalmente, quando definimos uma nova Suíte, herdamos a Atualização
e fornecemos Probabilidade. Neste caso eu anular atualização,porque é mais
fácil avaliar a probabilidade de ambas as hipóteses ao mesmo tempo.
Os dados passados para Atualização são objetos sat que representam as
distri-butions posteriores de p_correct.
a_like é a probabilidade total de que p_correct seja maior para Alice; b_like é
essa probabilidade de que seja maior para Bob.
136 Capítulo 12. Provas
topo = TopLevel( AB )
' '
superior. Atualização((a_sat,
b_sat)) superior. Impressão()
A probabilidade de A é 0,79 e a probabilidade de B é 0,21. A razão de
probabilidade (ou fator Bayes) é de 3,8, o que significa que esses
resultados de teste são evidências de que Alice é melhor do que Bob em
responder perguntas de sat. Se acreditássemos, antes de ver os resultados
do teste, que A e B somosigualmente prováveis, então depois de ver as
pontuações devemos acreditar que a probabilidade de A é de 79%, o que
significa que ainda há 21% de chance de Bob estar realmente melhor
preparado.
• Suponha que cada testador tenha algum grau de eficácia, o que mea -
garante sua capacidade de responder a perguntas sat.
12.6 Calibração
Se nos fosse dada a distribuição da dificuldade, poderíamos usar o
MakeRawScoreDist para calcular a distribuição de pontuações brutas. Mas
para nós o problema é o contrário: recebemos a distribuição do escore
brutoequeremos inferir a distribuição da dificuldade.
Assumo que a distribuição da dificuldade é uniforme com parâmetros
central e largura.. MakeDifficulties faz uma lista de dificuldades com esses
parâmetros.
def MakeDifficulties (centro, largura, n): low,
alto = centro-largura, centro+largura
retorno numpy.linspace (baixo, alto, n)
Ao experimentar algumas combinações, descobri que centro=-0,05 e
largura=1,8 produzem uma distribuição de escores brutos semelhantes aos
dados reais, como mostrado na Figura 12.3.
12.7. Posterior distribution of efficacy 139
1.0
Dados
Modelo
0.8
0.6
Cdf
0.4
0.2
0.0
0
10 20 30 40 50 60
pontuação bruta
Dificuldade
Eficáci - - 1.7
a 1.85 0.0 5
5
3.00 0.99 0.9 0.7
5 8
1.50 0.97 0.8 0.4
2 4
0.00 0.86 0.5 0.1
1 5
-1.50 0.59 0.1 0.0
9 4
-3.00 0.24 0.0 0.0
5 1
Alguém com eficácia 3 (dois desvios padrão acima da média) tem 99% de
chance de responder às perguntas mais fáceis do exame, e 78% de chance
de responder as mais difíceis. Na outra ponta da faixa, alguém com dois
desvios padrão abaixo da média tem24% de chance de responder às
perguntas mais fáceis.
1.0
posterior 780
posterior 740
0.8
0.6
Cdf
0.4
0.2
0.0
0 1 2 3 4
Eficácia
PMF é a distribuição de escores brutos para um tomador de teste com a eficácia dada;
como é a probabilidade da pontuação observada.
12.8. Predictive distribution 141
1.00
0.95
p_correct Bob
0.90
0.85
0.80
0.80 0.85 0.90 0.95 1.00
p_correct Alice
12.9 Discussão
Começamos este capítulo com a pergunta: "Quão forte é a evidência de
que Alice está mais preparada que Bob?" Diante disso, parece que
queremos testar duas hipóteses: ou Alice está mais preparada ou Bob está.
Capítulo 13
Distribution of RDT
1.0
0.8
0.6
Cdf
0.4
0.2
model
Dados
0.0
2 1 0 1 2 3 4 5 6 7
RDT (duplicações de volume por ano)
problema em mãos, e se não, você pode usá-lo para validar o modelo mais
complex.
Para o meu modelo simples, eu assumo que os tumores crescem com um
tempo de duplicação constante, e que eles são tridimensionais no sentido
de que se a medição linear máxima dobra, o volume é multiplicado por
oito.
Aprendi com meu correspondente que o tempo entre sua alta militar e seu
diagnóstico foi de 3291 dias (cerca de 9 anos). Então meu primeiro cálculo
foi: "Se esse tumor crescesse na taxa mediana, quão grande teria sido na
data da alta? "
O tempo médio de duplicação do volume relatado por Zhang et al é de
811 dias. Assumindo a geometria tridimensional, o tempo de duplicação
para uma medida linear é três vezes maior.
# tempo entre a alta e o diagnóstico, no intervalo de dias =
3291,0
O result, d0,tem cerca de 6 cm. Então, se este tumor se formou após a data
da descarga, ele deve ter crescido substancialmente mais rápido do que a
taxa mediana. Lá, concluí que é "mais provável do que não" que este
tumor tenha se formado antes da data da alta.
Além disso, calculei a taxa de crescimento que estaria implícita se esse
tumor tivesse se formado após a data da alta. Se assumirmos um tamanho
inicial de 0,1 cm, podemos calcular o número de duplicações para chegar a
um tamanho final de 15,5 cm:
# assumir uma medida linear inicial de 0,1 cm d0 =
0,1
d1 = 15,5
148 Capítulo 13. Simulação
Mas para torná-los úteis, eu queria um modelo mais geral da relação entre
idade e tamanho.
0.5
0.2
0 5 10 15 20 25 30 35 40
idade do tumor (anos)
13.4 Implementação
Aqui está o kernel da simulação:
def MakeSequence(rdt_seq, v0=0,01, interval=0,67, vmax=Volume(20,0)): seq =
v0,
idade = 0
retorno seq
rdt_seq é um iterator que produz valores aleatórios do CDF da taxa de
crescimento. v0 é o volume inicial em mL. intervalo é o passo de tempo em
anos. vmax é o volume final correspondente a uma medição linear de 20
cm.
O volume se converte da medição linear em cm para o volume em mL, com
base na simplificação de que o tumor é uma esfera:
def Volume (diâmetro, fator=4*math.pi/3): fator
de retorno * (diâmetro/2,0)**3
ExtendSequence calcula o volume do tumor no final do inter-val.
def ExtendSequence (idade, seq, rdt, intervalo): inicial =
seq[-1]
duplicações = rdt * intervalo final
= inicial * 2**duplicações new_seq
= seq + (final,) cache. Adicionar
(idade, new_seq, rdt)
10
0.5
0.2
0 5 10 15 20 25 30 35 40
Idades
Def __init__(self):
auto.joint = thinkbayes. Articulação( )
articulada é uma PMF conjunta que registra a frequência de cada par de
tamanho de idade, por isso aproxima-se da distribuição conjunta de idade
e tamanho.
No final de cada intervalo simulado, extendSequence
chamadas Adicionar: # cache de classe
0.8
0.6
Cdf
0.4
2 Cm
0.2 5 cm
10 cm
15 cm
0.0
0 10 20 30 40 50
idade do tumor (anos)
40
95
30
25
75º 50º 25º
5º
20
15
10
0
0.5 1 2 5 10 20
diâmetro (cm, escala de tronco)
# cache de classe
13.8 Discussão
Bem, nós passamos por um capítulo inteiro sem usar o teorema de Bayes ou o
Classe de suíte que encapsula atualizações bayesianas. O que é que aconteceu?
Um Modelo Hierárquico
0.045
0.040
100
250
0.035 400
0.030
0.025
Pmf
0.020
0.015
0.010
0.005
0.000
0 100 200 300 400 500
Número de partículas (n)
Depois de atualizar o Emissor, temos que atualizar cada um dos Detectores, também.
# emitter classe
0.06
r posterior
0.05 posterior N
0.04
Pmf
0.03
0.02
0.01
0.00
0 100 200 300 400 500
Taxa de emissão
def DistOfR(self):
itens = [(detector.r, prob) para detector, prob em self. Itens()] retornam
thinkbayes. MakePMFFromItems(itens)
itens é uma lista de valores de r e suas probabilidades. O resultado é o PMF de
r.
Para obter a distribuição posterior de n,temos que calcular a
misturadosDetectores. Podemos usar thinkbayes. MakeMixture, que leva um
meta-PMF que mapeia de cada distribuição para sua probabilidade. E isso
é exatamente o que o Emissor é:
# emitter classe
def DistOfN(self):
retorno thinkbayes. MakeMixture(self)
A Figura 14.2 mostra os resultados. Não surpreendentemente, o valor
mais provável para n é 150. Dado f e n,a contagem esperada é k = f n,
assimdado f e k, o valor esperadode n é k/ f , que é 150.
14.6 Discussão
O problema do contador Geiger demonstra a conexão entre causa-causa e
modelagem hierárquica. No exemplo, a taxa de emissão r tem um efeito
causal sobre o número deartigosp, n, que tem um efeitocausal na
contagem de partículas, k.
Então a informação causal flui pela hierarquia, e a inferência flui para cima.
14.7 Exercícios
Exercício 14.1. O exercício de Thitambém é inspirado por um exemplo em
Jaynes, Probability Theory.
Suponha que você compre uma armadilha de mosquitos que deve reduzir a
população de mosquitos perto de sua casa. Toda semana, você esvazia a armadilha
e conta o num-ber de mosquitos capturados. Naprimeira semana, você conta 30
mosquitos. Depois da segunda semana, você conta 20 mosquitos. Estimar a
mudança percentual no número de mosquitos em seu quintal.
Para responder a essa pergunta, você tem que tomar algumas decisões de
modelagem. Aqui estão algumas sugestões:
• Durante a semana, algumas frações deles, f1, vagueiam pelo seu quintal, e
dessas algumas frações, f2, são pegos na armadilha.
• Sua solução deve levar em conta sua crença prévia sobre o quanto N
provavelmente mudará de uma semana para outra. Você pode fazero chapéu
adicionando um nível à hierarquia para modelar a mudança percentual em
N. can do t
166 Capítulo 14. Um Modelo
Hierárquico
Capítulo 15
0.035
Leões
0.030 tigres ursos
0.025
0.020
Prob
0.015
0.010
0.005
0.000
0.0 0.2 0.4 0.6 0.8 1.0
Prevalência
para i no intervalo(3):
beta = dirichlet. MarginalBeta(i) pmf
= beta. MakePMF()
imprimir i, PMF. Média()
A Figura 15.1 mostra os resultados. As prevalências médias posteriores
são 44%, 33% e 22%.
Def
__init__(self, ns):
hipos = [thinkbayes. Dirichlet(n) para n em ns] thinkbayes. Suite.__init__(self,
hypos)
__init__ pega uma lista de valores possíveis para n e faz uma lista de
objetos Derichlet.
x = dados
p = self. Random()
q = p[:m]**x return
q.prod()
O comprimento dos dados é o número de espécies observadas. Se vermos
mais espécies do que pensávamos existir, a probabilidade é 0.
Caso contrário, selecionamos um conjunto aleatório de prevalências, p, e
calcular o PMF multi-nomial, que é
x
cX p11 · · · pNxn
pi é a prevalência da espécie i,e xi é o número observado. O primeiro
termo, cx, éo coeficiente multinomial; Deixo isso de fora da computação
porque é um fator multiplicativo que depende apenas dos dados, não da
hipótese, então ele fica normalizado (ver http://en.wikipedia.org/
wiki/Multinomial_distribution).
0.12
0.10
0.08
Prob
0.06
0.04
0.02
0.00
0 5 10 15 20 25 30
Número de espécies
1 (ver number_generation
http://en.wikipedia.org/wiki/Dirichlet_distribution#Random_ ).
# classe Dirichlet
def Random(self):
p = numpy.random.gamma(self.params)
retorno p / p.sum()
Agora estamos prontos para ver alguns resultados. Aqui está o código que
extrai a distribuição posterior de n::
def DistOfN(self):
pmf = thinkbayes. PMF()
para hipo, prob em si mesmo. Itens(): pmf.
Conjunto (hypo.n, prob)
retorno pmf
DistOfN itera através das hipóteses de nível superior e acumula a
probabilidade de cada n.
15.5 Otimização
Tenho que admitir que estou orgulhoso deste exemplo. O prob-lem
espécie invisível não é fácil, e eu acho que esta solução é simples e clara, e
leva sur-prisingly poucas linhas de código (cerca de 50 até agora).
Se você não estiver interessado nos detalhes, sinta-se livre para pular para
a Seção 15.9 onde olhamos os resultados dos dados do umbigo.
self.probs *= como
self.probs /= self.probs.sum()
m = len(dados)
self.params[:m] += dados
SampleLikelihood retorna uma matriz de probabilidades, uma para cada
valor de n. como acumula a probabilidade total de 1000 amostras. self.probs
é mul-tipd mente pela probabilidade total, em seguida, normalizado. As
duas últimas linhas, que atualizam os parâmetros, são as mesmas de
Dirichlet.Update.
176 Capítulo 15. Lidando com Dimensões
m = linha len
(dados) =
gammas[:m]
col = numpy.cumsum (gammas)
log_likes = [] para
n em self.ns:
ps = linha / col[n-1]
termos = dados * numpy.log(ps)
log_like = termos.sum()
log_likes.apêndice(log_like)
retorno gosta
gammas é uma matriz de valores de uma distribuição gama; seu
comprimento é o maior valor hipotético de n. linha é apenas os primeiros
elementos m de gammas; uma vez que estes são os únicos elementos que
dependem dos dados, eles são os únicos que precisamos.
Para cada valor de n precisamos dividir a linha pelo total dos primeiros
valores n de gama. cumsum calcula essas somas cumulativas e armazena-as
em col.
para i no intervalo(m):
um = numpy.zeros(i+1)
one[i] = data[i]
Species.Update(self, one)
Esta versão herda __init__ de Espécies, por isso representa as hipóteses
como uma lista de objetos de Dirichlet (ao contrário de Species2). Species
A atualização percorre as espécies observadas e faz uma matriz, one,, com
todos os zeros e uma contagem de espécies. Em seguida, ele chama
Atualização na classe pai, que calcula as probabilidades e atualiza as
subhipóteses.
Então, no exemplo de execução, fazemos três atualizações. A primeira é
algo como "Eu vi três leões." "Euvi dois tigres e nenhum leão adicional." E
o terceiro é "Eu vi um urso e não mais leões e tigres."
Aqui está a nova versão de
Likelihood: # class Species4
retornar como
Isto é quase o mesmo que Species.Likelihood. A diferença é o fac-tor,
num_unseen. Essa correção é necessária porque cada vez que vemos uma
espécie pela primeira vez, temos que considerar que havia algum num-ber
de outras espécies invisíveis que poderíamos ter visto. Para valores
maiores de n there há mais espécies invisíveis que poderíamos ter visto, o
que aumenta a probabilidade dos dados.
Este é um ponto sutil e eu tenho que admitir que eu não fiz certo na
primeira vez. Mas novamente eu fui capaz de validar esta versão
comparando-a com as versões anteriores.
self.probs *= curtidas
self.probs /= self.probs.sum()
Esta função é semelhante à Species2.Update,com duas alterações:
somas = numpy.cumsum(gammas)[self.ns[0]-1:]
ps = gammas[i-1] / somas
log_likes = numpy.log(ps) * contagem
retorno gosta
Isso é semelhante ao Species2.SampleLikelihood; a diferença é que cada
atualização inclui apenas uma única espécie, então não precisamos de um
loop.
O tempo de execução desta função é proporcional ao número de hipóteses,
k. Ele roda m vezes, então o tempo de execução da atualização é
proporcional ao km. E o número de iterações que precisamos para obter
um resultado preciso é geralmente pequeno.
B1242
0.10
0.08
Prob
0.06
0.04
0.02
0.00
60 65 70 75 80 85 90 95 100
Número de espécies
def DistN(self):
itens = zip (self.ns, self.probs)
pmf = thinkbayes. MakePmfFromItems(itens)
retorno pmf
A Figura 15.3 mostra a distribuição de n para o sujeito B1242. A
probabilidade de haver exatamente 61 espécies, e nenhuma espécie
invisível, é quase zero. O valor mais provável és 72, com intervalo de 90%
de credibilidade de 66 a 79. Na ponta alta, é improvável que existam até 87
espécies.
Em seguida, calculamos a distribuição posterior da prevalência para cada espécie.
Species2 fornece DistOfPrevalence: #
class Species2
0.8
0.6
Prob
0.4
1 (92)
2 (53)
3 (47)
0.2 4 (38)
5 (15)
0.0
0.00 0.05 0.10 0.15 0.20 0.25
Prevalência
índice indica quais espécies queremos. Para cada n,temos uma distribuição
posterior diferente da prevalência.
A Figura 15.4 mostra os resultados das cinco espécies com mais leituras.
As espécies mais prevalentes são responsáveis por 23% das 400 leituras,
mas como existem espécies ainda mais invisíveis, a estimativa mais
provável para sua prevalência é de 20%, com intervalo de 90% entre 17% e
23%.
10
# espécies 4
2
0 50 100 150 200 250 300 350 400 450
# amostras
curva = []
para k, obs em enumerado(observações): visto.add(obs)
curva de retorno
num_reads é o número de leituras adicionais para simular. m é o número
de espécies vistas, e visto é um conjunto de cordas com um nome único
para cada espécie. n é um valor aleatório da distribuição posterior, e
observações é uma seqüência aleatória de nomes de espécies.
def GetSeenSpecies(self):
nomes = self. GetNames()
m = len(nomes)
visto = conjunto (SpeciesGenerator (nomes,
m)) retorno m, visto
186 Capítulo 15. Lidando com Dimensões
(nome, i) i += 1
%d % i i += 1
'
retorno n, observações
Mais uma vez, num_reads é o número de leituras adicionais para generate. n e
prevalências são amostras da distribuição posterior.
0.8
0.6
Prob
0.4
k=100
0.2 k=200 k=400 k=800
0.0
0 2 4 6 8 10 12 14
# nova espécie
cdfs = [] para
k em ks:
pmf = articulação. Condicional(1,
0, k) pmf.name = k=%d % k
' '
retorno cdfs
A Figura 15.6 mostra os resultados. Após 100 leituras, a mediana das
previsões de novas espécies é de 2; o intervalo de 90% de credibilidade é
de 0 a 5. Depois de 800 leituras, esperamos ver de 3 a 12 novas espécies.
15.12 Cobertura
A última pergunta que queremos responder é: "Quantas leituras
adicionais são necessárias para aumentar a fração de espécies observadas
para um determinado limiar?"
Para responder a esta pergunta, precisamos de uma versão de
RunSimulation que calcule a fração de espécies observadasrat-la do que o
número de novas espécies.
15.12. Cobertura 189
1.0
1000
0.8
800
Probabilidade
0.6 600
200
0.4
400
0.2
0.0
0.65 0.70 0.75 0.80 0.85 0.90
100
0.95 1.00 1.05
Fração de espécies vistas
# Disciplina de classe 10
curva = []
para k, obs em enumerado(observações): visto.add(obs)
recurva de volta
Em seguida, fazemos um loop através de cada curva e fazemos um
dicionário, d,que mapeia desde o número de leituras adicionais, k, até
umalista de fracs; ou seja, uma lista de valores para a cobertura alcançada
após k leituras.
def MakeFracCdfs(self, curvas): d =
{}
para curvas in curvas:
para k,frac na curva: d.setdefault(k,
[]).apêndice(frac)
cdfs = {}
para k, fracs em d.iteritos():
cdf = thinkbayes. MakeCdfFromList(fracs)
cdfs[k] = cdf
retorno cdfs
Então para cada valor de k fazemos um Cdf de fracs;este Cdf representa a
distribuição da cobertura após k leituras.
Lembre-se que o CDF lhe diz a probabilidade de cair abaixo de um
determinado limiar, de modo que o CDF complementar informa a
probabilidade de excedê-lo. A Figura 15.7 apresenta CDFs
complementares para uma gama de valores de k.
Para ler esta figura, selecione o nível de cobertura que deseja alcançar ao
longo do eixo x. Como exemplo, escolha 90%.
Agora você pode ler o gráfico para encontrar a probabilidade de alcançar
90% de cobertura após k leituras. Por exemplo, com 200 leituras, você tem
cerca de 40% chance de obter 90% de cobertura. Com 1000 leituras, você
tem 90% de chance de obter 90% de cobertura.
Com isso, respondemos às quatro perguntas que compõem o problema
das espécies invisíveis. Para validar os algoritmos neste capítulo com
dados reais, tive que lidar com mais alguns detalhes. Mas este capítulo já é
muito longo, então não vou discuti-los aqui.
Você pode ler sobre os problemas, e como eu os abordei, them, em
http://allendowney.blogspot.com/2013/05/ umbigo-
biodiversity-end-game.html.
15.13 Discussão
O problema das espécies invisíveis é uma área de pesquisa ativa, e
acredito que o algoritmo neste capítulo é uma nova contribuição. Então,
em menos de 200 páginas, fizemos isso do básico da probabilidade para a
fronteira da pesquisa. Estoumuito feliz com isso.
Meu objetivo para este livro é apresentar três idéias relacionadas:
Se você chegou até aqui, deve estar preparado para aplicar essas
ferramentas a novos problemas relevantes para o seu trabalho. Espero que
você ache-los úteis; Deixe-me saber como ele vai!
Índice
Problema M e M, 6, 17
MacKay, David, 33, 45, 95, 125
MakeMixture, 74, 75, 85, 92, 138,
183
distribuição marginal, 102, 106, 169
matplotlib, viii
máximo, 49
probabilidade máxima, 27, 35, 68,
105,
113, 115, 168
erro quadrado médio,
24 Meckel, Johann,
109
mediana, 35
memoização, 117
meta-PMF, 74, 75, 85, 92, 138, 183
meta-Suite, 162, 170
microbioma, 167
mistura, 52, 73-75, 85, 92, 146, 183
modelagem, vi, 30, 40, 76, 123,
131, 147,
148
erro de modelagem, 136, 154, 157
Problema de Monty Hall, 8, 15
Mosteller, Frederick, 22 anos.
Mult, 13 anos.
coeficiente multinomial, 172
distribuição multinomial, 168, 172,
176
mutuamente exclusivo, 6
objetividade, 30
viés observador, 83, 93
probabilidades, 43
Faculdade Olin, 81
Problema de sangue de
Oliver, 45 unidade
taxonômica operacional,
181 otimização, 37, 116,
117, 163, 174
OTU, 181
horas extras, 75
Problema de paintball, 97
parâmetro, 39
PDF, 40, 70
Pdf, 57
PEP 8, viii
percentil, 28, 153, 156
PMF, 54, 57
Classe PMF, 11
Métodos pmf, 12
Distribuição de Poisson, 71, 73, 88, 161
Processo poisson, vi, 69, 71, 75, 78, 82,
15
9
po
ste
rio
r,
5
distribuição posterior, 13, 35
direito de poder, 26
distribuição preditiva, 78, 87, 89, 92,
141 de 184
prevalência, 167,
Índic 195
e
Prob, 12 suite, 6
probabilidade, 57 Classe suíte, 16
condicional, 1 estatística sumária, 68, 121, 124
conjunto, 2 pântanog os antecedentes, 36, 40
densidade de probabilidade, 57 interruptor, 9
função de densidade de
probabilidade, 40, 57, método de tabela, 7
70 padrão do método do modelo,
função de massa de 18 probabilidade total, 6
probabilidade, processo 11, distribuição de triângulo, 36, 128
71 trigonometria, 99
enredo pseudocolor, 152 tipo de tumor, 154
piroseqüência, 167 tuplo, 38