%matplotlib inline
import torch
from torch.distributions import multinomial
from d2l import torch as d2l
fair_probs = torch.ones([6]) / 6
multinomial.Multinomial(1, fair_probs).sample()
首先,我们定义了一个长度为6的一维张量fair_probs
,其中每个元素的值都是1/6,表示每个事件发生的概率是相等的。
然后,我们使用multinomial.Multinomial(1, fair_probs)
创建了一个多项分布对象。这个对象表示了一次试验中从多项分布中抽取一个样本的过程。
最后,我们调用sample()
方法来执行一次抽样操作。这将返回一个长度为6的一维张量,其中只有一个元素的值为1,其余元素的值为0。这个样本表示了从多项分布中随机抽取的结果。
在估计一个骰子的公平性时,我们希望从同一分布中生成多个样本。 如果用Python的for循环来完成这个任务,速度会慢得惊人。 因此我们使用深度学习框架的函数同时抽取多个样本,得到我们想要的任意形状的独立样本数组
代码如下:
multinomial.Multinomial(10, fair_probs).sample()
从一个多项分布中进行10次随机抽样的过程,并返回了每个事件被抽中的次数。
以上的运行截图
现在我们知道如何对骰子进行采样,我们可以模拟1000次投掷。 然后,我们可以统计1000次投掷后,每个数字被投中了多少次。 具体来说,我们计算相对频率,以作为真实概率的估计。
# 将结果存储为32位浮点数以进行除法
counts = multinomial.Multinomial(1000, fair_probs).sample()
counts / 1000 # 相对频率作为估计值
tensor([0.1620, 0.1480, 0.1770, 0.1780, 0.1740, 0.1610])
因为我们是从一个公平的骰子中生成的数据,我们知道每个结果都有真实的概率1/6, 大约是0.167,所以上面输出的估计值看起来不错。
我们也可以看到这些概率如何随着时间的推移收敛到真实概率。 让我们进行500组实验,每组抽取10个样本。
counts = multinomial.Multinomial(10, fair_probs).sample((500,))
cum_counts = counts.cumsum(dim=0)
estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True)
d2l.set_figsize((6, 4.5))
for i in range(6):
d2l.plt.plot(estimates[:, i].numpy(),
label=("P(die=" + str(i + 1) + ")"))
d2l.plt.axhline(y=0.167, color='black', linestyle='dashed')
d2l.plt.gca().set_xlabel('Groups of experiments')
d2l.plt.gca().set_ylabel('Estimated probability')
d2l.plt.legend();
首先,我们使用multinomial.Multinomial(10, fair_probs).sample((500,))
创建了一个多项分布对象,并进行了500次抽样。这将返回一个形状为(500, 6)的张量counts
,其中每一行表示一次抽样结果,每一列表示对应事件被抽中的次数。从多项分布中随机抽取10个样本的结果,进行了500次。
接下来,我们使用cum_counts = counts.cumsum(dim=0)
计算了counts
张量的累积和。这将返回一个与counts
形状相同的张量cum_counts
,其中每个元素表示对应事件在前n次抽样中被抽中的总次数。
然后,我们使用estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True)
计算了每个事件的估计概率。这将返回一个与cum_counts
形状相同的张量estimates
,其中每个元素表示对应事件的估计概率。
接下来,我们使用d2l.set_figsize((6, 4.5))
设置了图形的尺寸。
然后,我们使用一个循环来绘制每个事件的估计概率曲线。在每次循环中,我们使用d2l.plt.plot(estimates[:, i].numpy(), label=("P(die=" + str(i + 1) + ")"))
绘制了第i个事件的估计概率曲线。
接下来,我们使用d2l.plt.axhline(y=0.167, color='black', linestyle='dashed')
绘制了一个水平虚线,表示每个事件的真实概率值0.167。
最后,我们使用d2l.plt.gca().set_xlabel('Groups of experiments')
和d2l.plt.gca().set_ylabel('Estimated probability')
设置了x轴和y轴的标签。
最后,我们使用d2l.plt.legend()
显示图例,展示每个事件的标签。
总之,这段代码计算了一个多项分布的估计概率,并使用matplotlib库将估计概率曲线进行可视化展示。