【问题标题】:Statistics: Optimizing probability calculations within python统计:优化 python 中的概率计算
【发布时间】:2015-01-14 19:29:57
【问题描述】:

设置:

这个问题是经典概率问题的复杂形式:

70 colored balls are placed in an urn, 10 for each of the seven rainbow colors.

What is the expected number of distinct colors in 20 randomly picked balls?

我的解决方案是python的itertools库: combos = itertools.combinations(urn, 20), print sum([1 for x in combos]) (其中 urn 是 urn 中 70 个球的列表)。

我可以将迭代器解压到combinations(urn, 8) 的长度,而我的计算机无法处理它。

注意:我知道这不会给我答案,这只是我脚本中的障碍,换句话说,如果这有效,我的脚本就会有效。

问题:如果没有世界上最快的超级计算机,我怎样才能准确地找到预期的颜色?我的方法在计算上是否可行?

【问题讨论】:

  • projecteuler.net/problem=493 ?如果是这样,我们可以添加[project-euler] 标签。 (蛮力往往不适用于更高的 PE 问题 - 你需要一个数学/组合解决方案)。
  • 我没有在标签上的唯一原因是由于标签描述:“不要使用这个标签 Project Euler 是一个不同难度的数学规划问题的集合。”
  • 啊 - 我上次检查时没有那个...我猜你不使用它是对的。
  • 不要解压,迭代。
  • 有一个基于将计数重写为总和,然后使用期望线性度的单行数学解决方案。

标签: python math statistics probability


【解决方案1】:

由于有几个人要求查看数学解决方案,我会给出它。这是欧拉计划问题之一,可以用铅笔和纸在合理的时间内完成。答案是

7(1 - (60 choose 20)/(70 choose 20))

为了得到这个写X,存在的颜色计数,作为总和X0+X1+X2+...+X6,如果第i种颜色存在,则Xi​​为1,如果不存在,则为0。

E(X) 
= E(X0+X1+...+X6) 
= E(X0) + E(X1) + ... + E(X6)        by linearity of expectation
= 7E(X0)                             by symmetry
= 7 * probability that a particular color is present
= 7 * (1- probability that a particular color is absent)
= 7 * (1 - (# ways to pick 20 avoiding a color)/(# ways to pick 20))
= 7 * (1 - (60 choose 20)/(70 choose 20))

Expectation is always linear. 所以,当你被要求找出某个随机量的平均值时,尝试将这个量重写为更简单的部分(例如指标 (0-1) 随机变量)的总和通常会有所帮助。


这并没有说明如何使 OP 的方法发挥作用。尽管有一个直接的数学解决方案,但最好知道如何以有条理且可行的方式遍历案例。如果您接下来想要一个比计数更复杂的颜色集功能,这可能会有所帮助。 Duffymo 的回答提出了一些我会更明确的建议:

您可以将 70 个调用中的 20 个调用分解为按颜色计数索引的类别。例如,索引 (5,5,10,0,0,0,0) 表示我们画了第一种颜色的 5 个,第二种颜色的 5 个,第三种颜色的 10 个,其他颜色都没有。

可能的索引集包含在总和为 20 的非负整数的 7 元组的集合中。其中一些是不可能的,例如问题的 (11,9,0,0,0,0,0)假设每种颜色只有 10 个球,但我们可以处理。加起来为 20 的非负数的 7 元组的集合大小为 (26 选择 6)=230230,并且它有一个natural correspondence,其方式为在 26 个空间中选择 6 个分隔符作为分隔符或对象。因此,如果您有 a way to iterate through the 6 element subsets of a 26 element set,您可以将它们转换为遍历所有索引。

您仍然需要通过计算从 70 个球中抽出 20 个球的方式来计算箱子的重量,才能得到箱子。 (a0,a1,a2,...,a6) 的权重为 (10 选择 a0)(10 选择 a1)...*(10 选择 a6)。这可以优雅地处理不可能索引的情况,因为 10 选择 11 为 0,所以乘积为 0。

因此,如果您不知道期望线性度的数学解决方案,您可以遍历 230230 个案例并计算索引向量的非零坐标数的加权平均值,由小二项式的乘积加权条款。

【讨论】:

  • 感谢道格拉斯提供的清晰解决方案。您的原始评论促使我用电子表格解决了这个问题,所以我对阅读您的解决方案并不感到难过。
  • 非常高质量的答案道格拉斯
【解决方案2】:

【讨论】:

  • 不,我相信您说的是星条法,用于计算选择方式的数量,例如 7 个类别中的 20 个无序对象。然而,当你从一个瓮中取出 20 个物体,每种颜色各有 10 个时,这些概率并不相同。一个颜色不能得到11个,前两种颜色只有一个方法可以得到10个,但是(10选5)*(10选5)个方法得到第一个颜色的10个,然后是5个第二种和第三种颜色。
  • 我不知道星条法是什么。该链接给出了我想到的公式。
  • 星条法是您提供的链接中所谓的“重复组合”的标准名称。 en.wikipedia.org/wiki/Stars_and_bars_%28combinatorics%29我不知道你是如何从那个到这个问题中要求的概率的。您的链接中的哪个公式是什么意思?将 20 个对象划分为 7 个类别的方法数不相关。
  • 也许不是完美的答案,但它应该是适用的。我意识到每种颜色只有 10 个,所以用户是从包里画的,没有替换。我认为做一些简单的事情然后再改进是有价值的。
  • 这不是一个界限,因为两个方向都有错误。您可以做的是遍历 26 个选择 6 个案例,并通过某个概率对它们进行加权,对于不可能的案例,这些概率将为 0。该概率的计算比原始问题更复杂,但也许这次迭代正是 OP 想要的。
【解决方案3】:
  • 制作一个瓮,每种颜色各 10 个。
  • 确定所需的试验次数。
  • 制作一个容器来保存每次试验的结果
  • 对于每次试验,从骨灰盒中随机抽取 20 个物品,制作一组这些物品,并将该组的长度添加到结果中。
  • 求结果的平均值

【讨论】:

  • 您建议进行多少次随机试验才能获得所需的 10^-9 精度?对我来说看起来大约是 10^18 次试验,所以我认为应该使用另一种方法。
  • @DouglasZare 我没有看到问题中的准确性要求 - 这有点过分了。
  • @DouglasZare 出于好奇,您是如何计算达到给定准确度所需的试验次数的?
  • @rubik:您希望获得 1/n 的准确度,对于一些 c 需要大约 cn^2 次试验。我通过简化假设指标变量(对于每种颜色的存在)是独立的来估计 c 的值(大致为 1)。一个独立随机变量之和的方差是方差之和,所以这个独立性假设使得计数的方差计算变得简单,7p(1-p) 其中 p 为 0.974,每种颜色被包含的概率.标准差是 7p(1-p) 的平方根,0.42,足够接近 1/2 或 1。
  • 您可以通过与尽可能反相关的指标总和进行比较,从独立假设对标准差计算的重要性来确定误差的重要性。这没什么大不了的。我们假设相关性为 0,实际相关性是一个很小的负数,将其设为负数会产生另一个易于分析的随机变量,其标准差为 0.43。
猜你喜欢
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多