如何在网格上计算复合函数?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
相关产品推荐
相关产品推荐

