Python中未知曲线方程时,如何获取累积分布对应Y分段的X值?
正确实现Y轴等分下的X轴分段方法
你的核心问题是混淆了torch.quantile的输入对象,或者对CDF与分位数的对应关系理解有误。以下分两种场景给出正确实现:
场景1:你拥有X的样本数据
如果手上是从目标分布中采样得到的X样本(比如批量X值),直接对X样本求对应Y分位点的分位数即可:
- 定义Y轴的等分分段点(5段需要6个分界点,对应累积概率0到1,步长0.2)
- 用
torch.quantile计算X样本在这些概率点上的分位数,结果就是对应的X轴分段点
import torch # 替换成你的真实X样本数据 x_samples = torch.normal(mean=5.0, std=2.0, size=(10000,)) # Y轴等分成5段的概率分界点 y_quantiles = torch.tensor([0.0, 0.2, 0.4, 0.6, 0.8, 1.0]) # 计算对应的X轴分段点 x_segments = torch.quantile(x_samples, y_quantiles)
注意:这里得到的x_segments直接是X轴的原始范围值,不需要再乘以X轴范围,除非你的X样本已经被归一化到0-1区间。
场景2:你已经有CDF的离散曲线数据
如果手上是一组(x_i, cdf_i)的离散点(x_i是X轴值,cdf_i是对应累积概率),需要用插值法找到Y等分点对应的X值:
- 确保
cdf_i是单调递增的(符合CDF的固有性质) - 用
torch.interp根据Y的等分点,在CDF曲线上插值得到对应的X值
import torch # 替换成你的真实CDF离散数据 x_values = torch.linspace(0, 10, 100) # X轴离散点 cdf_values = torch.distributions.Normal(5.0, 2.0).cdf(x_values) # 对应累积概率 # Y轴等分成5段的概率分界点 y_quantiles = torch.tensor([0.0, 0.2, 0.4, 0.6, 0.8, 1.0]) # 插值得到X轴分段点 x_segments = torch.interp(y_quantiles, cdf_values, x_values)
你原方法的错误原因
- 若你把CDF的累积概率值(Y值)传给了
torch.quantile的第一个参数,这完全错误——torch.quantile的输入是X的样本集合,不是CDF的Y值。 - 若你对X样本做了归一化后又重复乘以X范围,会导致结果偏离真实值。
内容的提问来源于stack exchange,提问作者Shanaka Ramesh
相关产品推荐
相关产品推荐

