Ich schreibe eine Unterklasse scipy.stats._distn_infrastructure.rv_discrete
für die Beta-Binomialverteilung, deren PMF ist
Dabei ist die Beta-Funktion. Meine derzeitige Implementierung von CDF und SF (Überlebensfunktion, entspricht 1 - CDF) ist ungenau; Die Strategie, die ich angewendet habe, berechnet den erwarteten Wert des Binomial-PDF in Bezug auf die Beta-Komponente:
scipy.stats.beta.expect
Die PPF ist noch schlimmer - es ist eine Brute-Force-Schleife über die ganzen Zahlen so dass
Laut Wikipedia ist die Überlebensfunktion für die Beta-Binomialverteilung
Dabei ist die verallgemeinerte hypergeometrische Funktion. Gibt es eine effiziente Möglichkeit, dies in Python zu berechnen, damit ich den Verweis auf entfernen kann ? Wie würde ich diese Funktion auch invertieren, um nach zu lösen, wenn ?beta.expect
quelle
Antworten:
Dies beantwortet Ihre Frage nicht direkt, aber wenn Sie daran denken, die kumulative Verteilungsfunktion von Beta-Binomial effizienter abzuschätzen, können Sie einen rekursiven Algorithmus verwenden, der etwas effizienter ist als die naive Implementierung.
Beachten Sie die Wahrscheinlichkeitsmassenfunktion der Beta-Binomialverteilung
kann neu geschrieben werden, wenn Sie sich daran erinnern, dass undund dass , so dass es wirdB(x,y)=Γ(x)Γ(y)Γ(x+y) Γ(x)=(x−1)! (nk)=∏ki=1n+1−ii
Dies erleichtert das Aktualisieren von aufx x+1
und damit können Sie die kumulative Verteilungsfunktion als berechnen
Verwenden Sie nur einfache arithmetische Operationen, anstatt computerintensivere Funktionen zu berechnen.
Nebenbemerkung: Wenn Sie mit großen Zahlen arbeiten, treten Probleme mit der numerischen Genauigkeit auf, sodass robusterer Code mit Logarithmen arbeiten muss, obwohl Sie eine Verbesserung der Effizienz erwarten können (bis zu zwei- bis dreimal schnellerer Code, wenn ich nur wenige Benchmarks ausgeführt habe) C ++ - Code, der es implementiert, im Vergleich zur naiven Implementierung).
quelle