为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

沧海一幻觉 2021-11-02 10:14:39
我不是很精通统计学,我正在努力学习。所以请耐心等待。我在 Quora 中看到了这个问题 - 基本上说明了以下内容 -如果结果是奇数,则掷出公平的骰子,然后掷 3 次公平的硬币。否则,如果结果是偶数,那么公平的硬币将被抛两次。在这两种情况下,头数都被计算在内。获得的#heads 的方差是多少?我想使用 Python 和 tf-probability 来解决它。这是我所做的 -import tensorflow as tfimport tensorflow_probability as tfpimport numpy as nptf.enable_eager_execution()probs = [1/6.] * 6dices = tfp.distributions.Multinomial(total_count=1000, probs=probs)n = dices.sample()HEAD = 1TAIL = 0l = 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_evenfinal_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]
查看完整描述

1 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

您正在计算错误分布的方差。我们正在寻找的方差适用于你反复掷骰子的实验,每次计算正面的数量,并计算正面数量的方差。您正在代码中执行此操作,但是您正在对所有掷骰子的正面总数求和,然后为每个可能的骰子结果计算这些总和的方差。


这将给出正确的结果。我添加了一些评论,希望能澄清它:


import tensorflow as tf

import tensorflow_probability as tfp

import numpy as np


tf.enable_eager_execution()


# Simulate the outcome of 1000 dice rolls

probs = [1/6.] * 6

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

n = dices.sample()

l = list(n.numpy().astype(int))


L = []

# Loop over 6 possible dice outcomes

for 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


查看完整回答
反对 回复 2021-11-02
  • 1 回答
  • 0 关注
  • 224 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信