一、基本概率论
导入必要的软件包
%matplotlib inline
import torch
from torch.distributions import multinomial
from d2l import torch as d2l
从概率分布中抽取样本的过程称为抽样
传入一个概率向量,即掷骰子
输出是另一个相同长度的向量:它在索引i处的值是采样结果中出现的次数
fair_probs = torch.ones([6]) / 6
multinomial.Multinomial(1, fair_probs).sample()
"""
tensor([1., 0., 0., 0., 0., 0.])
"""
使用深度学习框架的函数同时抽取多个样本,得到想要的任意形状的独立样本数组
multinomial.Multinomial(10, fair_probs).sample()
"""
tensor([2., 2., 0., 1., 3., 2.])
"""
模拟1000次投掷,统计1000次投掷后,每个数字被投中了多少次
也就是:计算相对频率,以作为真实概率的估计
# 将结果存储为32位浮点数以进行除法
counts = multinomial.Multinomial(1000, fair_probs).sample()
counts / 1000 # 相对频率作为估计值
"""
tensor([0.1660, 0.1810, 0.1730, 0.1700, 0.1620, 0.1480])
"""
从一个公平的骰子中生成的数据,每个结果都有真实的概率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()
每条实线对应于骰子的6个值中的一个,并给出骰子在每组实验后出现值的估计概率
通过更多的实验获得更多的数据时,这6条实体曲线向真实概率收敛