jax version of GeneralizedExtremeValue distribution has wrong support for concentration=0

オープン
#1,839 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
3/5
見積もり時間
1〜2日
初心者へのやさしさ
42/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
python

調査の方向性

tensorflow_probability.substrates.jax.distributions の tfd.GeneralizedExtremeValue から始め、ゼロ付近の concentration 値について提供された JAX の再現コードを実行します。concentration=0 における報告された support と log_prob の挙動を、期待される非有界の support と比較します。JAX substrate がそのケースを記載された期待どおり一貫して処理し、関連する挙動が回帰テストでカバーされれば、issue は完了です。

索引モデルが issue の本文から書いたものです。

説明

It seems like the support of the GEV is (-1.0, inf) for concentration=0, rather than the expected (-inf, inf). I am using:

  • tensorflow-probability 0.24.0
  • jax 0.4.30

I only tested this for the tensorflow_probability.substrates.jax.distributions version.

Otherwise, the support seems to be fine. Here's a little experiment for reproducing my findings:

import tensorflow_probability.substrates.jax.distributions as tfd
import jax.numpy as jnp
import pandas as pd
from itertools import product

def nominal_gev_support(loc, scale, concentration):
    if jnp.allclose(concentration, 0.0):
        return (-jnp.inf, jnp.inf)
    
    if concentration > 0.0:
        return (loc - scale / concentration, jnp.inf)
    
    if concentration < 0.0:
        return (-jnp.inf, loc - scale / concentration)

x = jnp.linspace(-5, 5, 1000)
cases = []

locs = [0.0]
scales = [1.0]
concentrations = list(jnp.linspace(-2, 2, 9))

for loc, scale, concentration in product(locs, scales, concentrations):
    cases.append({"loc": loc, "scale": scale, "concentration": concentration})


dfs = []
for case in cases:
    gev = tfd.GeneralizedExtremeValue(
        loc=case["loc"], scale=case["scale"], concentration=case["concentration"]
    )

    lp = gev.log_prob(x)
    not_nan_indices = jnp.argwhere(~jnp.isinf(lp))

    nominal_min, nominal_max = nominal_gev_support(
        loc=case["loc"], scale=case["scale"], concentration=case["concentration"]
    )

    data = {
        "nominal_min": nominal_min,
        "nominal_max": nominal_max,
        "observed_min": x[not_nan_indices].min(),
        "observed_max": x[not_nan_indices].max()
    }
    
    data |= case

    df = pd.DataFrame(data, index=[0])
    dfs.append(df)

results = pd.concat(dfs)

results

Bildschirmfoto 2024-09-20 um 12 04 15

主要言語
Jupyter Notebook
スター
4.4k
フォーク
1.1k
PR マージ指標
30日以内にマージされた PR はありません

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

tensorflow/probability のほかの issue

tensorflow/probability の issue をすべて見る

似ている issue

Machine Learning の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。