为给定的 cdf 生成随机值

Generating random value for given cdf

根据随机变量值的样本,我使用核密度估计创建了累积密度函数。

cdf = gaussian_kde(sample)

我需要的是生成随机变量的样本值,其密度函数等于构造的cdf。我知道反概率分布函数的方法,但由于我无法分析地进行,因此需要相当复杂的准备工作。是否有集成解决方案或其他方法来完成任务?

如果您使用的是具有高斯核的核密度估计器 (KDE),则您的密度估计是高斯混合模型。这意味着密度函数是 'mixture components' 的加权和,其中每个混合分量都是高斯分布。在典型的 KDE 中,有一个以每个数据点为中心的混合组件,每个组件都是内核的一个副本。无需使用逆 CDF 方法即可轻松对该分布进行采样。该过程如下所示:

  1. 设置

    • mu 为一个向量,其中 mu[i] 是混合分量 i 的平均值。在 KDE 中,这只是原始数据点的位置
    • sigma为一个向量,其中sigma[i]是混合成分i的标准差。在典型的 KDE 中,这将是内核带宽,为所有点共享(但确实存在可变带宽变体)。
    • w为一个向量,其中w[i]包含混合分量i的权重。权重必须为正且总和为 1。在典型的未加权 KDE 中,所有权重均为 1/(number of data points)(但确实存在加权变体)。
  2. 选择要采样的随机点数,n_total

  3. 确定将从每个混合成分中抽取多少点。

    • n 为向量,其中 n[i] 包含要从混合分量 i 中采样的点数。
    • 从 "number of trials" 等于 n_total 且 "success probabilities" 等于 w 的多项分布中得出 n。这意味着将从每个混合成分中抽取的点数随机选择,与成分权重成正比。
  4. 绘制随机值

    • 对于每个混合成分 i:
    • 从均值 mu[i] 和标准差 sigma[i]
    • 的正态分布中得出 n[i] 个值
  5. 打乱随机值列表,使它们具有随机顺序。

此过程相对简单,因为用于多项式和正态分布的随机数生成器 (RNG) 随处可见。如果您的内核不是高斯分布而是其他一些概率分布,您可以复制此策略,将步骤 4 中的正常 RNG 替换为该分布的 RNG(如果可用)。您还可以使用此过程从一般的混合模型中采样,而不仅仅是 KDE。