Problema locomotivo com empresas de vários tamanhos

9

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.

Justin Bozonier
fonte
O mesmo problema está em 50 problemas desafiadores em probabilidade de Mosteller. O livro está amplamente disponível. Eu não acho que bayes logo está correto.
Comprei o livro @Hogan, mas ele não inclui a parte de outras empresas sendo misturadas.
23613 Justin Bozonier #

Respostas:

8

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 é .NANBNANBNtot=NA+NB

Imagine que você vê uma locomotiva com o número . Existem três casos para a probabilidade:n

  1. NA<n : Isso não pode acontecer, então a probabilidade é zero.
  2. NB<nNA : Esta locomotiva deve ser da empresa A , portanto, existe apenas uma locomotiva com esse número. Portanto, a probabilidade é de1/Ntot
  3. nNB : Esta locomotiva pode ser de A ou de B , então existem duas locomotivas com esse número. A probabilidade de ver um deles é .2/Ntot

Como uma verificação rápida da sanidade: a probabilidade de ver qualquer número é .

i=1L(i)=i=1NB2Ntot+i=NB+1NA1Ntot=2NBNtot+NANBNtot=NA+NBNtot=1

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<nNi+1NtotNnnNnNtotNnNtotNsconté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úmero n:

total_number_of_locomotives = sum(N for N in Ns)
number_of_locomotives_with_that_number = sum(1 for N in Ns if n<=N)
likelihood = (number_of_locomotives_with_that_number / total_number_of_locomotives)

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 ).NnN


Para os anteriores, a lei de Zipf pode ser um bom ponto de partida para uma distribuição realista dos tamanhos das empresas.

dobiwan
fonte
Esta é uma ótima resposta e você está certo de que posso definitivamente ver como isso se generaliza. Obrigado por tomar o tempo.
Justin Bozonier 13/09/14
Não vale nada que a função de probabilidade resultante tenha o mesmo valor independente da hipótese. Ou seja, Likelihood(data=60, hypo=60)e Likelihood(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)
ecerulm
0

Não vou analisar o código, mas abaixo está a solução.

Deixei

  • P (loc60) é a probabilidade de uma locomotiva aleatória ter o número 60
  • P (N) é a probabilidade anterior de existir exatamente N locomotivas
  • P (loc60 | N) é a probabilidade de uma locomotiva aleatória ter o número 60, se o número total de locomotivas for N,
  • P (N | loc60) é a probabilidade de existir exatamente N locomotivas, se uma locomotiva aleatória tiver o número 60

Então

P(N|loc60)=P(loc60|N)P(N)P(loc60)=P(loc60|N)P(N)MP(loc60|M)

Mas

P(loc60|N)={1/N if N60 0 otherwise 

A partir de agora, assumimos que .N60

P(N|loc60)=P(N)/NM=60P(M)/M

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 .logNlogNmax102N<103103N<104NmaxNmax60

A distribuição uniforme de significa que , onde c é uma constante independente de N.logN

P(N)=c(log(N+1)logN)c/N

Substituindo isso pela fórmula anterior, temos:

P(N|loc60)c/N2M=60Nmaxc/M2

Mas

M=60Nmaxc/M260NmaxcM2dM=c60cNmaxc60

Agora temos

P(N|loc60)60/N2

Qual é o valor mediano de N? Seja , entãoNmed

60Nmed60N2dN=1/2

60/N60Nmed=1/2

Nmed=120

Se o que precisamos é de expectativa matemática em vez de mediana, então

E(N)=60Nmax60N2NdN=60logNmax60

Pelo que sei sobre ferrovias, deve estar entre e , então E (N) está entre 170 e 600.Nmax103106

user31264
fonte
1
Isso parece resolver o problema simples. Mas o que acontece quando você pode ter diferentes empresas de ferrovias de diferentes tamanhos?
23613 Justin Bozonier #
Isso aborda exatamente o caso quando existem empresas ferroviárias diferentes de tamanhos diferentes. " é distribuído uniformemente entre 0 e algum " é a distribuição de tamanhos. logNlogNmax
user31264
4
Se você diz. É estranho que a palavra "empresa" não apareça uma vez na sua resposta. Desculpe, não vejo a conexão.
precisa saber é o seguinte