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

如何从自定义经验CDF抽样?两种方法及工具问询

从给定CDF抽取样本的两种方法实现

你定义的CDF数据如下:

import pandas as pd
cdf = pd.DataFrame.from_dict({'x':[10e6,20e6,50e6,100e6,250e6],'cdf':[0.4,0.6,0.7,0.8,1]})

方法1:无平滑的直接抽样

你提到可以手动通过均匀分布抽样实现,核心逻辑就是逆变换抽样的离散版本:

  • 从[0,1]的均匀分布生成10000个随机数u
  • 对每个u,找到CDF中第一个大于等于u的x值作为样本,用pd.cut或手动遍历都能实现。

方法2:带平滑的抽样(样条插值)

要在CDF点间做平滑,本质是先对CDF的逆函数(分位数函数)做插值,再用逆变换抽样。Python里有现成工具可以实现:

用Scipy的单调插值工具

Scipy的PchipInterpolator是首选,它能保证插值后的CDF单调递增(符合分布函数的核心性质),不会出现曲线下降的不合理情况:

import numpy as np
from scipy.interpolate import PchipInterpolator

# 基于现有CDF点构建单调插值的逆函数(输入CDF值,输出对应x)
cdf_interp = PchipInterpolator(cdf['cdf'], cdf['x'])

# 生成10000个均匀分布随机数
u = np.random.uniform(0, 1, 10000)
# 通过插值函数得到平滑后的样本
samples_smoothed = cdf_interp(u)

用Scipy自定义连续分布

如果想更贴近统计分布的使用习惯,可以自定义一个分布类,把插值后的分位数函数整合进去,直接调用抽样方法:

from scipy.stats import rv_continuous

class CustomCDFDist(rv_continuous):
    def _ppf(self, q):
        # 实现分位数函数,用Pchip保证单调性
        return PchipInterpolator(cdf['cdf'], cdf['x'])(q)

# 初始化自定义分布
dist = CustomCDFDist()
# 抽取10000个样本
samples_smoothed = dist.rvs(size=10000)

总结

  • 无平滑抽样直接用离散逆变换即可
  • 带平滑的抽样用Scipy的PchipInterpolator是最可靠的方案,既能实现样条平滑,又能保证CDF的单调性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:47:16