动手学深度学习(pytorch)学习记录5-基本概率论[学习记录]

注:本代码在jupyter notebook上运行
封面图片来源

基本概率论

给自己的注:在Python中,%matplotlib inline 是一个IPython魔术命令(magic command),主要用于Jupyter Notebook或IPython环境中,用于控制matplotlib绘图的显示方式。当你在Jupyter Notebook中运行这个命令时,它会使得matplotlib生成的图表直接嵌入到Notebook的输出中,而不是在新的窗口中打开。

python 复制代码
%matplotlib inline
import torch
from torch.distributions import multinomial
# from d2l import torch as d2l

在统计学中,我们把从概率分布中抽取样本的过程称为抽样(sampling)。 笼统来说,可以把分布(distribution)看作对事件的概率分配, 稍后我们将给出的更正式定义。 将概率分配给一些离散选择的分布称为多项分布(multinomial distribution)。

为了抽取一个样本,即掷骰子,我们只需传入一个概率向量。 输出是另一个相同长度的向量:它在索引处的值是采样结果中出现的次数。

python 复制代码
fair_probs = torch.ones([6]) / 6
print(fair_probs)
python 复制代码
fair_probs = torch.ones([6]) / 6 # 传入的概率向量,每个元素都是0.1667
multinomial.Multinomial(1, fair_probs).sample()
# 骰子每一个面的概率都是0.1667,从中取一个
# 每个面都有可能被抽到,重复执行代码,1出现的位置会有变化

在估计一个骰子的公平性时,我们希望从同一分布中生成多个样本。 如果用Python的for循环来完成这个任务,速度会慢得惊人。 因此我们使用深度学习框架的函数同时抽取多个样本,得到我们想要的任意形状的独立样本数组。

python 复制代码
# 一次抽取10个样本
multinomial.Multinomial(10, fair_probs).sample()

现在我们知道如何对骰子进行采样,我们可以模拟1000次投掷。 然后统计1000次投掷后,每个数字被投中了多少次,计算相对频率,以作为真实概率的估计。

python 复制代码
# 将结果存储为32位浮点数以进行除法
counts = multinomial.Multinomial(1000, fair_probs).sample()
counts / 1000  # 相对频率作为估计值

因为我们是从一个公平的骰子中生成的数据,我们知道每个结果都有真实的概率, 大约是1667,所以上面输出的估计值看起来不错。

我们也可以看到这些概率如何随着时间的推移收敛到真实概率。 让我们进行500组实验,每组抽取10个样本。

python 复制代码
counts = multinomial.Multinomial(10, fair_probs).sample((500,)) # 500组实验,每组抽取10个样本
cum_counts = counts.cumsum(dim=0) # 逐行累计求和,得到每个面的累积计数 
estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True)# 每个实验的独立概率估计

from matplotlib import pyplot as plt

plt.figure(figsize=(6, 4.5)) # 设置图形窗口大小
# d2l.set_figsize((6, 4.5))
for i in range(6):
    plt.plot(estimates[:, i].numpy(),
                 label=("P(die=" + str(i + 1) + ")"))# 设置每条线的标签
plt.axhline(y=0.167, color='black', linestyle='dashed') # 设置一条y = 0.167的虚线
plt.gca().set_xlabel('Groups of experiments') # x坐标名称
plt.gca().set_ylabel('Estimated probability') # y坐标名称
plt.legend(); # 添加图例


本人学习地址https://zh-v2.d2l.ai/

恳请大佬批评指正。

相关推荐
历程里程碑16 分钟前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
weixin_3954489117 分钟前
mult_yolov5_post_copy.c_cursor_0205
c语言·python·yolo
User_芊芊君子22 分钟前
CANN数学计算基石ops-math深度解析:高性能科学计算与AI模型加速的核心引擎
人工智能·深度学习·神经网络·ai
执风挽^33 分钟前
Python基础编程题2
开发语言·python·算法·visual studio code
●VON43 分钟前
CANN推理引擎:从云端到边缘的极致加速与部署实战
学习·react native
笔画人生1 小时前
深度解析 CANN 项目:以 `ops-transformer` 为例探索高性能 AI 算子库
学习·开源
纤纡.1 小时前
PyTorch 入门精讲:从框架选择到 MNIST 手写数字识别实战
人工智能·pytorch·python
kjkdd1 小时前
6.1 核心组件(Agent)
python·ai·语言模型·langchain·ai编程
小镇敲码人1 小时前
剖析CANN框架中Samples仓库:从示例到实战的AI开发指南
c++·人工智能·python·华为·acl·cann
萧鼎1 小时前
Python 包管理的“超音速”革命:全面上手 uv 工具链
开发语言·python·uv