python – 使用scipy.stats.hypergeom从SciPy的甲板上绘制卡片

我无法理解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)
上一篇:leetcode 576. Out of Boundary Paths 、688. Knight Probability in Chessboard


下一篇:《Probability for Data Science-Chapter_24》翻译