分段型随机变量模拟问询:可否通过U(0,1)实现模拟?
分段型随机变量的均匀分布模拟方法解答
当然可以!这其实就是咱们常用的逆变换采样法的典型场景,完美适配你这种分段定义CDF的随机变量模拟需求~
核心逻辑回顾
逆变换采样的核心思路很简单:如果我们能生成一个服从 $U(0,1)$ 的均匀随机变量 $U$,只要找到目标分布累积分布函数 $F(x)$ 的反函数 $F^{-1}(u)$,那么 $X = F^{-1}(U)$ 就会严格服从我们想要的目标分布。
针对你给出的分布的具体推导
你的目标分布CDF是分段定义的,我们需要分别对两个区间求反函数:
当 $u \in [0, 0.5]$ 时(对应原变量 $x \in [-1,0]$):
此时CDF为 $F(x) = \frac{x^2}{2} + x + 0.5$,解方程 $u = \frac{x^2}{2} + x + 0.5$,整理后用求根公式可得:
$$x = -1 + \sqrt{2u}$$
(舍去了不符合区间的负根,因为x要落在[-1,0])当 $u \in (0.5, 1]$ 时(对应原变量 $x \in (0,1]$):
此时CDF为 $F(x) = -\frac{x^2}{2} + x + 0.5$,解方程 $u = -\frac{x^2}{2} + x + 0.5$,整理后求根可得:
$$x = 1 - \sqrt{2(1 - u)}$$
(同样舍去了不符合区间的正根,因为x要落在(0,1])
模拟步骤(附Python实现示例)
- 第一步:生成若干个 $U(0,1)$ 均匀随机数
- 第二步:根据每个随机数的区间,选择对应的反函数计算目标变量值
- 第三步:得到的结果就是服从目标分布的样本
示例代码:
import numpy as np def simulate_target_distribution(n_samples): # 生成均匀分布样本 u_samples = np.random.uniform(low=0, high=1, size=n_samples) target_samples = np.zeros_like(u_samples) # 处理第一个区间的样本 lower_mask = u_samples <= 0.5 target_samples[lower_mask] = -1 + np.sqrt(2 * u_samples[lower_mask]) # 处理第二个区间的样本 upper_mask = u_samples > 0.5 target_samples[upper_mask] = 1 - np.sqrt(2 * (1 - u_samples[upper_mask])) return target_samples # 测试生成1000个样本 samples = simulate_target_distribution(1000)
你可以验证一下,比如当u=0时得到x=-1,u=0.5时得到x=0,u=1时得到x=1,完全符合CDF的边界特征,模拟出来的样本也会和目标分布的PDF匹配~
内容的提问来源于stack exchange,提问作者papasmurfete
相关产品推荐
相关产品推荐

