22.10. 统计学
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 SageMaker Studio Lab 中打开 Notebook

毫无疑问,要成为一名顶级的深度学习从业者,训练最先进、高精度模型的能力至关重要。然而,我们通常不清楚模型性能的改进是显著的,还是仅仅是训练过程中随机波动的结果。为了能够讨论估计值的不确定性,我们必须学习一些统计学知识。

最早提到*统计学*可以追溯到公元\(9^{\textrm{th}}\)世纪的阿拉伯学者Al-Kindi,他详细描述了如何使用统计学和频率分析来破译加密信息。800年后,现代统计学于18世纪在德国兴起,当时的研究人员专注于人口和经济数据的收集和分析。如今,统计学是一门涉及数据收集、处理、分析、解释和可视化的科学学科。此外,统计学的核心理论已广泛应用于学术界、工业界和政府的研究中。

更具体地说,统计学可以分为*描述性统计*和*统计推断*。前者侧重于总结和说明一组观测数据(称为*样本*)的特征。样本是从*总体*中抽取的,总体表示我们实验感兴趣的所有相似个体、项目或事件的总集合。与描述性统计相反,*统计推断*基于样本分布可以在某种程度上复制总体分布的假设,从给定的*样本*中进一步推断总体的特征。

你可能会想:“机器学习和统计学之间有什么本质区别?”从根本上说,统计学侧重于推断问题。这类问题包括对变量之间的关系进行建模(如因果推断),以及测试模型参数的统计显著性(如A/B测试)。相比之下,机器学习强调的是做出准确的预测,而无需显式编程和理解每个参数的功能。

在本节中,我们将介绍三种类型的统计推断方法:评估和比较估计量、进行假设检验和构建置信区间。这些方法可以帮助我们推断给定总体的特征,即真实参数\(\theta\)。为简洁起见,我们假设给定总体的真实参数\(\theta\)是一个标量值。将其扩展到\(\theta\)是向量或张量的情况是直接的,因此我们在讨论中省略了它。

22.10.1. 评估和比较估计量

在统计学中,*估计量*是给定样本的函数,用于估计真实参数\(\theta\)。在观察到样本{\(x_1, x_2, \ldots, x_n\)}后,我们将\(\theta\)的估计值写为\(\hat{\theta}_n = \hat{f}(x_1, \ldots, x_n)\)

我们在 第 22.7节 中已经见过估计量的简单例子。如果你有来自伯努利随机变量的一些样本,那么该随机变量为1的概率的最大似然估计可以通过计算观察到的1的数量除以样本总数得到。类似地,一个练习要求你证明,在给定一些样本的情况下,高斯分布均值的最大似然估计由所有样本的平均值给出。这些估计量几乎永远不会给出参数的真实值,但理想情况下,对于大量样本,估计值会很接近。

举个例子,下面我们展示了一个均值为零、方差为一的高斯随机变量的真实密度,以及从该高斯分布中抽取的一组样本。我们构造了\(y\)坐标,以便每个点都可见,并且与原始密度的关系更清晰。

import torch
from d2l import torch as d2l

torch.pi = torch.acos(torch.zeros(1)) * 2  #define pi in torch

# Sample datapoints and create y coordinate
epsilon = 0.1
torch.manual_seed(8675309)
xs = torch.randn(size=(300,))

ys = torch.tensor(
    [torch.sum(torch.exp(-(xs[:i] - xs[i])**2 / (2 * epsilon**2))\
               / torch.sqrt(2*torch.pi*epsilon**2)) / len(xs)\
     for i in range(len(xs))])

# Compute true density
xd = torch.arange(torch.min(xs), torch.max(xs), 0.01)
yd = torch.exp(-xd**2/2) / torch.sqrt(2 * torch.pi)

# Plot the results
d2l.plot(xd, yd, 'x', 'density')
d2l.plt.scatter(xs, ys)
d2l.plt.axvline(x=0)
d2l.plt.axvline(x=torch.mean(xs), linestyle='--', color='purple')
d2l.plt.title(f'sample mean: {float(torch.mean(xs).item()):.2f}')
d2l.plt.show()
../_images/output_statistics_bc7dd5_3_0.svg
import random
from mxnet import np, npx
from d2l import mxnet as d2l

