2018-11-29
阅读量:
818
关于bootstrap的思考
假设我们有一个含有 n 个数据点的样本, 并且这些点是按照某种(我们不知道的)概率分
布生成的:
data = get_sample(num_points=n)
如果样品中所有的数据都非常接近 100,
则实际的中位数很可能也非常接近 100。 如果样本中一半左右的数据接近 0,而另一半则
接近 200,那么我们就很难确信中位数到底接近多少。
如果我们能够不断获得新的样本, 那么就可以计算出每个新样本的中位数,并观察这些中
位数的分布情况。但是,一般这是不现实的。相反, 我们可以利用 Bootstrap 来获得新的数
据集,即选择 n 个数据点并用原来的数据将其替换,然后计算合成的数据集的中位数:
def bootstrap_sample(data):
"""randomly samples len(data) elements with replacement"""
return [random.choice(data) for _ in data]
def bootstrap_statistic(data, stats_fn, num_samples):
"""evaluates stats_fn on num_samples bootstrap samples from data"""
return [stats_fn(bootstrap_sample(data))
for _ in range(num_samples)]
例如,考虑下列两个数据集:
# 101个点都非常接近100
close_to_100 = [99.5 + random.random() for _ in range(101)]
多重回归分析 | 169
# 101个点钟,50个接近0,50个接近200
far_from_100 = ([99.5 + random.random()] +
[random.random() for _ in range(50)] +
[200 + random.random() for _ in range(50)])
如果你计算每个数据集的中位数,会发现它们都非常接近 100。然而,如果你考察下面的
语句:
bootstrap_statistic(close_to_100, median, 100)
大部分情况下你看到的数字确实非常接近 100。然而,如果你考察下面的语句:
bootstrap_statistic(far_from_100, median, 100)
你会发现,不仅有许多数字接近 0,而且还有许多数字接近 200。
第一组中位数的 standard_deviation 接近 0,而第二组中位数的 standard_deviation 接近
100。(这种极端的情况通过人工检查数据很容易弄清楚,但一般情况下都不是真的。)
0.0000
0
2
关注作者
收藏
评论(0)
发表评论
暂无数据
推荐帖子
0条评论
0条评论
1条评论