You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SciPy自定义分布调用.rvs()时出现NaN错误求助

问题原因与修复方案

你的自定义分布是Beta分布的特例(参数α=k, β=1),报错核心原因是rv_continuous的.rvs()方法默认依赖分位数函数(PPF,即CDF的逆函数)。你仅定义了_pdf,SciPy会尝试数值反演CDF,但边界处容易出现NaN数值问题。

由于你的分布存在解析形式的CDF和PPF,直接实现这两个方法即可彻底解决问题:

  • CDF:F(x) = x^k(0≤x≤1)
  • PPF:F⁻¹(q) = q^(1/k)(0≤q≤1)

修正后的代码:

import math
from scipy import stats

k = 7

class custom_distro(stats.rv_continuous):
    def _pdf(self, x):
        return k * math.pow(x, k-1) if (0 <= x <= 1) else 0
    
    def _cdf(self, x):
        if x <= 0:
            return 0.0
        elif x >= 1:
            return 1.0
        else:
            return math.pow(x, k)
    
    def _ppf(self, q):
        if q <= 0:
            return 0.0
        elif q >= 1:
            return 1.0
        else:
            return math.pow(q, 1/k)

# 测试
dist = custom_distro()
print(dist.rvs(size=5))  # 正常生成随机样本

另外,也可以直接用SciPy内置的stats.beta(k, 1)替代自定义类,效果完全一致,无需重复造轮子。

SciPy优质学习资源
  • SciPy官方文档的统计模块教程:重点研读rv_continuous基类的方法说明,以及各类分布的使用示例
  • SciPy官方入门教程集:包含基础数值计算、统计分析的实战案例,覆盖核心API用法
  • 数据分析类书籍的SciPy章节:比如《Python数据分析基础》《利用Python进行数据分析》中的相关内容,结合实战场景理解工具用法
  • 官方GitHub仓库的示例脚本:包含大量可运行的功能演示代码,适合边运行边调试学习

内容的提问来源于stack exchange,提问作者Hattori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:32:11