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

function [out] = bootstrap(data,B)
%
%   Bootstrap method -produce B dataSet
%
%   Inputs:
%       data:origianl data set whose size is [M,N],which means feature Dimens is M and the original dataset contains N samples  
%       B:number of dataSet 
%    Outputs:
%       out:B bootstrap resamples of the input data  whose size is [M,N,B]

[M,N]=size(data);

% by default B=N;
if (exist('B')~=1), B=N;  end;

out=zeros(M,N,B);
index=unidrnd(N,N,B);
out=reshape(data(:,index),M,N,B);

end


對於參數化Bootstrap方法,假設我們已知總體是Bernouli分佈,先從樣本中做MLE估計,得出參數theta,這樣我們就可以從分佈函數中直接抽樣,而不是像非參數Bootstrap一樣從樣本中再採樣。


to be continued....





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章