AndreaDO

导航

动手学深度学习-预备知识-简单概率论

一些概率论的简单知识

1.机器学习的本质就是预测,主要采用大数定律:

本文内代码使用jupyter notebook内执行

大数定律(law of large numbers)告 诉我们:随着投掷次数的增加,这个估计值会越来越接近真实的潜在概率。

库函数

import torch
from torch.distributions import multinomial
from d2l import torch as d2l

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

将概率分配给一些离散选择的分布称为多项分布 (multinomial distribution)。 为了抽取一个样本,即掷骰子,我们只需传入一个概率向量。

输出是另一个相同长度的向量:它在索引i处的 值是采样结果中i出现的次数。

fair_probs = torch.ones([6]) / 6
multinomial.Multinomial(1, fair_probs).sample()
#tensor([0., 0., 0., 1., 0., 0.])

这段代码是在使用Python的numpy-stl库中的multinomial类来从多项分布中抽样。multinomial类用于生成从多项分布中抽样的随机样本。

multinomial.Multinomial(1, fair_probs).sample() 这段代码的含义如下:

  • 1:这是要抽取的样本数量。
  • fair_probs:这是一个列表或数组,表示多项分布的概率。这个列表或数组的长度应该和你要抽取的样本数量相同,且所有元素的总和应该为1。每个元素代表在抽取一个样本时,对应结果的概率。
  • sample():这是multinomial类的一个方法,用于生成从给定的多项分布中抽样的随机样本

 输出结果是随机抽取一次到6个中的一个,上面注释输出的结果可能每次都不同,当为1的时候表示被抽取到。

  因为使用python的循环速度太慢,使用multinomial库函数来进行多次抽取(代码为100次抽取)

multinomial.Multinomial(100, fair_probs).sample()
# tensor([15., 22., 14., 11., 22., 16.])

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

 1000次模拟的结果,接近计算出来的1/6的概率。

# 将结果存储为32位浮点数以进行除法
counts = multinomial.Multinomial(1000, fair_probs).sample()
print('# 相对频率作为估计值=',counts / 1000) # 相对频率作为估计值
print(fair_probs)
# tensor([0.1640, 0.1830, 0.1570, 0.1400, 0.1650, 0.1910])
# tensor([0.1667, 0.1667, 0.1667, 0.1667, 0.1667, 0.1667])

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

 代码的具体作用看注释

counts = multinomial.Multinomial(10, fair_probs).sample((500,))
counts.shape #torch.Size([500, 6])
cum_counts = counts.cumsum(dim=0) #把每一列的值累加起来
cum_counts.shape  #torch.Size([500, 6])
# cum_counts代表了6个数据在10次500组后的概率
print(cum_counts.sum(dim=1, keepdims=True).shape)  #torch.Size([500, 1]) 
#从第一组到第500组的样本抽样之和,第一组10,第二组20,最后一组5000
estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True)
estimates.shape   #torch.Size([500, 6])
# estimates 代表了按照组的多少逐渐变化的概率
#torch.Size([500, 1])
#torch.Size([500, 6])

#绘图
d2l.set_figsize((6, 4.5))   #该函数将绘图大小设置为 6x4.5 英寸的尺寸。
for i in range(6):
    d2l.plt.plot(estimates[:, i].numpy(), #代表了第i列全部行的数据
        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条实体曲线向真实概率收敛。

 2.概率论公理

  在处理骰子掷出时,我们将集合S = {1, 2, 3, 4, 5, 6} 称为样本空间(sample space)或结果空间(outcome space),其中每个元素都是结果(outcome)。事件(event)是一组给定样本空间的随机结果。

  例如,“看 到5”({5})和“看到奇数”({1, 3, 5})都是掷出骰子的有效事件。注意,如果一个随机实验的结果在A中,则 事件A已经发生。

  也就是说,如果投掷出3点,因为3 ∈ {1, 3, 5},我们可以说,“看到奇数”的事件发生了。

  概率(probability)可以被认为是将集合映射到真实值的函数。在给定的样本空间S中,事件A的概率,表示 为P(A),满足以下属性:

  

    

        以上也是概率论的公理,由科尔莫戈罗夫于1933年提出。有了这个公理系统,我们可以避免任何关于随机性 的哲学争论;相反,我们可以用数学语言严格地推理。例如,假设事件A1为整个样本空间,且当所有i > 1时 的Ai = ∅,那么我们可以证明P(∅) = 0,即不可能发生事件的概率是0。

3.随机变量

  在我们掷骰子的随机实验中,我们引入了随机变量(random variable)的概念。

  随机变量几乎可以是任 何数量,并且它可以在随机实验的一组可能性中取一个值。

  考虑一个随机变量X,其值在掷骰子的样本空 间S = {1, 2, 3, 4, 5, 6}中。我们可以将事件“看到一个5”表示为{X = 5}或X = 5,其概率表示为P({X = 5})或P(X = 5)。

  通过P(X = a),我们区分了随机变量X和X可以采取的值(例如a)。

  进一步简化符号:我们可以将P(X)表示为随机变量X上的分布,而以简单用P(a)表示随机变量取值a的概率。

4.处理多个随机变量

  联合概率

    联合概率(joint probability)P(A = a, B = b)。给定任意值a和b,联合概率可以回答:A = a和B = b同时满足的概率是多少?请注意,对于任何a和b的取值,P(A = a, B = b) ≤ P(A = a)。这点是确定 的,因为要同时发生A = a和B = b,A = a就必须发生,B = b也必须发生(反之亦然)。因此,A = a和B = b同 时发生的可能性不大于A = a或是B = b单独发生的可能性。

    举个例子:

假设我们有两个硬币A和B,每个硬币都有正反两面。如果单独抛掷硬币A或硬币B,它们各自正面朝上的概率都是1/2。但是,如果同时抛掷这两个硬币,它们正面朝上并且同时出现的概率是多少呢?

考虑这样的情况:如果两个硬币正面都朝上,那么我们需要考虑硬币A正面朝上并且硬币B正面朝上的情况,以及硬币A反面朝上并且硬币B正面朝上的情况。这两种情况是互斥的,也就是说,它们不会同时发生。

根据概率的乘法原则,两个事件同时发生的概率是每个事件单独发生的概率的乘积。在这个例子中,两个硬币正面都朝上的概率为(1/2) * (1/2) = 1/4。也就是说,两个硬币正面都朝上的概率是1/4。

  条件概率

  

  贝叶斯定理

  边际化

  独立性

 

5.期望和方差

 

posted on 2023-11-09 15:33  AndreaDO  阅读(141)  评论(0)    收藏  举报