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

如何不依赖scipy实现指数幂分布函数及随机数生成

指数幂分布无Scipy依赖实现方案

核心逻辑说明

你现有代码仅实现了单值的概率密度函数(PDF)计算,未包含随机数生成逻辑。这里采用逆变换采样法实现随机序列生成,不需要依赖Scipy的特殊接口,仅需numpy即可完成:

  • 指数幂分布的累积分布函数(CDF)可推导得到闭式解,逆变换过程无需特殊函数计算
  • 所有运算仅依赖基础对数、幂运算,兼容性强

完整实现代码

import numpy as np

def exponpow_pdf(x, b):
    """
    计算指数幂分布概率密度值
    参数:
        x: 输入值,支持单个数值或numpy数组
        b: 形状参数,必须大于0
    返回:
        对应x的PDF值
    """
    if b <= 0:
        raise ValueError("参数b必须大于0")
    x = np.asarray(x)
    # 仅x>=0时有值,其余位置返回0
    pdf = np.zeros_like(x, dtype=np.float64)
    valid_mask = x >= 0
    x_valid = x[valid_mask]
    xb = x_valid ** b
    pdf[valid_mask] = b * (x_valid ** (b-1)) * np.exp(1 + xb - np.exp(xb))
    return pdf

def exponpow_rvs(b, size=1):
    """
    生成符合指数幂分布的随机数序列
    参数:
        b: 形状参数,必须大于0
        size: 输出序列的形状,如1000、(100, 2)等
    返回:
        对应形状的随机数数组
    """
    if b <= 0:
        raise ValueError("参数b必须大于0")
    # 生成[0,1)均匀分布随机数
    u = np.random.uniform(0, 1, size=size)
    # 逆变换计算指数幂分布样本
    inner = 1 - np.log(1 - u)
    samples = np.log(inner) ** (1 / b)
    return samples

使用示例

# 生成b=2、长度1000的随机样本
samples = exponpow_rvs(b=2, size=1000)
# 计算对应点的PDF值
pdf_vals = exponpow_pdf(np.linspace(0, 2, 100), b=2)

注意事项

  • 输入参数b必须大于0,否则会触发报错
  • 若不需要numpy依赖,仅需生成单值随机数,可将numpy的函数替换为math库的对应实现,调整size逻辑即可

内容的提问来源于stack exchange,提问作者surviving-grad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:45:05