Python 如何从给定的任意概率密度函数生成iid样本
我需要python中的函数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)
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 样本=M*np.random.random(N)
示例=np.linspace(开始、停止、N) 编辑:pdf也有一个要求,概率必须是正的,所以应该有一些机制来避免负的
x的函数值在[0,1]范围内。谢谢,但是我和你从N个数字中画出N个数字,我认为总体肯定比N大得多。我不这么认为,只要你同意它是一个离散的PDF,它就不重要了。你可以掷一个六面骰子20次,而不需要20+个不同的结果。如果你真的想要一个连续的pdf,你必须以不同的方式重新缩放它。我现在看到的唯一问题是,你可以有负的“v”,这应该得到处理,因为这在pdf中是不可能发生的。