npx.set_np()

# Sample datapoints and create y coordinate
epsilon = 0.1
random.seed(8675309)
xs = np.random.normal(loc=0, scale=1, size=(300,))

ys = [np.sum(np.exp(-(xs[:i] - xs[i])**2 / (2 * epsilon**2))
             / np.sqrt(2*np.pi*epsilon**2)) / len(xs) for i in range(len(xs))]

# Compute true density
xd = np.arange(np.min(xs), np.max(xs), 0.01)
yd = np.exp(-xd**2/2) / np.sqrt(2 * np.pi)

# Plot the results
d2l.plot(xd, yd, 'x', 'density')
d2l.plt.scatter(xs, ys)
d2l.plt.axvline(x=0)
d2l.plt.axvline(x=np.mean(xs), linestyle='--', color='purple')
d2l.plt.title(f'sample mean: {float(np.mean(xs)):.2f}')
d2l.plt.show()
[21:50:06] ../src/storage/storage.cc:196: Using Pooled (Naive) StorageManager for CPU
../_images/output_statistics_bc7dd5_6_1.svg
import tensorflow as tf
from d2l import tensorflow as d2l

tf.pi = tf.acos(tf.zeros(1)) * 2  # define pi in TensorFlow

# Sample datapoints and create y coordinate
epsilon = 0.1
xs = tf.random.normal((300,))

ys = tf.constant(
    [(tf.reduce_sum(tf.exp(-(xs[:i] - xs[i])**2 / (2 * epsilon**2)) \
               / tf.sqrt(2*tf.pi*epsilon**2)) / tf.cast(
        tf.size(xs), dtype=tf.float32)).numpy() \
     for i in range(tf.size(xs))])

# Compute true density
xd = tf.range(tf.reduce_min(xs), tf.reduce_max(xs), 0.01)
yd = tf.exp(-xd**2/2) / tf.sqrt(2 * tf.pi)

# Plot the results
d2l.plot(xd, yd, 'x', 'density')
d2l.plt.scatter(xs, ys)
d2l.plt.axvline(x=0)
d2l.plt.axvline(x=tf.reduce_mean(xs), linestyle='--', color='purple')
d2l.plt.title(f'sample mean: {float(tf.reduce_mean(xs).numpy()):.2f}')
d2l.plt.show()
../_images/output_statistics_bc7dd5_9_0.svg

计算参数\(\hat{\theta}_n\)的估计量可以有很多种方法。在本节中,我们介绍三种评估和比较估计量的常用方法:均方误差、标准差和统计偏差。

22.10.1.1. 均方误差

也许评估估计量最简单的度量是*均方误差(MSE)*(或\(l_2\)损失)估计量,其定义为

(22.10.1)\[\textrm{MSE} (\hat{\theta}_n, \theta) = E[(\hat{\theta}_n - \theta)^2].\]

这使我们能够量化与真实值的平均平方偏差。MSE总是非负的。如果你读过第 3.1节,你会认出这是最常用的回归损失函数。作为评估估计量的度量,其值越接近零,估计量就越接近真实参数\(\theta\)

22.10.1.2. 统计偏差

MSE提供了一个自然的度量标准,但我们可以轻易地想象出多种可能导致其值变大的现象。其中两个根本上重要的因素是:由于数据集的随机性导致的估计量波动,以及由于估计过程导致的估计量系统性误差。

首先,让我们来衡量系统性误差。对于一个估计量\(\hat{\theta}_n\),*统计偏差*的数学表述可以定义为:

(22.10.2)\[\textrm{bias}(\hat{\theta}_n) = E(\hat{\theta}_n - \theta) = E(\hat{\theta}_n) - \theta.\]

