热线电话:13121318867

登录
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个接近050个接近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
2
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子