【发布时间】:2014-02-22 13:46:08
【问题描述】:
我正在尝试编写代码来生成图书馆中不同书籍数量的置信区间(以及生成信息图)。
我表弟上小学,他的老师每周都会给我一本书。然后,他阅读并及时归还,以便下周再获得一份。过了一段时间,我们开始注意到他收到了他以前读过的书,随着时间的推移,这种情况逐渐变得越来越普遍。
假设图书馆的真实图书数量为 N,老师每周随机(有替换)统一挑选一本给你。如果在第 t 周,你收到一本你读过的书的次数是 x,那么我可以对 https://math.stackexchange.com/questions/615464/how-many-books-are-in-a-library 之后图书馆中的书数进行最大似然估计。
示例:假设图书馆有五本书 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 给出的答案目前没有正确执行此操作。
【问题讨论】:
-
您应该在
numberrepeats中设置一个种子,这样每个 N 都会使用相同的随机样本。 -
python-for-signal-processing.blogspot.co.uk/2012/10/… 看起来很相关,尽管我还没有设法完成它。
-
您的问题描述的问题与您在脚本中实际实现的问题非常不同。只有通过链接到您的 math.stackexchange.com 问题,我才能找出您的真正意思。您应该考虑重写您的问题以反映 math.stackexchange.com 上的评论讨论。短语“如果在第 t 周您收到一本书,您在 x 次之前阅读过”向我暗示您必须收到 相同本书 'x' 次,但显然情况并非如此.
-
@hunse 谢谢。添加说明。是不是更清楚了?
-
是的,有问题的短语现在更清晰了。为了清楚起见,我还修改了示例。
标签: python numpy statistics scipy statsmodels