首页 > 编程问答 >是否有对数累积分布函数 (CDF) 和分位数函数的数值稳定的 Python 实现?

是否有对数累积分布函数 (CDF) 和分位数函数的数值稳定的 Python 实现?

时间:2024-08-05 16:35:29浏览次数:8  
标签:python scipy

我正在寻找以下函数的数值稳定实现。由于我的应用涉及 t 分布,所以我这里以 t 分布为例。

Log CDF

# Naive Python implementation of the function I need

import scipy
import numpy as np

def t_log_cdf(x, df):
    p = scipy.stats.t.cdf(x, df=df)
    return np.log(p)

SciPy 中,有一个 logcdf ,但它是数值不够稳定。将 scipy 函数的行为:

>>> import scipy
>>> import numpy as np

>>> scipy.stats.t.logcdf(np.linspace(0, 60, 5), df=15)
array([-6.93147181e-01, -9.70638014e-11, -4.21884749e-15,  0.00000000e+00,
        0.00000000e+00])

与 R 中的等效函数进行比较:

# R code
> pt(seq(0, 60, length.out = 5), df = 15, log.p = TRUE)
[1] -6.931472e-01 -9.706380e-11 -4.157404e-15 -1.012752e-17 -1.384523e-19

Tensorflow Probability 提供了一个实现,但其结果类似于 scipy 结果。

我无法在 中找到实现PyTorch (根本不提供 t 分布的 CDF)。

基于对数概率的分位数函数:

# Naive Python implementation of the function I need

import scipy
import numpy as np

def t_log_ppf(log_p, loc, scale):
    p = np.exp(log_p)
    return scipy.stats.t.ppf(p, df=df))

我在 SciPy 中找不到对对数概率进行操作的分位数函数, PyTorch ,或 张量流概率


是对的,在对数概率的极端尾部计算 log-CDF 和分位数函数可能会在数值上变得不稳定。观察到 SciPy 和 TensorFlow Probability 中的默认方法在此类情况下难以提供准确结果。

以下是解决这些问题的策略以及提供更稳定实现的方法:

1. 用于 Log-CDF 的任意精度算术

  • 挑战: 主要问题在于浮点数的精度有限。当 CDF 非常接近 1(对于 log-CDF 接近 0)时,直接计算会损失大量有效数字,从而导致不准确或甚至下溢。
  • 解决方案: 使用支持任意精度算术的库。Python 中的一个流行选择是 mpmath mpmath 允许以比标准浮点数高得多的精度执行计算,从而减轻了这些问题。

    ```python import mpmath

    def t_log_cdf_stable(x, df): with mpmath.workdps(30): # 将工作精度设置为 30 位数(或根据需要进行调整) return mpmath.log(mpmath.betainc(df / 2, 0.5, df / (df + mpmath.mpf(x)**2)))

    # 示例用法 x_values = np.linspace(0, 60, 5) log_cdf_values = [t_log_cdf_stable(x, 15) for x in x_values] print(log_cdf_values) ```

2. 用于 Log-CDF 的尾部逼近

  • 洞察力: 对于许多分布(包括 t 分布),对于极端尾部值,存在提供准确近似值的专用数学公式(通常涉及渐近展开)。
  • 解决方案: 为 |x| 的大值实现这些尾部逼近值。这需要查阅 t 分布的统计文献以找到适当的公式。

3. 用于基于对数概率的分位数函数(逆 CDF)的反向数值方法

  • 挑战: 即使我们使用 log_cdf 的稳定实现,直接反转它(使用类似 scipy.optimize.fsolve 的方法)也可能在数值上很具有挑战性。
  • 解决方案: 应用专门设计用于反转函数的数值方法,即使在对数概率空间中也是如此。一种这样的方法是使用根查找算法(例如 Brent 方法或 Ridders 方法)结合稳定的 log_cdf 函数。

    ```python from scipy.optimize import brentq

    def t_log_ppf_stable(log_p, df): def objective(x): return t_log_cdf_stable(x, df) - log_p # 为根查找定义适当的界限 a = -1e3
    b = 1e3
    return brentq(objective, a, b)

    # 示例用法 log_p_values = [-6.931472, -9.706380, -4.157404, -1.012752, -1.384523]
    quantiles = [t_log_ppf_stable(lp, 15) for lp in log_p_values] print(quantiles) ```

