Chi2, Gamma, Beta and Binomial survival_function lose the upper tail because they fall back to 1 - cdf

Aperta
#2,040 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
54/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
python, tensorflow

Direzione di ricerca

Start with the fallback in distribution.py:1495 and compare it with the survival function override added for Poisson in poisson.py:282. Reproduce the reported float64 cases, then inspect the Chi2, Gamma, Beta, and Binomial implementations and their existing tests. Done means their survival functions preserve the reported small upper-tail probabilities with suitable tests for the numerical behavior.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

import tensorflow as tf, tensorflow_probability as tfp
tfd = tfp.distributions
d = lambda v: tf.constant(v, tf.float64)
tfd.Chi2(d(1.80006)).survival_function(d(90.5982))    # 0.0
tf.math.igammac(d(1.80006) / 2, d(90.5982) / 2)       # 1.353746583750377e-20
tfd.Chi2(d(20.0)).survival_function(d(100.0))         # 1.2596590437397026e-12
tf.math.igammac(d(10.0), d(50.0))                     # 1.2596084591660847e-12
tfd.Gamma(d(10.0), d(0.5)).survival_function(d(100.0))  # 1.2596590437397026e-12
tfd.Binomial(total_count=d(50.0), probs=d(0.01)).survival_function(d(25.0))  # 1.1102230246251565e-16
tfd.Beta(d(50.0), d(200.0)).survival_function(d(0.5))  # 1.1102230246251565e-16
tf.math.betainc(d(200.0), d(50.0), 1 - d(0.5))        # 3.93029180905806e-23
call actual enclosure of the true value miss
Chi2(1.80006).survival_function(90.5982) 0.0 1.3537465837503759e-20 9e15 ulp
Chi2(20).survival_function(100) 1.2596590437397026e-12 1.2596084591660908e-12 2.5e11 ulp
Binomial(50, 0.01).survival_function(25) 1.1102230246251565e-16 9.6362741287734525e-39 8.5e37 ulp
Beta(50, 200).survival_function(0.5) 1.1102230246251565e-16 3.9302918090574181e-23 1.9e22 ulp

The chi-square values are Arb ball-arithmetic enclosures at the exact double inputs, and the binomial and Beta values are exact rationals (integer shapes). None of these classes overrides _survival_function, so each gets the base class's 1 - cdf, and a probability below about 1e-16 becomes 0 or the rounding noise of the subtraction. Above that the relative error is about 1e-16/S: 4e-5 at S = 1.26e-12. The fallback is at distribution.py:1495, unchanged on main. Poisson got this fix in #1311 (poisson.py:282).

igammac matches at these points. Using it takes the chi-square count from 103 to 13 of 758; the 13 left all have df above 5,000 and are a separate large-a error. tf.math.betainc(b, a, 1 - x) agrees to 1.6e-13 here and takes Beta from 64 to 27 of 378. betainc(k+1, n-k, p) takes the binomial from 72 to 2 of 296. StudentT and Normal have their own _survival_function and were clean over their own test points (1,002 and 529). The counts are relative error above 1e-12, on a fixed grid and log-uniform draws.

Version: tensorflow-probability 0.25.0, tensorflow-cpu 2.21.0, float64, CPU, Windows x86-64, Python 3.12. Values are identical on tensorflow-cpu 2.18.0.

Found and drafted with an AI agent (Claude); a second agent re-ran the repro and the numbers independently.

Lingua principale
Jupyter Notebook
Stelle
4.4k
Fork
1.1k
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di tensorflow/probability

Tutte le issue di tensorflow/probability

Issue simili

Altre issue su Backend & API Design

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.