注意,当\(\textrm{bias}(\hat{\theta}_n) = 0\)时,估计量\(\hat{\theta}_n\)的期望等于参数的真实值。在这种情况下,我们称\(\hat{\theta}_n\)是一个无偏估计量。通常,无偏估计量比有偏估计量更好,因为它的期望与真实参数相同。

然而,值得注意的是,有偏估计量在实践中经常被使用。在某些情况下,如果没有进一步的假设,无偏估计量可能不存在,或者难以计算。这可能看起来是估计量的一个重大缺陷,但实践中遇到的大多数估计量至少是渐近无偏的,即当可用样本数量趋于无穷大时,偏差趋于零:\(\lim_{n \rightarrow \infty} \textrm{bias}(\hat{\theta}_n) = 0\)

22.10.1.3. 方差和标准差

其次,让我们来衡量估计量中的随机性。回想一下 第 22.6节,*标准差*(或*标准误差*)被定义为方差的平方根。我们可以通过测量估计量的标准差或方差来衡量其波动程度。

(22.10.3)\[\sigma_{\hat{\theta}_n} = \sqrt{\textrm{Var} (\hat{\theta}_n )} = \sqrt{E[(\hat{\theta}_n - E(\hat{\theta}_n))^2]}.\]

(22.10.3)(22.10.1)进行比较非常重要。在这个公式中,我们不是与真实的总体值\(\theta\)进行比较,而是与\(E(\hat{\theta}_n)\)(即样本均值的期望)进行比较。因此,我们衡量的不是估计量与真实值的偏离程度,而是估计量本身的波动情况。

22.10.1.4. 偏差-方差权衡

直观上很清楚,这两个主要部分构成了均方误差。有点令人惊讶的是,我们可以证明这实际上是均方误差分解为这两个贡献加上第三个贡献。也就是说,我们可以将均方误差写成偏差的平方、方差和不可约误差之和。

(22.10.4)\[\begin{split}\begin{aligned} \textrm{MSE} (\hat{\theta}_n, \theta) &= E[(\hat{\theta}_n - \theta)^2] \\ &= E[(\hat{\theta}_n)^2] + E[\theta^2] - 2E[\hat{\theta}_n\theta] \\ &= \textrm{Var} [\hat{\theta}_n] + E[\hat{\theta}_n]^2 + \textrm{Var} [\theta] + E[\theta]^2 - 2E[\hat{\theta}_n]E[\theta] \\ &= (E[\hat{\theta}_n] - E[\theta])^2 + \textrm{Var} [\hat{\theta}_n] + \textrm{Var} [\theta] \\ &= (E[\hat{\theta}_n - \theta])^2 + \textrm{Var} [\hat{\theta}_n] + \textrm{Var} [\theta] \\ &= (\textrm{bias} [\hat{\theta}_n])^2 + \textrm{Var} (\hat{\theta}_n) + \textrm{Var} [\theta].\\ \end{aligned}\end{split}\]

我们将上述公式称为*偏差-方差权衡*。均方误差可以分为三个误差来源:高偏差误差、高方差误差和不可约误差。偏差误差常见于简单模型(如线性回归模型),它无法提取特征和输出之间的高维关系。如果一个模型存在高偏差误差,我们通常说它*欠拟合*或缺乏*灵活性*,如(第 3.6节)中所介绍。高方差通常由过于复杂的模型引起,该模型对训练数据过拟合。结果,一个*过拟合*的模型对数据的微小波动很敏感。如果一个模型存在高方差,我们通常说它*过拟合*且缺乏*泛化能力*,如(第 3.6节)中所介绍。不可约误差是由\(\theta\)本身的噪声引起的。

22.10.1.5. 在代码中评估估计量

由于估计量的标准差可以通过简单地对张量a调用a.std()来实现,我们将跳过它,而是实现统计偏差和均方误差。

# Statistical bias
def stat_bias(true_theta, est_theta):
    return(torch.mean(est_theta) - true_theta)

# Mean squared error
def mse(data, true_theta):
    return(torch.mean(torch.square(data - true_theta)))
