首页 > 代码库 > Bootstrap 自助法

Bootstrap 自助法

一、简介

Bootstrap是一个很通用的算法,用来估计标准误差、置信区间和偏差。由Bradley Efron于1979年提出,用于计算任意估计的标准误差。术语“Bootstrap”来自短语“to pull oneself up by one’s bootstraps” (源自西方神话故事“TheAdventures of Baron Munchausen”,男爵掉到了深湖底,没有工具,所以他想到了拎着鞋带将自己提起来)。

在统计学中,自助法(BootstrapMethod,Bootstrapping或自助抽样法)可以指任何一种有放回的均匀抽样,也就是说,每当选中一个样本,它等可能地被再次选中并被再次添加到训练集中。自助法能对采样估计的准确性(标准误差、置信区间和偏差)进行比较好的估计,它基本上能够对任何采样分布的统计量进行估计。

Bootstrap有两种形式:非参数bootstrap和参数化的bootstrap,但基本思想都是模拟。参数化的bootstrap假设总体的分布已知或总体的分布形式已知,可以由样本估计出分布参数,再从参数化的分布中进行再采样,类似于MC。非参数化的bootstrap是从样本中再抽样,而不是从分布函数中进行再抽样。

二、非参数化Bootstrap

基本思想是:假设是我们的估计量为技术分享,样本大小为N,从样本中有放回的再抽样N个样本,原来每一个样本被抽中的概率相同,均为1/N,得到新的样本我们称为Bootstrap样本,重复B次之后我们得到B个bootstrap样本集,在每一个样本集上都有对应的估计量技术分享,对于B个技术分享,我们可以计算得到标准误,置信区间,偏置等。

技术分享

三、参数化Bootstrap

和非参数化Bootstrap不同的地方在于总体分布函数的形式是已知的,需要根据样本估计参数  (参数估计),这样得到经验分布函数,从经验分布函数中再采样得到Bootstrap样本,非参数化Bootstrap是从原始样本中再抽样,得到的Bootstrap样本与原始样本有重合。

四、Matlab实例

假设我们的整体(population)来自与Bernouli分布(掷硬币),参数theta等于0.7,即投一次有0.7的概率出现1。为了考察采样点对估计的影响,我们分别采样了10和100个样本,采用了参数和非参数方法。

%%  Bootstrap demo for the MLE for a Bernoulli


close all;
clear all;


%统计量或估计量,这里是均值
estimator = @mean;

%Bernoulli分布的参数theta
theta = 0.7;

%样本数目分别为10和100
Ns = [10 100];

for Ni=1:length(Ns)
    
    %当前的样本数
    N = Ns(Ni);
    
    %再采样次数B
    B = 2000;
    
    %参数为theta的Bernoulli分布的采样
    X = rand(1,N) < theta;
    
    %MLE参数估计
    bmle = estimator(X);
    
    %参数化Bootstrap方法对应的B次再采样的统计量
    mleBoot = zeros(1,B);
    %非参数化Bootstrap方法对应的B次再采样的统计量
    mleBootNP=zeros(1,B); 
    
    for b=1:B
        
        %参数化Bootstrap对应的分布函数就是Bernoulli分布,其参数为Mle估计的参数,参数化Bootstrap再采样得到样本
        Xb = rand(1,N) < bmle;
        
        %对再采样的Bootstrap样本求统计量
        mleBoot(b) = estimator(Xb);
        
        
        %非参数化Bootstrap方法再采样,从原来的样本中再采样
        ndx = unidrnd(N,1,N);
        Xnonparam = X(ndx);
        
        %求统计量
        mleBootNP(b) = estimator(Xnonparam);
    end
    
    
    %% 绘图
    
    %参数化Bootstrap绘图
    figure;
    hist(mleBoot)
    set(gca,'xlim',[0 1]);
    
    %标准误
    se=std(mleBoot)/sqrt(B);
    ttl = sprintf('Boot: true = %3.2f, n=%d, mle = %3.2f, se = %5.3f\n', ...
        theta, N,mean(mleBoot), se);
    title(ttl);
   
    
    %非参数化Bootstrap绘图
    
    figure;
    hist(mleBootNP)
    set(gca,'xlim',[0 1])
    nonParaSe=std(mleBootNP)/sqrt(B);
    ttl = sprintf('NP boot: true = %3.2f, n=%d, mle = %3.2f, se = %5.3f\n', theta, N, mean(mleBootNP),nonParaSe);
    title(ttl);   
end


对于参数化Bootstrap方法,假设我们已知总体是Bernouli分布,,先从样本中做MLE估计,得出参数theta,这样我们就可以从分布函数中直接抽样,而不是像非参数Bootstrap一样从样本中再采样。


to be continued....





Bootstrap 自助法