目前,我想要生成一些样本,以获得期望和方差。
给定概率密度函数: f(x) = {2x,0 <= x <= 1;否则0}
我已经发现E(X) = 2/3,Var(X) = 1/18,我的详细解来自这里https://math.stackexchange.com/questions/4430163/simulating-expectation-of-continuous-random-variable
但是,下面是我在模拟使用python时所拥有的内容:
import numpy as np
N = 100_000
X = np.random.uniform(size=N, low=0, high=1)
Y = [2*x for x in X]
np.mean(Y) # 1.00221 <- not equal to 2/3
np.var(Y) # 0.3323 <- not equal to 1/18我在这里做错什么了?谢谢你的进阶。
发布于 2022-04-19 11:44:35
为了逼近x某些函数的积分,例如,g(x),在S = [0, 1]上,使用蒙特卡罗模拟,您
N中生成[0, 1]随机数(即从均匀分布的U[0, 1]中提取)g(x_i)在i = 1到i = N上的算术平均值,其中x_i是i的第四个随机数:即(1 / N)乘以i = 1到i = N的g(x_i)之和。第二步的结果是积分的逼近。
具有pdf f(x)和可能值集的连续随机变量S的期望值是x * f(x)在S上的积分。X的方差是X-squared的期望值减去X期望值的平方。
S = [0, 1]上x * f(x)的积分(即X的期望值),设置g(x) = x * f(x)并应用上述方法。S = [0, 1]上(x * x) * f(x)的积分(即X-squared的期望值),设置g(x) = (x * x) * f(x)并应用上述方法。用X期望值的平方减去这一结果,得到方差的X估计。调整您的方法:
import numpy as np
N = 100_000
X = np.random.uniform(size = N, low = 0, high = 1)
Y = [x * (2 * x) for x in X]
E = [(x * x) * (2 * x) for x in X]
# mean
print((a := np.mean(Y)))
# variance
print(np.mean(E) - a * a) 输出
0.6662016482614397
0.05554821798023696与其创建Y和E列表,更好的方法是
Y = X * (2 * X)
E = (X * X) * (2 * X)在本例中,Y、E是numpy数组。这种方法使更有效地提高了的效率。尝试制作N = 100_000_000并比较这两种方法的执行时间。第二个应该要快得多。
https://stackoverflow.com/questions/71924127
复制相似问题