Python 中的公平硬币
Fair coin in Python
我正在尝试将公平的抛硬币模拟为独立的伯努利试验,其中变量变为 1 或 0,然后在每次试验中对单独的序列取平均值。
我的问题是我得到的一个序列看起来不对并且与其他序列不同 (Seq_1)。你能看出我哪里做错了吗。
# Parameters
nSeq = 5
nTrials = 10**3
p=0.5 # Fair coin
# Containers
x = np.zeros(nTrials+1, float)
nrange = range(nTrials+1)
# Simulation
for j in range(nSeq):
Mean_list = [0] # re-initialize mean list for each sequence
for i in range(nTrials):
x[i+1] = np.random.binomial(1, p)
xbar = np.mean(x)
Mean_list.append(xbar)
plt.plot(nrange,Mean_list,label='Seq_'+str(j+1))
plt.ylabel('Estimate of p')
plt.xlabel('Trials')
plt.legend(loc=0,ncol=3,fontsize='small')
plt.show()
然后给了我这个看起来不正确的代码。收敛到 0.5 是正确的,因为硬币是公平的,但为什么 seq_1 总是与其他硬币不同?
**这是试图从下面的book
重现图表
总结
总结一下。如何在 python 中生成公平的硬币翻转(使用来自 numpy
的伯努利生成变量)然后取每次翻转产生的序列的平均值,然后使用 matplotlib
来表示图中的发现? (注意 y 轴上的 'estimate of p' 是每次翻转时序列的平均值)。
你先创建一个0数组
x = np.zeros(nTrials+1, float)
然后填写。
x[i+1] = np.random.binomial(1, p)
在下一个序列中,您的数组已经填满,您正在覆盖数据。
你必须
- 为每个序列创建一个新数组
- 对数组的模拟部分取平均值(去掉尾随的 0)
您还可以允许均值列表不从 0 开始以获得更漂亮的图表。
正在实施
import numpy as np
import matplotlib.pyplot as plt
# Parameters
nSeq = 5
nTrials = 10 ** 3
p = 0.5 # Fair coin
# Containers
nrange = range(nTrials)
# Simulation
for j in range(nSeq):
x = np.zeros(nTrials + 1, float)
Mean_list = [] # re-initialize mean list for each sequence
for i in range(nTrials):
x[i] = np.random.binomial(1, p)
xbar = np.mean(x[:i+1])
Mean_list.append(xbar)
plt.plot(nrange, Mean_list, label='Seq_' + str(j + 1))
plt.ylabel('Estimate of p')
plt.xlabel('Trials')
plt.legend(loc=0, ncol=3, fontsize='small')
plt.show()
我正在尝试将公平的抛硬币模拟为独立的伯努利试验,其中变量变为 1 或 0,然后在每次试验中对单独的序列取平均值。
我的问题是我得到的一个序列看起来不对并且与其他序列不同 (Seq_1)。你能看出我哪里做错了吗。
# Parameters
nSeq = 5
nTrials = 10**3
p=0.5 # Fair coin
# Containers
x = np.zeros(nTrials+1, float)
nrange = range(nTrials+1)
# Simulation
for j in range(nSeq):
Mean_list = [0] # re-initialize mean list for each sequence
for i in range(nTrials):
x[i+1] = np.random.binomial(1, p)
xbar = np.mean(x)
Mean_list.append(xbar)
plt.plot(nrange,Mean_list,label='Seq_'+str(j+1))
plt.ylabel('Estimate of p')
plt.xlabel('Trials')
plt.legend(loc=0,ncol=3,fontsize='small')
plt.show()
然后给了我这个看起来不正确的代码。收敛到 0.5 是正确的,因为硬币是公平的,但为什么 seq_1 总是与其他硬币不同?
**这是试图从下面的book
重现图表总结
总结一下。如何在 python 中生成公平的硬币翻转(使用来自 numpy
的伯努利生成变量)然后取每次翻转产生的序列的平均值,然后使用 matplotlib
来表示图中的发现? (注意 y 轴上的 'estimate of p' 是每次翻转时序列的平均值)。
你先创建一个0数组
x = np.zeros(nTrials+1, float)
然后填写。
x[i+1] = np.random.binomial(1, p)
在下一个序列中,您的数组已经填满,您正在覆盖数据。
你必须
- 为每个序列创建一个新数组
- 对数组的模拟部分取平均值(去掉尾随的 0)
您还可以允许均值列表不从 0 开始以获得更漂亮的图表。
正在实施
import numpy as np
import matplotlib.pyplot as plt
# Parameters
nSeq = 5
nTrials = 10 ** 3
p = 0.5 # Fair coin
# Containers
nrange = range(nTrials)
# Simulation
for j in range(nSeq):
x = np.zeros(nTrials + 1, float)
Mean_list = [] # re-initialize mean list for each sequence
for i in range(nTrials):
x[i] = np.random.binomial(1, p)
xbar = np.mean(x[:i+1])
Mean_list.append(xbar)
plt.plot(nrange, Mean_list, label='Seq_' + str(j + 1))
plt.ylabel('Estimate of p')
plt.xlabel('Trials')
plt.legend(loc=0, ncol=3, fontsize='small')
plt.show()