【问题标题】:Skewed random sample from Numpy random generator sample (numpy.random.Generator.choice)来自 Numpy 随机生成器样本的偏斜随机样本 (numpy.random.Generator.choice)
【发布时间】:2020-09-08 02:15:47
【问题描述】:

我制作了一段 Python 来生成正态分布的混合,我想从中采样。结果是我的概率密度函数,我希望样本能够代表原始分布。 所以我开发了创建pdf的功能:

def gaussian_pdf(amplitude, mean, std, sample_int):
    coeff = (amplitude / std) / np.sqrt(2 * np.pi)
    if len(amplitude > 1):
        # create mixture distribution
        # get distribution support
        absciss_array = np.linspace(np.min(mean) - 4 * std[np.argmin(mean)],
                                    np.max(mean) + 4 * std[np.argmax(mean)],
                                    sample_int)
        normal_array = np.zeros(len(absciss_array))
        for index in range(0, len(amplitude)):
            normal_array += coeff[index] * np.exp(-((absciss_array - mean[index]) / std[index]) ** 2)
    else:
        # create simple gaussian distribution
        absciss_array = np.linspace(mean - 4*std, mean + 4*std, sample_int)
        normal_array = coeff * np.exp(-((absciss_array - mean) / 2*std) ** 2)

    return np.ascontiguousarray(normal_array / np.sum(normal_array))

我已经用脚本的 main 部分测试了一个采样:

def main():
    amplitude = np.asarray([1, 2, 1])
    mean = np.asarray([0.5, 1, 2.5])
    std = np.asarray([0.1, 0.2, 0.3])
    no_sample = 10000

    # create mixture gaussian array
    gaussian_array = gaussian_pdf(amplitude, mean, std, no_sample)

    # pot data
    fig, ax = plt.subplots()
    absciss = np.linspace(np.min(gaussian_array), np.max(gaussian_array), no_sample)
    ax.plot(absciss, gaussian_array)

    # create random generator to sample from distribution
    rng = np.random.default_rng(424242)
    # sample from distribution
    sample = rng.choice(a=gaussian_array, size=100, replace=True, p=gaussian_array)
    # plot results
    ax.plot(sample, np.full_like(sample, -0.00001), '|k', markeredgewidth=1)

    plt.show()

    return None

然后我就有了结果:

您可以用黑线看到从分布中提取的样本。问题是,即使我指定在 numpy 函数中使用概率数组,采样也会偏向分布的末尾。我用其他种子尝试了几次,但结果没有改变...... 我希望在概率密度更大的区域有更多的样本......

有人可以帮帮我吗?我在这里错过了什么吗? 提前致谢。

【问题讨论】:

  • 你不应该通过a 中的sample = rng.choice(a=gaussian_array, size=100, replace=True, p=gaussian_array) 中的点的均匀分布吗?例如,absciss,在您的代码中?
  • 文档似乎没有暗示它numpy.random.Generator.choice。据我了解,只要是 array like 参数,您几乎可以传递您喜欢的所有内容。
  • 我明白;我是说你需要传递一组均匀间隔的值来获得你想要的结果。
  • 没错...我错过了操作的核心原理中的一点。非常感谢您说清楚!

标签: python-3.x numpy random random-seed probability-density


【解决方案1】:

其实答案是使用均匀分布进行抽样。感谢@amzon-ex 指出。 代码是:

absciss = np.linspace(np.min(gaussian_array), np.max(gaussian_array), no_sample)
sample_other = rng.choice(a=absciss, size=100, replace=True, p=gaussian_array)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多