贝叶斯自举法Bayesian Bootstrap
“自举”(翻译自bootstrap)这个词汇在多个领域可能见到,它字面意思是提着靴子上的带子把自己提起来,这当然是不可能的,在机器学习领域可以理解为原样本自身的数据再抽样得出新的样本及统计量,也有被翻译为自助法的。
Bayesian Bootstrap是一个强大的方法,它比其他的自举法更快,并且可以给出更紧密的置信区间,并避免许多极端情况。在本文中我们将详细地探讨这个简单但功能强大的过程。
自举
自举是通过对数据进行随机重采样和替换来计算估计量属性的过程,它首先由Efron(1979)提出。这个过程非常简单,包括以下步骤:
假设一个 i.i.d. 样本{Xᵢ}ᵢⁿ,并且我们想用估计量θ̂(X)计算一个统计θ。可以近似θ̂的分布如下:
- 从样本{Xᵢ}ᵢⁿ中替换{X̃ᵢ}ᵢⁿ的n个观察样本。
- 计算估计量θ̂-bootstrap(X̃)。
- 大量重复步骤1和步骤2。
这样θ̂-bootstrap的分布很好地逼近了θ̂的分布。
为什么bootstrap是有效的呢?
首先,它很容易实现。因为我们只要重复做一件事情:估算θ,并且重复多次就可以了。这其实也是自举的一个主要缺点:如果评估过程很慢,那么自举法的计算成本就会变得很高。
第二,自举不做分布假设。它只假设你的样本是总体的代表,观察结果是相互独立的。当观察结果彼此紧密联系时,比如在研究社交网络或市场互动时,可能会违反此假设。
bootstrap仅仅是加权吗?
当我们重新抽样时,我们所做的其实就是给我们的观察值分配整数权重,这样它们的和就等于样本容量n。这样的分布就是多项式分布。
我们绘制大小为10.000的样本来看看多项式分布是什么样子的。从src.utils导入一些函数。
from src.utils import *
N = 10_000
np.random.seed(1)
bootstrap_weights = np.random.multinomial(N, np.ones(N)/N)
np.sum(bootstrap_weights)
#结果:10000
首先,我们确认权重之和是否确实等于1000,或者说,我们重采样生成了的是一个相同大小的数据。
我们现在可以画出权重的分布。
sns.countplot(bootstrap_weights, color='C0').set(title='Bootstrap Weights');
正如我们所看到的,大约3600次观察得到的权重为零,而一些观察得到的权重为6。或者说大约3600个观察结果没有被重新采样,而一些观察结果被重采样多达6次。
这里可能就有一个问题:为什么不用连续权值来代替离散权值呢?
贝叶斯自举就是这个问题的答案。
完整文章:
https://avoid.overfit.cn/post/8a0dab8d9ae34bb3926966915f639163