不管怎样,机器学习都是关于不确定性的。在监督学习中,我们希望在给定已知事物(特征)的情况下预测未知事物(目标)。根据我们的目标,我们可能会尝试预测目标的最可能值。或者我们可以预测与目标的预期距离最小的值。有时我们不仅希望预测特定值,而且希望量化我们的不确定性。例如,给定一些描述患者的特征,我们可能想知道有多大可能他们将在明年心脏病发作。在无监督学习中,我们经常关心不确定性。要确定一组测量值是否异常,了解一个人在感兴趣的总体中观察值的可能性有多大是有帮助的。此外,在强化学习中,我们希望开发能够在各种环境中智能行动的智能体。这需要推理环境可能会如何变化,以及人们可能期望在响应每个可用操作时遇到什么奖励。
概率是与不确定性推理有关的数学领域。给定某个过程的概率模型,我们可以推断各种事件的可能性。使用概率来描述可重复事件(如抛硬币)的频率是相当没有争议的。事实上,频率论学者坚持只适用于此类可重复事件的概率解释。相比之下,贝叶斯学者更广泛地使用概率语言来形式化我们在不确定性下的推理。贝叶斯概率具有两个独特的特征:(i) 将置信度分配给不可重复的事件,例如,概率是 多少月亮是奶酪做的?(ii) 主观性——虽然贝叶斯概率为人们应该如何根据新证据更新他们的信念提供了明确的规则,但它允许不同的个体以不同的先验信念开始。 统计数据帮助我们向后推理,从收集和组织数据开始,然后退回到我们可能对生成数据的过程得出的推论。每当我们分析数据集,寻找我们希望可以表征更广泛人群的模式时,我们都在运用统计思维。大多数课程、专业、论文、职业、部门、公司和机构都致力于研究概率和统计。虽然本节仅涉及表面,但我们将为您提供开始构建模型所需的基础。
%matplotlib inline
import random
import torch
from torch.distributions.multinomial import Multinomial
from d2l import torch as d2l
%matplotlib inline
import random
import tensorflow as tf
from tensorflow_probability import distributions as tfd
from d2l import tensorflow as d2l
2.6.1. 一个简单的例子:抛硬币
想象一下,我们计划抛硬币并想要量化我们看到正面(与反面)的可能性有多大。如果硬币是公平的,那么两种结果(正面和反面)的可能性都相同。此外,如果我们打算抛硬币n次,那么我们期望看到的正面部分应该与预期的反面部分完全匹配。一种直观的方式是通过对称性来看待这一点:对于每一个可能的结果nh 头和nt=(n−nh)尾巴,有一个同样可能的结果nt头和nh尾巴。请注意,这只有在我们平均期望看到的情况下才有可能1/2抛出头和1/2出现尾巴。当然,如果你多次进行这个实验n=1000000抛掷每一个,你可能永远看不到试验在哪里nh=nt确切地。
形式上,数量1/2被称为概率,在这里它捕捉到任何给定的抛掷都会出现正面的确定性。概率在之间分配分数0和1到感兴趣的结果,称为事件。这里感兴趣的事件是 heads我们表示相应的概率 P(heads). 的概率1表示绝对确定性(想象一个双面都是正面的骗局硬币)和概率0表示不可能(例如,如果两边都是反面)。频率nh/n和nt/n不是概率而是统计。概率是 数据生成过程的理论量。在这里,概率1/2是硬币本身的属性。相比之下,统计数据是作为观察数据的函数计算的经验量。我们对概率和统计量的兴趣密不可分。我们经常设计称为估计器的特殊统计数据,在给定数据集的情况下,它会产生 模型参数(如概率)的估计值。此外,当这些估计量满足称为一致性的良好属性时,我们的估计将收敛到相应的概率。反过来,这些推断的概率说明了我们将来可能遇到的来自同一人群的数据的可能统计特性。
假设我们偶然发现了一枚真实的硬币,但我们并不知道它的真实价值P(heads). 要用统计方法调查这个数量,我们需要(i)收集一些数据;(ii) 设计一个估算器。这里的数据采集很容易;我们可以多次抛硬币并记录所有结果。形式上,从一些底层随机过程中绘制实现称为采样。正如您可能已经猜到的那样,一种自然的估计量是观察到的正面朝上数与抛掷总次数之间的分数。
现在,假设硬币实际上是公平的,即 P(heads)=0.5. 为了模拟公平硬币的抛掷,我们可以调用任何随机数生成器。以概率抽取事件样本的一些简单方法0.5. 例如 Python random.random
在区间内产生数字[0,1]其中躺在任何子区间的概率[a,b]⊂[0,1]等于b−a. 因此我们可以通过0
测试返回的1
浮点数0.5
是否大于0.5
num_tosses = 100
heads = sum([random.random() > 0.5 for _ in range(100)])
tails = num_tosses - heads
print("heads, tails: ", [heads, tails])
heads, tails: [48, 52]
num_tosses = 100
heads = sum([random
评论
查看更多