# Statistical bias
def stat_bias(true_theta, est_theta):
    return(np.mean(est_theta) - true_theta)

# Mean squared error
def mse(data, true_theta):
    return(np.mean(np.square(data - true_theta)))
# Statistical bias
def stat_bias(true_theta, est_theta):
    return(tf.reduce_mean(est_theta) - true_theta)

# Mean squared error
def mse(data, true_theta):
    return(tf.reduce_mean(tf.square(data - true_theta)))

为了说明偏差-方差权衡的公式,让我们用\(10,000\)个样本来模拟一个正态分布\(\mathcal{N}(\theta, \sigma^2)\)。这里,我们使用\(\theta = 1\)\(\sigma = 4\)。由于估计量是给定样本的函数,这里我们使用样本的均值作为这个正态分布\(\mathcal{N}(\theta, \sigma^2)\)中真实\(\theta\)的估计量。

theta_true = 1
sigma = 4
sample_len = 10000
samples = torch.normal(theta_true, sigma, size=(sample_len, 1))
theta_est = torch.mean(samples)
theta_est
tensor(1.0170)
theta_true = 1
sigma = 4
sample_len = 10000
samples = np.random.normal(theta_true, sigma, sample_len)
theta_est = np.mean(samples)
theta_est
array(0.9503336)
theta_true = 1
sigma = 4
sample_len = 10000
samples = tf.random.normal((sample_len, 1), theta_true, sigma)
theta_est = tf.reduce_mean(samples)
theta_est
<tf.Tensor: shape=(), dtype=float32, numpy=1.007326>

让我们通过计算估计量的偏差平方和方差之和来验证这个权衡公式。首先,计算我们估计量的MSE。

mse(samples, theta_true)
tensor(16.0298)
mse(samples, theta_true)
array(15.781996)
mse(samples, theta_true)
<tf.Tensor: shape=(), dtype=float32, numpy=15.963714>

接下来,我们如下计算 \(\textrm{Var} (\hat{\theta}_n) + [\textrm{bias} (\hat{\theta}_n)]^2\)。如你所见,这两个值在数值精度上是一致的。

bias = stat_bias(theta_true, theta_est)
torch.square(samples.std(unbiased=False)) + torch.square(bias)
tensor(16.0298)
bias = stat_bias(theta_true, theta_est)
np.square(samples.std()) + np.square(bias)
array(15.781995)
bias = stat_bias(theta_true, theta_est)
tf.square(tf.math.reduce_std(samples)) + tf.square(bias)
<tf.Tensor: shape=(), dtype=float32, numpy=15.963715>

22.10.2. 进行假设检验

统计推断中最常遇到的主题是假设检验。虽然假设检验在20世纪初得到普及,但其首次使用可以追溯到18世纪的约翰·阿布斯诺特。约翰追踪了伦敦80年的出生记录,并得出结论:每年出生的男性多于女性。此后,现代显著性检验是卡尔·皮尔逊(发明了\(p\)值和皮尔逊卡方检验)、威廉·戈塞特(学生t分布之父)和罗纳德·费希尔(开创了零假设和显著性检验)的智慧结晶。

一个*假设检验*是评估某些证据是否反对关于某个总体的默认陈述的一种方式。我们将默认陈述称为*零假设*\(H_0\),我们试图使用观测数据来拒绝它。在这里,我们使用\(H_0\)作为统计显著性检验的起点。*备择假设*\(H_A\)(或\(H_1\))是与零假设相反的陈述。零假设通常以陈述形式出现,假定变量之间存在某种关系。它应该尽可能明确地反映简要信息,并且可以通过统计理论进行检验。

想象你是一名化学家。在实验室花费了数千小时后,你研发出一种新药,可以显著提高一个人理解数学的能力。为了展示其神奇的力量,你需要对它进行测试。很自然地,你可能需要一些志愿者来服用这种药物,看看它是否能帮助他们更好地学习数学。你该如何开始呢?

