我必须模拟超指数分布。我创建了这个模拟它的函数,并将结果存储在用作直方图的字典中。然后它将直方图保存为CSV文件,以便在电子表格(如Excel)中查看。它还返回直方图。
import numpy as np
def simulate_hyper_exponential_distribution(p=0.617066, lambda1=0.051, lambda2=0.052, iterations=10 ** 5):
n = 0 # type: int
histogram = {} # type: dict[float, int]
for n in xrange(0, iterations):
lambda_used = lambda1
if np.random.uniform() >= p:
lambda_used = lambda2
random = float(round(np.random.exponential(1. / lambda_used), 1))
if random not in histogram:
histogram[random] = 1
else:
histogram[random] += 1
if sum(histogram.values()) != iterations:
print "Error!"
return
file = open('C:\\Users\\SteveB\\Desktop\\test_histogram.csv', 'w')
max_histogram_key = max(histogram.keys()) + 0.1 # type: int
# I think the error is in this for
for current in np.arange(0, max_histogram_key, 0.1):
if float(current) in histogram: # I think this is the line that fails
file.write(str(current) + ',' + str(histogram[current]) + '\n')
else:
file.write(str(current) + ',0\n')
file.close()
print 'Finished!'
return histogram
我用这一行来运行它:
histogram = simulate_hyper_exponential_distribution(0.617066, 0.051, 0.052)
我的问题是生成的CVS文件在0中有某些值,我知道这些值没有0.最有趣的是,通过不同的执行,相同的值是文件中的错误值(即0.3,0.6,0.7,1.2,1.4,1.7,1.9,2.3,2.4)。我输入histogram[0.3]
(或任何以前列出的值),我得到一个不同于0的值。
现在我将键值乘以10并在字典中存储为int,之后,当在文件中写入此值时,将其除以10,这种方法有效。我不知道使用浮点值时问题出在哪里。谢谢你的帮助。