我无法理解SciPy的scipy.stats.hypergeom函数的the documentation.在我的程序中,我考虑各种卡片组并尝试找出各种抽奖的概率. hypergeom类似乎有这个,但它的文档假设我没有一堆术语知识.谷歌搜索引导我去*和沃尔夫勒姆MathWorld,两者都假设如果你问这种事情,你已经阅读了当时的Principia Mathematica的所有内容,只需要一点点复习 – 所以他们实际上并没有帮助.因为这个问题是“如何将这个特定的代码块应用于我的问题?”我问Stack Overflow.
我有一个问题形式“如果你有一副N张卡片,其中M张是感兴趣的卡片,那么在*Q卡中至少有1张感兴趣的卡片的可能性是多少?”我也有一个问题形式“如果你有一副N张卡片,其中M张是感兴趣的牌,你必须从牌组中抽出多少张牌才有90%的几率让其中一张牌成为副本感兴趣的卡?“前一个问题非常接近SciPy文档中给出的示例问题,但它不是一回事,方法列表对我来说都是行话 – 我实际上无法分辨出哪一个是我需要的.我也无法分辨出哪种方法可用于后一类问题.
scipy.stats.hypergeom的方法实际上做了什么,他们的论点是什么,以及如何将它们应用到我的问题中?假装我是一个中等聪明的高中生而不是数学博士候选人.
解决方法:
scipy.stats.hypergeom.pmf(k, M, n, N)
返回以下概率:从M卡中,其中n个被标记,如果您随机选择N卡而不进行替换,则将标记k卡.
所以你可以得到你想要的答案(使用你的变量名)
def pick_Q(N, M, Q):
"""
Given a deck of N cards, where M are marked,
and Q cards are taken randomly without replacement,
return the probability that at least one marked card is taken.
"""
return sum(scipy.stats.hypergeom.pmf(k, N, M, Q) for k in xrange(1,Q+1))
(标记1张卡的可能性总和,标记2张牌,标记3张牌……标记N张牌).
幸运的是,有一种更快的方法 – 至少有一张标记牌的概率是没有选择标记牌的概率的另一面.所以你可以这样做
def pick_Q(N, M, Q):
"""
Given a deck of N cards, where M are marked,
and Q cards are taken randomly without replacement,
return the probability that at least one marked card is taken.
"""
return 1. - scipy.stats.hypergeom.pmf(0, N, M, Q)
对于你的第二个问题,似乎没有任何功能可以做你想要的;但是,你可以从一开始
def how_many_to_pick(N, M, prob):
"""
Given a deck of N cards, M of which are marked,
how many do you have to pick randomly without replacement
to have at least prob probability of picking at least one marked card?
"""
for q in xrange(1, M+1):
if pick_Q(N, M, q) >= prob:
return q
raise ValueError("Could not find a value for q")
编辑:
scipy.stats.hypergeom.cdf(k, M, n, N)
给定一副M卡,其中n个被标记,随机选择N而不进行替换,找到k或更少标记卡被挑选的几率. (您可以将其视为.pmf的积分)
然后.sf(k,M,n,N)是.cdf的另一面 – 选择了超过k张标记牌的几率.
例如,
k pmf(k,52,13,4) cdf(k,52,13,4) sf(k,52,13,4)
(exactly k picked) ( <= k picked) ( > k picked)
--- ----------------- --------------- --------------
0 0.303817527 0.303817527 0.696182473
1 0.438847539 0.742665066 0.257334934
2 0.213493397 0.956158463 0.043841537
3 0.041200480 0.997358944 0.002641056
4 0.002641056 1.000000000 0.000000000
EDIT2:
实际上,这提供了另一种编写pick_Q功能的方法 – “挑选一张或多张标记的卡片”可以改为“挑选超过0张标记的卡片”,所以
def pick_Q(N, M, Q):
"""
Given a deck of N cards, where M are marked,
and Q cards are taken randomly without replacement,
return the probability that at least one marked card is taken.
"""
return scipy.stats.hypergeom.sf(0, N, M, Q)