首先,你需要仔细地随机选择两组志愿者,以确保用某些指标衡量他们的数学理解能力没有差异。这两组通常被称为试验组和对照组。*试验组*(或*处理组*)是一组将体验该药物的个体,而*对照组*代表一组被用作基准的用户,即除了服用这种药物外,其他环境设置完全相同。这样,除了处理中的自变量影响外,所有其他变量的影响都被最小化了。

其次,在服用药物一段时间后,你需要用相同的指标来衡量这两组的数学理解能力,比如让志愿者在学习一个新的数学公式后做同样的测试。然后,你可以收集他们的表现并比较结果。在这种情况下,我们的零假设是两组之间没有差异,而我们的备择假设是有差异。

这仍然不够正式。你必须仔细考虑许多细节。例如,测试他们数学理解能力的合适指标是什么?你的测试需要多少名志愿者才能让你有信心地宣称你的药物有效?你应该进行多长时间的测试?你如何决定两组之间是否存在差异?你只关心平均表现,还是也关心分数的变异范围?等等。

这样,假设检验为实验设计和对观测结果确定性的推理提供了一个框架。如果我们现在能证明零假设极不可能为真,我们就可以有信心地拒绝它。

为了完整地讲述如何进行假设检验,我们现在需要介绍一些额外的术语,并使我们上面的一些概念正式化。

22.10.2.1. 统计显著性

统计显著性*衡量的是在零假设\(H_0\)本不应被拒绝时,错误地拒绝它的概率,即

(22.10.5)\[\textrm{统计显著性 }= 1 - \alpha = 1 - P(\textrm{拒绝 } H_0 \mid H_0 \textrm{ 为真} ).\]

它也被称为*第一类错误*或*假阳性*。\(\alpha\)被称为*显著性水平*,其常用值为\(5\%\),即\(1-\alpha = 95\%\)。显著性水平可以解释为当我们拒绝一个真实的零假设时,我们愿意承担的风险水平。

图 22.10.1 显示了在双样本假设检验中,给定正态分布的观测值和概率。如果观测数据样本位于 \(95\%\) 阈值之外,那么在零假设下,这将是一个非常不可能的观测结果。因此,零假设可能存在问题,我们将拒绝它。

../_images/statistical-significance.svg

图 22.10.1 统计显著性。

22.10.2.2. 统计功效

统计功效*(或*灵敏度*)衡量的是在零假设\(H_0\)应该被拒绝时,拒绝它的概率,即:

(22.10.6)\[\textrm{统计功效 }= 1 - \beta = 1 - P(\textrm{ 未能拒绝 } H_0 \mid H_0 \textrm{ 为假} ).\]

回想一下,*第一类错误*是在零假设为真时拒绝它所造成的错误,而*第二类错误*是在零假设为假时未能拒绝它所造成的错误。第二类错误通常用\(\beta\)表示,因此相应的统计功效为\(1-\beta\)

直观地说,统计功效可以解释为我们的检验在期望的统计显著性水平上,检测到某种最小幅度的真实差异的可能性有多大。\(80\%\)是常用的统计功效阈值。统计功效越高,我们检测到真实差异的可能性就越大。

统计功效最常见的用途之一是确定所需的样本数量。你拒绝零假设(当它为假时)的概率取决于它为假的程度(称为*效应大小*)和你拥有的样本数量。正如你可能预期的那样,小的效应大小需要非常大量的样本才能以高概率被检测到。虽然详细推导超出了这个简短附录的范围,但举个例子,如果我们想能够拒绝一个零假设,即我们的样本来自均值为零、方差为一的高斯分布,并且我们认为我们样本的均值实际上接近于一,那么我们只需要一个大小为\(8\)的样本就可以以可接受的错误率做到这一点。然而,如果我们认为我们样本总体的真实均值接近\(0.01\),那么我们需要一个接近\(80000\)的样本量来检测这种差异。

