【发布时间】:2019-09-10 09:41:58
【问题描述】:
我对生成连续随机变量的拒绝方法的优化有疑问。我有一个密度:f(x) = 3/2 (1-x^2)。这是我的代码:
import random
import matplotlib.pyplot as plt
import numpy as np
import time
import scipy.stats as ss
a=0 # xmin
b=1 # xmax
m=3/2 # ymax
variables = [] #list for variables
def f(x):
return 3/2 * (1 - x**2) #probability density function
reject = 0 # number of rejections
start = time.time()
while len(variables) < 100000: #I want to generate 100 000 variables
u1 = random.uniform(a,b)
u2 = random.uniform(0,m)
if u2 <= f(u1):
variables.append(u1)
else:
reject +=1
end = time.time()
print("Time: ", end-start)
print("Rejection: ", reject)
x = np.linspace(a,b,1000)
plt.hist(variables,50, density=1)
plt.plot(x, f(x))
plt.show()
ss.probplot(variables, plot=plt)
plt.show()
我的第一个问题:我的概率图是否正确? 第二,标题中的内容。如何优化该方法?我想得到一些建议来优化代码。现在该代码大约需要 0.5 秒,并且大约有 50 000 次拒绝。是否可以减少拒绝的时间和次数?如果需要,我可以使用不同的生成变量的方法进行优化。
【问题讨论】:
标签: python optimization random plot probability