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

SciPy自定义概率密度函数采样异常:参数化支持域问题排查

问题分析与解决方案

核心问题

你的代码存在两个关键错误:

  1. 支撑区间定义错误:_get_support返回了(0, inf),但实际你的PDF仅在x >= a时非零,支撑区间应为(a, inf),错误的支撑会导致scipy在无效区间采样,样本分布自然不匹配。
  2. 参数传递与类定义不规范:自定义分布未明确声明参数名称,且beta变量未显式定义(你的PDF中beta=0.5)。

修正后的代码实现

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import rv_continuous

class exp_pdf(rv_continuous):
    def _get_support(self, a):
        # 支撑区间随参数a变化,x >= a
        return (a, float('inf'))
    
    def _pdf(self, x, a):
        beta = 0.5
        # 对x < a的情况返回0,确保PDF在支撑外为0
        return np.where(x >= a, beta * np.exp(-beta * (x - a)), 0.0)
    
    def _cdf(self, x, a):
        beta = 0.5
        # 实现CDF让scipy能正确计算逆变换采样
        return np.where(x >= a, 1 - np.exp(-beta * (x - a)), 0.0)

# 测试参数a=1
param_temp = 1
exp_dist = exp_pdf(name='Custom Exponential')

# 绘制PDF
points = np.linspace(1, 10, 100)
plt.plot(points, exp_dist.pdf(points, a=param_temp), 'r-', lw=2, label='PDF')

# 生成样本并绘制直方图
samples = exp_dist.rvs(size=1000, a=param_temp)
plt.hist(samples, bins=30, density=True, alpha=0.7, label='Samples')

plt.legend()
plt.show()

关键修正说明

  • 支撑区间修正:_get_support方法接收参数a,返回(a, inf),明确告诉scipy采样的有效范围。
  • 显式定义beta:将PDF中的固定系数0.5显式赋值给beta,避免未定义变量错误。
  • 实现CDF方法:手动实现累积分布函数,让scipy可以通过逆CDF方法高效生成样本,避免数值采样的偏差。
  • 参数名称统一:使用a作为参数名,与类初始化、方法调用时的参数保持一致,避免混淆。

验证效果

运行修正后的代码,直方图会与PDF完全匹配:样本集中在x >= 1的区间,分布形状和理论PDF一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:08:36