我们可以把功效想象成一个滤水器。在这个类比中,一个高功效的假设检验就像一个高质量的水过滤系统,它会尽可能多地减少水中的有害物质。另一方面,一个较小的差异就像一个低质量的滤水器,一些相对较小的物质可能很容易从缝隙中逃脱。同样,如果统计功效不够高,那么检验可能无法捕捉到较小的差异。

22.10.2.3. 检验统计量

检验统计量 \(T(x)\) 是一个总结样本数据某些特征的标量。定义这样一个统计量的目标是,它应该能让我们区分不同的分布并进行假设检验。回想一下我们化学家的例子,如果我们希望证明一个群体的表现优于另一个群体,那么将均值作为检验统计量是合理的。不同检验统计量的选择可能导致统计检验具有截然不同的统计功效。

通常情况下,\(T(X)\)(在我们的零假设下检验统计量的分布)在考虑零假设时,会(至少近似地)遵循一个常见的概率分布,例如正态分布。如果我们能够明确地推导出这样一个分布,然后在我们的数据集上测量我们的检验统计量,如果我们的统计量远远超出了我们预期的范围,我们就可以安全地拒绝零假设。将此量化引出了\(p\)值的概念。

22.10.2.4. \(p\)-值

p*值(或*概率值*)是在零假设为*真*的情况下,\(T(X)\)至少与观测到的检验统计量\(T(x)\)一样极端的概率,即:

(22.10.7)\[p\textrm{-值} = P_{H_0}(T(X) \geq T(x)).\]

如果\(p\)值小于或等于预先定义并固定的统计显著性水平\(\alpha\),我们可以拒绝零假设。否则,我们将得出结论,我们缺乏证据来拒绝零假设。对于给定的总体分布,*拒绝域*将是包含所有\(p\)值小于统计显著性水平\(\alpha\)的点的区间。

22.10.2.5. 单边检验和双边检验

通常有两种显著性检验:单边检验和双边检验。*单边检验*(或*单尾检验*)适用于零假设和备择假设只有一个方向的情况。例如,零假设可能陈述真实参数\(\theta\)小于或等于一个值\(c\)。备择假设将是\(\theta\)大于\(c\)。也就是说,拒绝域仅在抽样分布的一侧。与单边检验相反,*双边检验*(或*双尾检验*)适用于拒绝域在抽样分布两侧的情况。这种情况下的一个例子可能有一个零假设,陈述真实参数\(\theta\)等于一个值\(c\)。备择假设将是\(\theta\)不等于\(c\)

22.10.2.6. 假设检验的一般步骤

熟悉了以上概念后,让我们来了解一下假设检验的一般步骤。

  1. 陈述问题并建立一个零假设\(H_0\)

  2. 设定统计显著性水平 \(\alpha\) 和统计功效 (\(1 - \beta\))。

  3. 通过实验获取样本。所需样本数量将取决于统计功效和预期的效应大小。

  4. 计算检验统计量和\(p\)值。

  5. 根据\(p\)值和统计显著性水平\(\alpha\),决定保留或拒绝零假设。

要进行假设检验,我们首先要定义一个零假设和一个我们愿意承担的风险水平。然后我们计算样本的检验统计量,将检验统计量的极值作为反对零假设的证据。如果检验统计量落在拒绝域内,我们就可以拒绝零假设,支持备择假设。

假设检验适用于各种场景,如临床试验和A/B测试。

22.10.3. 构建置信区间

当估计参数\(\theta\)的值时,像\(\hat \theta\)这样的点估计量的用处有限,因为它们不包含不确定性的概念。相反,如果我们能产生一个很大概率包含真实参数\(\theta\)的区间,那会好得多。如果你在一个世纪前对这类想法感兴趣,那么你一定会兴奋地阅读由耶日·奈曼(Jerzy Neyman)撰写的“基于经典概率论的统计估计理论纲要”(Neyman, 1937),他于1937年首次引入了置信区间的概念。

为了有用,置信区间在给定的确定性程度上应该尽可能小。让我们看看如何推导它。

22.10.3.1. 定义

数学上,真实参数 \(\theta\) 的*置信区间*是一个根据样本数据计算出的区间 \(C_n\),使得

