繁体   English   中英

如何从给定的任意概率密度函数生成 iid 样本

[英]How to generate iid sample from a given arbitrary probability density function

我想要 python 中的函数randgen(f, N)从给定的 pdf 生成 N 个样本。

这是我写的:

import numpy as np
import matplotlib.pyplot as plt

def randgen(f,N, M=1):
    sample = M*np.random.random(N)
    y=[]
    sum = 0
    for x in sample:
      v = f(x);
      sum+=v;
      y.append(v)
    y = y/sum;
    return np.random.choice(sample, p=y, size=N)

def pp(x):
  return x**2

z = randgen(pp, 2000)
plt.hist(z)

它为函数y=x^2生成以下直方图。 它似乎工作。

在此处输入图片说明

我见过类似的问题,但没有明确参考randgen(f,N)的函数定义randgen(f,N)它可以采用任意函数。 我想知道我的方法是正确的还是我错过了一点。

好的,解压您的解决方案:

  • 生成 0 到 1 之间的 N 个随机数
  • 根据给定的函数计算每个数字的概率
  • 重新调整您的解决方案,使该函数的积分为 1
  • 从“生成的”pdf 中抽取 N 个数字

你这样做的方式绝对满足概率密度函数的标准,你的解决方案应该是正确的,但可以通过使用均匀间隔的数字来计算你的 pdf 来改进它。

numpy.linspace(start,stop,N) 在 start 和 stop 之间产生 N 个均匀间隔的数字。 https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html

如果您应用我建议的添加而不是您的解决方案,则您的解决方案适用于离散 pdf
样本 = M*np.random.random(N)
样本 = np.linspace(开始,停止,N)

编辑:pdf 也有一个要求,即概率必须为正,因此应该包含一些机制来避免范围 [0,1] 内 x 的负函数值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM