Estou trabalhando no Think Bayes (gratuito aqui: http://www.greenteapress.com/thinkbayes/ ) e estou no exercício 3.1. Aqui está um resumo do problema:
"Uma ferrovia numera suas locomotivas na ordem 1..N. Um dia você vê uma locomotiva com o número 60. Estime quantas locomotivas a ferrovia possui."
Essa solução é encontrada com a função de verossimilhança e a exponencial anterior da seguinte forma:
class Train(Suite):
def __init__(self, hypos, alpha=1.0):
# Create an exponential prior
Pmf.__init__(self)
for hypo in hypos:
self.Set(hypo, hypo**(-alpha))
self.Normalize()
def Likelihood(self, data, hypo):
if hypo < data:
return 0
else:
return (1.0/hypo)
Conceitualmente, isso significa que, se virmos um número de trem maior que uma de nossas hipóteses (1 ... 1000), todas as hipóteses menores terão uma chance zero de estar correta. O restante das hipóteses tem uma chance de 1 / number_of_trains de nos mostrar um trem com esse número.
No exercício em que estou trabalhando, o autor acrescenta um pouco mais. Isso pressupõe que há apenas uma empresa. Na vida real, porém, você teria uma mistura de grandes e pequenas empresas e empresas maiores (ambas igualmente prováveis). No entanto, isso significa que é mais provável que você veja um trem de uma empresa maior, pois eles teriam mais trens.
Agora, a questão é como refletir isso na função de probabilidade?
Isso não é Stack Overflow; portanto, não estou realmente pedindo ajuda para codificação, mas talvez apenas ajude sobre como posso pensar sobre esse problema em termos de uma função de probabilidade.
fonte
Respostas:
Estou primeiro descrevendo uma abordagem para duas empresas em detalhes; a extensão para ainda mais empresas deve ser intuitiva (pelo menos na probabilidade, a anterior pode ser mais complicada).
Imagine que existem duas empresas A e B , onde A tem locomotivas e B tem locomotivas. Assumimos (você sempre pode alternar A e B para fazer isso aguentar). O número total dessa hipótese de locomotivas é .NA NB NA≥NB Ntot=NA+NB
Imagine que você vê uma locomotiva com o número . Existem três casos para a probabilidade:n
Como uma verificação rápida da sanidade: a probabilidade de ver qualquer número é .
Geralmente, haverá (número de empresas + 1) casos, um para cada intervalo . Felizmente, podemos olhar para o problema de um ângulo diferente e ver que o que precisamos para a probabilidade são realmente apenas dois números: , o número total de locomotivas; e , o número de locomotivas que têm o número . Qual a probabilidade de vermos uma das locomotivas , fora das locomotivas? Isso acontecerá em de todos os casos, portanto, essa fração é a probabilidade. No Python, você pode calcular isso com dois geradores de soma (e nem precisa solicitar as empresas por tamanho). E seNi<n≤Ni+1 Ntot Nn n Nn Ntot NnNtot
Ns
contém uma lista (ou tupla) de tamanhos de empresa de acordo com sua hipótese, isso dará a probabilidade de ver uma locomotiva com o númeron
:Observe que o caso trivial de uma empresa também é tratado por esse código (a primeira soma apenas será , a segunda soma será 0 ou 1, dependendo de ).N n≤N
Para os anteriores, a lei de Zipf pode ser um bom ponto de partida para uma distribuição realista dos tamanhos das empresas.
fonte
Likelihood(data=60, hypo=60)
eLikelihood(data=60, hypo=1000)
avalie o mesmo valor. Então, se a distribuição prévia foi uniforme posterior também será uniforme (menos os valores para o que a probabilidade é 0)Não vou analisar o código, mas abaixo está a solução.
Deixei
Então
Mas
A partir de agora, assumimos que .N≥60
Agora devemos selecionar P (N), caso contrário, estamos presos. Como não sabemos nem a ordem de magnitude de P (N), é razoável supor que seja distribuído uniformemente entre 0 e alguns (ou seja, a probabilidade de é igual à probabilidade de ). Convidar é uma tarefa complicada, mas pelo meu conhecimento prévio sobre ferrovias e locomotivas, posso assumir que .logN logNmax 102≤N<103 103≤N<104 Nmax Nmax≫60
A distribuição uniforme de significa que , onde c é uma constante independente de N.logN
Substituindo isso pela fórmula anterior, temos:
Mas
Agora temos
Qual é o valor mediano de N? Seja , entãoNmed
Se o que precisamos é de expectativa matemática em vez de mediana, então
Pelo que sei sobre ferrovias, deve estar entre e , então E (N) está entre 170 e 600.Nmax 103 106
fonte