(22.10.8)\[P_{\theta} (C_n \ni \theta) \geq 1 - \alpha, \forall \theta.\]

这里\(\alpha \in (0, 1)\),而\(1 - \alpha\)被称为区间的*置信水平*或*覆盖率*。这与我们上面讨论的显著性水平\(\alpha\)是同一个。

注意,(22.10.8)是关于变量\(C_n\)的,而不是关于固定的\(\theta\)。为了强调这一点,我们写成\(P_{\theta} (C_n \ni \theta)\)而不是\(P_{\theta} (\theta \in C_n)\)

22.10.3.2. 解释

将一个\(95\%\)的置信区间解释为你有\(95\%\)的把握确定真实参数位于其中的区间,这是非常诱人的,但遗憾的是这是不正确的。真实参数是固定的,而区间是随机的。因此,一个更好的解释是,如果你通过这个过程生成大量的置信区间,那么\(95\%\)的生成区间会包含真实参数。

这可能看起来有些迂腐,但它对结果的解释可能产生实际影响。特别是,我们可以通过构造我们*几乎确定*不包含真实值的区间来满足(22.10.8),只要我们这样做得足够少。我们以提供三个诱人但错误的陈述来结束本节。对这些要点的深入讨论可以在Morey等人(2016中找到。

  • 谬误 1. 狭窄的置信区间意味着我们可以精确地估计参数。

  • 谬误2。置信区间内的值比区间外的值更有可能是真实值。

  • 谬误 3. 一个特定观察到的\(95\%\)置信区间包含真实值的概率是\(95\%\)

可以说,置信区间是微妙的对象。然而,如果你保持清晰的解释,它们可以是强大的工具。

22.10.3.3. 一个高斯例子

让我们讨论最经典的例子,即未知均值和方差的高斯分布均值的置信区间。假设我们从高斯分布\(\mathcal{N}(\mu, \sigma^2)\)中收集了\(n\)个样本\(\{x_i\}_{i=1}^n\)。我们可以通过以下方式计算均值和方差的估计量:

(22.10.9)\[\hat\mu_n = \frac{1}{n}\sum_{i=1}^n x_i \;\textrm{和}\; \hat\sigma^2_n = \frac{1}{n-1}\sum_{i=1}^n (x_i - \hat\mu)^2.\]

如果我们现在考虑随机变量

(22.10.10)\[T = \frac{\hat\mu_n - \mu}{\hat\sigma_n/\sqrt{n}},\]

我们得到一个遵循著名分布的随机变量,称为*自由度为*\(n-1\)*的学生t分布*。

这个分布被研究得非常透彻,并且我们知道,例如,当\(n\rightarrow \infty\)时,它近似于一个标准高斯分布,因此通过查阅高斯累积分布函数(c.d.f.)表,我们可以得出结论,\(T\)的值至少有\(95\%\)的时间在区间\([-1.96, 1.96]\)内。对于有限的\(n\)值,这个区间需要稍微大一些,但这些值是众所周知的,并且在表格中预先计算好了。

因此,我们可以得出结论,对于大的\(n\)

(22.10.11)\[P\left(\frac{\hat\mu_n - \mu}{\hat\sigma_n/\sqrt{n}} \in [-1.96, 1.96]\right) \ge 0.95.\]

通过两边同时乘以\(\hat\sigma_n/\sqrt{n}\),然后再加\(\hat\mu_n\),我们得到:

(22.10.12)\[P\left(\mu \in \left[\hat\mu_n - 1.96\frac{\hat\sigma_n}{\sqrt{n}}, \hat\mu_n + 1.96\frac{\hat\sigma_n}{\sqrt{n}}\right]\right) \ge 0.95.\]

因此我们知道我们已经找到了我们的 \(95\%\) 置信区间

(22.10.13)\[\left[\hat\mu_n - 1.96\frac{\hat\sigma_n}{\sqrt{n}}, \hat\mu_n + 1.96\frac{\hat\sigma_n}{\sqrt{n}}\right].\]

可以说(22.10.13)是统计学中最常用的公式之一。让我们通过实现它来结束对统计学的讨论。为简单起见,我们假设我们处于渐近状态。对于较小的\(N\)值,应包括通过编程或从\(t\)表中获得的正确的t_star值。

# PyTorch uses Bessel's correction by default, which means the use of ddof=1
# instead of default ddof=0 in numpy. We can use unbiased=False to imitate
# ddof=0.

# Number of samples
N = 1000

# Sample dataset
samples = torch.normal(0, 1, size=(N,))

# Lookup Students's t-distribution c.d.f.
t_star = 1.96

# Construct interval
mu_hat = torch.mean(samples)
sigma_hat = samples.std(unbiased=True)
(mu_hat - t_star*sigma_hat/torch.sqrt(torch.tensor(N, dtype=torch.float32)),\
 mu_hat + t_star*sigma_hat/torch.sqrt(torch.tensor(N, dtype=torch.float32)))
(tensor(-0.0568), tensor(0.0704))
# Number of samples
N = 1000

# Sample dataset
samples = np.random.normal(loc=0, scale=1, size=(N,))

# Lookup Students's t-distribution c.d.f.
t_star = 1.96

# Construct interval
mu_hat = np.mean(samples)
sigma_hat = samples.std(ddof=1)
(mu_hat - t_star*sigma_hat/np.sqrt(N), mu_hat + t_star*sigma_hat/np.sqrt(N))
(array(-0.07853346), array(0.04412608))
# Number of samples
N = 1000

# Sample dataset
samples = tf.random.normal((N,), 0, 1)

# Lookup Students's t-distribution c.d.f.
t_star = 1.96

# Construct interval
mu_hat = tf.reduce_mean(samples)
sigma_hat = tf.math.reduce_std(samples)
(mu_hat - t_star*sigma_hat/tf.sqrt(tf.constant(N, dtype=tf.float32)), \
 mu_hat + t_star*sigma_hat/tf.sqrt(tf.constant(N, dtype=tf.float32)))
(<tf.Tensor: shape=(), dtype=float32, numpy=-0.029904943>,
 <tf.Tensor: shape=(), dtype=float32, numpy=0.09493986>)

22.10.4. 总结

  • 统计学侧重于推断问题,而深度学习则强调在不进行显式编程和理解的情况下做出准确的预测。

  • 有三种常见的统计推断方法:评估和比较估计量、进行假设检验以及构建置信区间。

  • 有三种最常见的估计量:统计偏差、标准差和均方误差。

  • 置信区间是我们根据给定样本构建的真实总体参数的估计范围。

  • 假设检验是评估某些证据是否与关于总体的默认陈述相悖的一种方法。

22.10.5. 练习

  1. \(X_1, X_2, \ldots, X_n \overset{\textrm{iid}}{\sim} \textrm{Unif}(0, \theta)\),其中“iid”代表*独立同分布*。考虑以下\(\theta\)的估计量

    (22.10.14)\[\hat{\theta} = \max \{X_1, X_2, \ldots, X_n \};\]
    (22.10.15)\[\tilde{\theta} = 2 \bar{X_n} = \frac{2}{n} \sum_{i=1}^n X_i.\]
    • \(\hat{\theta}\)的统计偏差、标准差和均方误差。

    • \(\tilde{\theta}\)的统计偏差、标准差和均方误差。

    • 哪个估计量更好?

  2. 对于我们在引言中提到的化学家例子,你能否推导出进行双边假设检验的5个步骤?给定统计显著性水平\(\alpha = 0.05\)和统计功效\(1 - \beta = 0.8\)

  3. \(100\)个独立生成的数据集,使用\(N=2\)\(\alpha = 0.5\)运行置信区间代码,并绘制生成的区间(在这种情况下t_star = 1.0)。你会看到几个非常短的区间,它们距离包含真实均值\(0\)很远。这是否与置信区间的解释相矛盾?你是否愿意使用短区间来表示高精度的估计?