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

2024-05-11 14:45:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要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)的函数定义,它可以接受任意函数。我想知道我的方法是正确的还是漏掉了一点


Tags: sample函数importnumpy示例returnpdfdef
1条回答
网友
1楼 · 发布于 2024-05-11 14:45:40

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

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

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

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的函数值

相关问题 更多 >