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

时间:2019-12-09 09:39:19

标签: python random

我希望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生成以下直方图。看来可行。

enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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