Estou escrevendo uma subclasse scipy.stats._distn_infrastructure.rv_discrete
para a distribuição binomial beta cujo PMF é
onde é a função Beta. Minha implementação atual do CDF e SF (função de sobrevivência, equivalente a 1 - CDF) é imprecisa; a estratégia que empreguei calcula o valor esperado do binomial cdf em relação ao componente beta:
que . Consigo isso usando o
scipy.stats.beta.expect
método, que não é vetorizado de forma inata (ele trava em qualquer coisa que não seja uma matriz float ou 0d).
O PPF é ainda pior - é um loop de força bruta sobre os números inteiros tal que
Segundo a Wikipedia, a função de sobrevivência para a distribuição beta-binomial é
onde é a função hipergeométrica generalizada. Existe uma maneira eficiente de calcular isso em Python, para que eu possa remover a referência ? Além disso, como eu inverteria essa função para resolver dado ?beta.expect
distributions
python
cdf
beta-binomial
Scott Norton
fonte
fonte
Respostas:
Isso não responde diretamente à sua pergunta, mas se você estiver pensando em estimar a função de distribuição cumulativa do binômio beta com mais eficiência, poderá usar um algoritmo recursivo que é um pouco mais eficiente que a implementação ingênua.
Observe que a função massa de probabilidade da distribuição beta-binomial
pode ser reescrito se você lembrar que ee que , para que se torneB(x,y)=Γ(x)Γ(y)Γ(x+y) Γ(x)=(x−1)! (nk)=∏ki=1n+1−ii
Isso faz com que a atualização de para fácilx x+1
e usando isso, você pode calcular a função de distribuição cumulativa como
usando apenas operações aritméticas simples, em vez de calcular funções mais intensivas em computador.
Sidenote: ao lidar com grandes números, você entraria em problemas de precisão numérica, portanto, um código mais robusto precisaria trabalhar com logaritmos, mas mesmo que você esperasse uma melhoria na eficiência (código até duas a três vezes mais rápido quando eu executei alguns benchmarks em Código C ++ implementando-o em comparação com a implementação ingênua).
fonte