2.6 概率

%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库将估计概率曲线进行可视化展示。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值