Решение проблемы броска игральных костей и бросания монет с использованием вероятности тензора, дисперсия неверна
Я не очень опытный в статистике, я пытаюсь учиться. Поэтому, пожалуйста, потерпите меня. Я видел этот вопрос в Quora - который в основном утверждает следующее -
Честная игра выпадает, если результатом является нечетное число, тогда честная монета подбрасывается 3 раза. В противном случае, если результатом будет четное число, тогда честная монета будет брошена 2 раза. В обоих случаях количество голов считается. Какая разница # голов получена?
Я хотел решить это, используя Python и TF-вероятность. Вот что я сделал -
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 (как люди упоминали в ответе Кора).
Я не могу понять, что я делаю неправильно. Как я могу исправить свою ошибку?
Любой указатель будет полезен. Заранее большое спасибо.
--------- РЕДАКТИРОВАТЬ
Чтобы дать больше данных,
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 ответ
Вы вычисляете дисперсию по неправильному распределению. Разница, которую мы ищем, относится к эксперименту, в котором вы будете бросать кубики снова и снова, каждый раз подсчитывать количество голов и вычислять дисперсию по числу головок. Вы делаете это в своем коде, но вы суммируете общее количество голов за все броски костей, а затем берете дисперсию этих сумм для каждого возможного результата игры в кости.
Это даст правильный результат. Я добавил несколько комментариев, которые, надеюсь, прояснят это:
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