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

Abierto
#2,040 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
54/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
python, tensorflow

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
Jupyter Notebook
Estrellas
4.4k
Forks
1.1k
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de tensorflow/probability

Todos los issues de tensorflow/probability

Issues similares

Más issues de Backend & API Design

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.