gpt4 book ai didi

python - 使用 scipy.stats.hypergeom 从 SciPy 中的牌组绘制卡片

转载 作者:太空狗 更新时间:2023-10-30 01:03:07 26 4
gpt4 key购买 nike

我无法理解 the documentation对于 SciPy 的 scipy.stats.hypergeom 函数。在我的程序中,我考虑了各种纸牌并尝试找出各种抽奖的概率。 hypergeom 类似乎正是这个,但它的文档假设了一堆我没有的术语知识。谷歌搜索将我带到了维基百科和 Wolfram MathWorld,它们都假设如果您要问这类事情,您已经阅读了从该死的数学原理开始的所有内容,只需要稍微复习一下 -所以他们实际上并没有帮助。因为这个问题是“我如何将这个特定的代码块应用到我的问题中?”我在问 Stack Overflow。

我有一个问题,形式是“如果你有一副 N 张牌,其中 M 是你感兴趣的牌,那么在至少 1 张感兴趣的卡片在前 Q 卡片中?”我还有一个问题,形式是“如果你有一副 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

编辑2:

实际上,这提供了另一种编写 pick_Q 函数的方法——“挑选 1 张或更多已标记的牌”可以改写为“挑选超过 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)

关于python - 使用 scipy.stats.hypergeom 从 SciPy 中的牌组绘制卡片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11286430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com