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

Python 如何从给定的任意概率密度函数生成iid样本,python,random,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)

我需要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)
的函数定义。我想知道我的方法是正确的还是遗漏了一点。

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

  • 生成0到1之间的N个随机数
  • 根据给定函数计算每个数字的概率
  • 重新缩放解决方案,使该函数的积分为1
  • 从“生成的”pdf中提取N个数字
你这样做的方式绝对符合概率密度函数的标准,你的解决方案应该是正确的,但可以通过使用等距数字计算pdf来改进它

linspace(start,stop,N)在start和stop之间生成N个等距数字。()

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

编辑:pdf也有一个要求,概率必须是正的,所以应该有一些机制来避免负的
x的函数值在[0,1]范围内。

谢谢,但是我和你从N个数字中画出N个数字,我认为总体肯定比N大得多。我不这么认为,只要你同意它是一个离散的PDF,它就不重要了。你可以掷一个六面骰子20次,而不需要20+个不同的结果。如果你真的想要一个连续的pdf,你必须以不同的方式重新缩放它。我现在看到的唯一问题是,你可以有负的“v”,这应该得到处理,因为这在pdf中是不可能发生的。