使用张量流概率解决掷骰子和抛硬币问题,方差是错误的

我不是很精通统计学,我正在努力学习。所以请耐心等待。我在 Quora 中看到了这个问题 - 基本上说明了以下内容 -


如果结果是奇数,则掷出公平的骰子,然后掷 3 次公平的硬币。否则,如果结果是偶数,那么公平的硬币将被抛两次。在这两种情况下,头数都被计算在内。获得的#heads 的方差是多少?


我想使用 Python 和 tf-probability 来解决它。这是我所做的 -


import tensorflow as tf

import tensorflow_probability as tfp

import numpy as np

tf.enable_eager_execution()

probs = [1/6.] * 6


dices = tfp.distributions.Multinomial(total_count=1000, probs=probs)


n = dices.sample()


HEAD = 1

TAIL = 0

l = list(n.numpy())

heads_even = []

heads_odd = []

for i, nums in enumerate(l):

    mul_by = 3 if (i + 1) % 2 != 0 else 2

    tosses = tfp.distributions.Bernoulli(probs=0.5)

    coin_flip_data = tosses.sample(nums * mul_by)

    l2 = coin_flip_data.numpy()

    unique, counts = np.unique(l2, return_counts=True)

    head_tails = dict(zip(unique, counts))

    if (i + 1) % 2 != 0:

        heads_odd.append(head_tails[HEAD])

    else:

        heads_even.append(head_tails[HEAD])


total_heads = heads_odd + heads_even

final_nd_arr = np.array(total_heads)

print(final_nd_arr.var())

然而,这final_nd_arr.var()当然与实际答案相去甚远(它是 2089.805555555556),0.68(正如人们在 Quora 答案中提到的那样)。


我无法找出我做错了什么。我怎样才能纠正我的错误?


任何指针都会有所帮助。非常感谢。


- - - - - 编辑


为了提供更多数据,


dices.sample() => array([169., 173., 149., 171., 175., 163.], dtype=float32)

heads_odd => [266, 210, 259]

heads_even => [176, 167, 145]

total_heads => [266, 210, 259, 176, 167, 145]


沧海一幻觉
浏览 225回答 1
1回答

婷婷同学_

您正在计算错误分布的方差。我们正在寻找的方差适用于你反复掷骰子的实验,每次计算正面的数量,并计算正面数量的方差。您正在代码中执行此操作,但是您正在对所有掷骰子的正面总数求和,然后为每个可能的骰子结果计算这些总和的方差。这将给出正确的结果。我添加了一些评论,希望能澄清它:import tensorflow as tfimport tensorflow_probability as tfpimport numpy as nptf.enable_eager_execution()# Simulate the outcome of 1000 dice rollsprobs = [1/6.] * 6dices = tfp.distributions.Multinomial(total_count=1000, probs=probs)n = dices.sample()l = list(n.numpy().astype(int))L = []# Loop over 6 possible dice outcomesfor i in range(len(l)):    # Loop over the rolls for this dice outcome    for _ in range(l[i]):        # For each of the dice rolls,        # Flip a coin 2 or three times        num_tosses = 3 if (i + 1) % 2 != 0 else 2        tosses = tfp.distributions.Bernoulli(probs=0.5)        coin_flip_data = tosses.sample(num_tosses)        # And count the number of heads        num_heads = np.sum(coin_flip_data.numpy())        L += [num_heads]np.var(L)> 0.668999
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python