我正在尝试编写代码来生成图书馆中不同书籍数量的置信区间(以及生成信息图)。
我表弟上小学,他的老师每周都会给我一本书。然后,他阅读并及时归还,以便下周再获得一份。过了一段时间,我们开始注意到他收到了他以前读过的书,随着时间的推移,这种情况逐渐变得越来越普遍。
假设图书馆的真实书籍数量为 N,老师每周随机(有替换)随机挑选一本给你。如果在第 t 周,您收到一本书的次数是 x,那么我可以按照https://math.stackexchange.com/questions/对图书馆中的图书数量进行最大似然估计615464/图书馆中有多少书。
示例:考虑一个有五本书 A、B、C、D 和 E 的图书馆。如果您连续七周收到书 [A、B、A、C、B、B、D],那么 x 的值(重复次数)将在这些周之后的每一周之后为 [0, 0, 1, 1, 2, 3, 3],这意味着七周后,您收到了一本您已经读过三遍的书。
为了可视化似然函数(假设我已经理解了一个是正确的),我编写了以下代码,我相信它可以绘制似然函数。最大值约为 135,这确实是根据上面的 MSE 链接的最大似然估计。
from __future__ import division
import random
import matplotlib.pyplot as plt
import numpy as np
#N is the true number of books. t is the number of weeks.unk is the true number of repeats found
t = 30
unk = 3
def numberrepeats(N, t):
return t - len(set([random.randint(0,N) for i in xrange(t)]))
iters = 1000
ydata = []
for N in xrange(10,500):
sampledunk = [numberrepeats(N,t) for i in xrange(iters)].count(unk)
ydata.append(sampledunk/iters)
print "MLE is", np.argmax(ydata)
xdata = range(10, 500)
print len(xdata), len(ydata)
plt.plot(xdata,ydata)
plt.show()
输出看起来像
我的问题是:
- 有没有一种简单的方法来获得 95% 的置信区间并将其绘制在图表上?
- 如何在绘图上叠加平滑曲线?
- 有没有更好的方法来编写我的代码?它不是很优雅,也很慢。
找到 95% 置信区间意味着找到 x 轴的范围,以便我们通过抽样得到的经验最大似然估计(在这个例子中理论上应该是 135)有 95% 的时间落在其中。@mbatchkarov 给出的答案目前没有正确执行此操作。