você pode me mostrar explicitamente a primeira iteração da pontuação de newton-raphson e fisher?

8

Estou tentando entender a diferença entre a Newton-Raphsontécnica e a Fisher scoringtécnica calculando a primeira iteração para cada método de uma Bernoulliamostra. (Eu sei que, neste caso, posso calcular explicitamente e imediatamente πmeue mas quero fazê-lo iterativamente apenas para entender e ver como cada método converge).

Suponha que eu desenhe uma moeda n=10 vezes, o parâmetro real πt=0,3 é desconhecido para mim e eu tenho 4 cabeças, então X¯=0,4 .

A função de pontuação é:

você(π)=nX¯π-n(1-X¯)1-π

A informação pescada observada é:

J(π)=-nX¯π2-n(1-X¯)(1-π)2

e a informação esperada dos pescadores é:

Eu(π)=nπtπ2+n(1-πt)(1-π)2

E observe que podemos simplificar as informações esperadas dos pescadores apenas quando as avaliamos em π=πt , mas não sabemos onde é ...

Agora, suponha que meu palpite inicial seja π0 0=0,6

Será que Newton-Raphsonsimplesmente ir como este:

π1=π0 0-você(π0 0)/J(π0 0)

?

E como Fisher-scoringvai?

π1=π0 0+você(π0 0)/Eu(π0 0)

Note que ele contém que não sabemos! e nem podemos substituir π t por π m l e, como também não sabemos - é exatamente isso que estamos procurando ...πtπtπmeue

Você pode ajudar a me mostrar da maneira mais concreta possível esses dois métodos? Obrigado!

ihadanny
fonte

Respostas:

4

Para Newton-Raphson , sim, temos

π1=π0 0-você(π0 0)/J(π0 0).

πEu(π)Eu(π)=-E(J(π))=E[você(π)você(π)]

Eu^(π0 0)=EunvocêEu(π0 0)vocêEu(π0 0),
vocêEu(π)=xEuπ-1-xEu1-πxEu
π1=π0 0+você(π0 0)/Eu^(π0 0).
n

I revisto I_hat(pi)em @ de ihadanny Pythoncódigo. Agora, a pontuação de Newton-Raphson e Fisher fornece resultados idênticos.

import random
import numpy as np 

pi_t = random.random()
n = 1000
draws = [1 if x < pi_t else 0 for x in np.random.rand(n)]
x_bar = np.mean(draws)

def u(pi):
    return n*x_bar/pi - n*(1-x_bar)/(1-pi)
def J(pi):
    return -n*x_bar/pi**2 - n*(1-x_bar)/((1-pi)**2)
def I_hat(pi):
    x = 0
    for i in range(0, n): 
        x = x + (draws[i]/pi - (1-draws[i])/(1-pi))**2
    return x
def Newton(pi):
    return pi - u(pi)/J(pi)
def Fisher(pi):
    return pi + u(pi)/I_hat(pi)

def dance(method_name, method):
    print("starting iterations for: " + method_name)
    pi, prev_pi, i = 0.5, None, 0
    while i == 0 or (abs(pi-pi_t) > 0.001 and abs(pi-prev_pi) > 0.001 and i < 10):
        prev_pi, pi = pi, method(pi)
        i += 1
        print(method_name, i, "delta: ", abs(pi-pi_t))

dance("Newton", Newton)
dance("Fisher", Fisher)

Log Message
starting iterations for: Newton
Newton 1 delta:  0.00899203081545
Newton 2 delta:  0.00899203081545
starting iterations for: Fisher
Fisher 1 delta:  0.00899203081545
Fisher 2 delta:  0.00899203081545

Atualizar

Eu^(π)=Eun(xEuπ-1-xEu1-π)2=EunxEuπ2+(n-EunxEu)(1-π)2=-J(π),
Randel
fonte
hmm .. muito obrigado por isso - faz sentido. No entanto, implementamos suas declarações exatas: pastebin.com/m192UYs9 - Newton converge após 1-2 iterações, Fisher nem chega perto após 10 iterações. Não deveria ser o contrário? Eu achava que Fisher é uma melhoria sobre Newton ...
ihadanny
1
π1=π0 0+1/você(π0 0)
Randel
oh ótimo! uma última pergunta antes de eu aceitar - não é estranho que agora os dois métodos apresentem exatamente os mesmos resultados sempre que executo o código? novamente - Fisher deveria ser uma melhoria - parece que, usando sua aproximação (correta), agora não há vantagem em usar Fisher sobre Newton e os dois métodos são matematicamente equivalentes :(
ihadanny
(e não se preocupe - eu aceitarei e darei o prêmio de recompensa antes que ele expire, é que eu realmente esperava que essa pergunta me ajudasse a entender a diferença fundamental entre os métodos e, atualmente, ela não me levou até lá - apenas se parece com a ginástica matemática da mesma coisa para mim)
ihadanny
n .
Randel