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

如何在网格上计算复合函数?Beta与均匀分布CDF转换绘图求助

搞定分位数匹配与图像绘制

嘿,我来帮你完成这个需求!首先咱们先理清楚核心逻辑:你要做的其实是概率积分变换——对于区间[2,6]上的Beta分布x,找到对应的Uniform(0,1)分布的y,满足CDFₓ(x) = CDFᵧ(y)。

因为Uniform(0,1)的CDF特别简单,就是CDFᵧ(y) = y(当y在0到1之间时),它的逆CDF就是它本身,所以说白了,y其实就是x对应的Beta分布的累积分布函数值,也就是y = CDFₓ(x)。

接下来我把你的现有代码扩展完善,不仅能画x的PDF,还能实现你要的x-y关系图,甚至可以验证变换后的y确实服从均匀分布:

完整可运行代码

import numpy as np
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from scipy.stats import beta, uniform

# 定义Beta分布参数:scipy的beta默认是[0,1]区间,我们要缩放至[2,6]
a, b = 2, 5
beta_loc = 2  # 分布起始点
beta_scale = 6 - 2  # 区间长度,用来缩放分布

# 生成覆盖[2,6]的x取值序列,足够密集让曲线平滑
x = np.linspace(2, 6, 1000)

# 计算x的PDF:先把x转成标准Beta的取值,再算PDF,最后除以scale保证密度归一
pdf_x = beta.pdf((x - beta_loc)/beta_scale, a, b) / beta_scale

# 计算对应的y:根据需求,y = CDF_y⁻¹(CDF_x(x)),而Uniform(0,1)的逆CDF就是自身,所以直接取CDF_x(x)
cdf_x = beta.cdf((x - beta_loc)/beta_scale, a, b)
y = cdf_x

# 创建绘图窗口,分成两个子图,同时展示PDF和x-y关系
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 第一个子图:绘制x的PDF
ax1.plot(x, pdf_x, label='Beta(2,5) PDF (缩放至[2,6])')
ax1.set_xlabel('x')
ax1.set_ylabel('概率密度')
ax1.set_title('缩放后Beta分布的PDF')
ax1.legend()
ax1.grid(alpha=0.3)  # 加个浅网格让图更清晰

# 第二个子图:绘制x与y的关系曲线
ax2.plot(x, y, color='#ff9900', label=r'$y = CDF_y^{-1}(CDF_x(x))$')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('分位数匹配:x vs y')
ax2.legend()
ax2.grid(alpha=0.3)

# 可选:验证变换后的y确实服从Uniform(0,1),画个直方图对比
fig2, ax3 = plt.subplots(figsize=(6, 4))
# 生成10000个x样本,计算对应的y
x_samples = beta.rvs(a, b, size=10000) * beta_scale + beta_loc
y_samples = beta.cdf((x_samples - beta_loc)/beta_scale, a, b)
# 画y的直方图(密度归一化)
ax3.hist(y_samples, bins=30, density=True, alpha=0.7, label='y的经验分布')
# 画Uniform(0,1)的PDF作为参考
y_uniform = np.linspace(0, 1, 100)
ax3.plot(y_uniform, uniform.pdf(y_uniform), color='#ff0000', label='Uniform(0,1)理论PDF')
ax3.set_xlabel('y')
ax3.set_ylabel('密度')
ax3.set_title('验证:y服从均匀分布')
ax3.legend()
ax3.grid(alpha=0.3)

# 调整子图间距,避免标签重叠
plt.tight_layout()
plt.show()

代码关键点说明

  • Beta分布的缩放:
    scipy自带的beta类默认是[0,1]区间的标准Beta分布,所以我们需要通过loc(起始点)和scale(区间长度)把它拉伸到[2,6]。计算PDF时要除以scale,这样才能保证整个区间的密度积分是1。

  • 分位数匹配的简化:
    因为Uniform(0,1)的CDF是F(y)=y,所以它的逆函数就是F⁻¹(u)=u,所以你要的CDF_y⁻¹(CDF_x(x))其实直接等于CDF_x(x),不用额外复杂计算。

  • 绘图细节:
    用linspace生成足够多的x点保证曲线平滑,加了网格和图例让图更易读;可选的验证图能直观看到变换后的y确实符合均匀分布,这是概率积分变换的经典性质。

运行后你会看到:

  • 第一个子图是左偏的Beta分布PDF(因为a=2 < b=5),区间严格在2到6之间
  • 第二个子图是一条从(2, 0)到(6, 1)的单调递增曲线,x越大,对应的y越接近1
  • 第三个验证图的直方图会和红色的均匀分布PDF几乎重合,证明咱们的计算是对的

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:43:24