重要注意事项:

  • 选择适当的方法: 最佳方法取决于的特定需求,例如所需的精度水平、计算速度以及正在处理的尾部值的极端程度。任意精度算术非常准确,但可能会比较慢,而尾部逼近值提供了良好的折衷方案。
  • 测试和验证: 始终使用已知结果或替代实现彻底测试选择的实现,以确保其在预期的输入范围内准确且稳定。

如果需要在速度和数值稳定性方面都具有最佳性能的解决方案,可以考虑使用 C/C++ 等编译语言实现这些专门函数,并使用 Python 包装它们。这样,就可以利用优化的数学库并更直接地控制数值计算。

标签:python,scipy
From: 78822823

相关文章

  • 如何将 *args 参数作为字符串传递给 Python 函数
    我正在使用pytubefix制作一个Youtube下载器。API允许我编写如下代码:YouTube(url).streams.filter(progressive=True)但是假设我有一个字符串存储在像args="progressive=True"这样的变量中,我如何使用args字符串来调用函数,就像......
  • Python Telegram Bot 从数据库获取数据时出错
    我正在开发用于管理企业用途任务的电报机器人。团队负责人注册他的公司并获得唯一的ID,然后可以分配任务。问题是,当团队负责人分配任务时,他可以使用/viewtasks访问它们。但是,当员工尝试查看任务时,它会打印出“错误。您尚未注册”。似乎无法检索与用户关联的company_id,即使......
  • 在 Glue 作业中使用 python3+ 创建 CloudFront 签名 URL
    是否可以使用python3+为GlueJob中S3文件中的一个特定文件创建具有一定时间限制的CloudFront签名URL?我看到可以在Lambda中做到这一点,但在Python文档中找不到任何内容,特别是胶水工作。任何人都可以提供一些提示吗?defload_private_key(key_path):withopen(......
  • 【Python学习手册(第四版)】学习笔记14-迭代器和列表解析(一)
    个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。本文主要以通俗易懂的语言介绍迭代器(文件迭代、手动迭代iter和next等),列表解析式包括基础知识包括写法、文件上使用列表解析、扩展列表解析语法等,对列表解析不懂的同学着重推荐......
  • 如何获取部署在 Azure 应用服务上并通过 Microsoft 身份提供商进行身份验证的 Python
    我使用PythonDash包构建了一个Web应用程序,并将该应用程序部署在Azure应用服务上。Web应用程序当前通过Azure门户的应用程序服务使用Microsoft身份提供程序进行身份验证。但是如何获取登录用户的详细信息呢?在本地运行时如何验证我的Web应用程序?我当前的登录流......
  • 使用 Python 打印此图案
    1010101010101010使用python打印此我已经尝试过defprint_pattern(rows):foriinrange(rows):start_char='1'ifi%2==0else'0'pattern=''.join(start_charifj%2==0else('0'ifs......
  • python discord bot nextcord 斜线命令 更改语言
    我想根据用户的不和谐语言更改斜杠命令的名称。如果语言是韩语/서버如果语言是英语/服务器像这样。我可以使用ctx.locale更改里面的内容,但我也想更改名称和描述。我应该怎么办?当我问ChatGPT时,他们说的很奇怪,谷歌上也没有任何信息。但是有一个机器人可以根据语言......
  • 学习Python的书籍推荐--《Python编程从入门到实践》
    版权信息:书名:Python编程:从入门到实践(第3版)作者:[美]埃里克·马瑟斯(EricMatthes)译者:袁国忠评价:1.北京邮电大学副教授陈光老师是这样评价的:    编程教学之道,一是重在实践,二是循序渐进一一通过巧妙的实战项目,激发和保持学习的热情,让学习渐入佳境。在这两方......
  • 我可以将 Python 与 javascript 结合起来用于网站或应用程序吗
    我不知道如果j添加Python和javascript可以吗我尝试过。但决定在继续之前询问一下是否可以继续但是如果我只使用javascript还是只使用python会更好吗?我只需要建议或答案将Python与Javascript结合用于网站或应用程序不仅完全可行,而且也是一种非常常见的做法!二者......
  • Python 网络抓取与请求和美丽的汤被需要 javascript 阻止
    我正在尝试从网站上抓取文本。我使用简单的代码:requests.get(url_here)。我的代码直到最近才有效。现在,当我使用请求时,我收到一条消息,而不是获取网站的文本:“该网站需要启用JavaScript!您使用的浏览器不支持JavaScript,或者已关闭JavaScript。“我已验证我的浏览器确实......